Настройка Spring Boot с двумя портами

Я пытаюсь настроить приложение в Spring Boot с двумя разными портами, но я еще не стал. Мое первое aproximation было с двумя контроллерами, и я определил @Bean внутри двух контроллеров с container.setPort(8080); И моя вторая аппроксимация добавила зависимость исполнительного механизма и изменила порт управления, но мое приложение не запускается. "Адрес уже используется: bind", Как я могу установить приложение с двумя портами? Я хочу один порт для администратора, а другой - для консультаций с моим api.

Ответ 1

Как уже упоминалось ранее, server.port и management.port вместе с свойствами management.context-path могут быть настроены так, чтобы встроенный контейнер мог прослушивать разные порты (связанные с управлением свойства для доступа к конечным точкам Actuator).

Для прослушивания в портах, отличных от server.port и management.port:

@Configuration
public class EmbeddedTomcatConfiguration {

    @Value("${server.additionalPorts}")
    private String additionalPorts;

    @Bean
    public EmbeddedServletContainerFactory servletContainer() {
        TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
        Connector[] additionalConnectors = this.additionalConnector();
        if (additionalConnectors != null && additionalConnectors.length > 0) {
            tomcat.addAdditionalTomcatConnectors(additionalConnectors);
        }
        return tomcat;
    }

    private Connector[] additionalConnector() {
        if (StringUtils.isBlank(this.additionalPorts)) {
            return null;
        }
        String[] ports = this.additionalPorts.split(",");
        List<Connector> result = new ArrayList<>();
        for (String port : ports) {
            Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol");
            connector.setScheme("http");
            connector.setPort(Integer.valueOf(port));
            result.add(connector);
        }
        return result.toArray(new Connector[] {});
    }
}

application.yml

server:
  port: ${appPort:8800}
  additionalPorts: 8881,8882

Application.java

@SpringBootApplication
@ComponentScan(...)
@Import(EmbeddedTomcatConfiguration.class)
public Application {

    public static void main(String[] args) {
        SpringApplication.run(Application .class, args);
    }
}

Недавно я писал об этой теме по адресу http://tech.asimio.net/2016/12/15/Configuring-Tomcat-to-Listen-on-Multiple-ports-using-Spring-Boot.html

Ответ 2

Чтобы изменить порт управления исполнительным механизмом, вы можете использовать свойство

management.port=8081

Посмотреть полный список объектов недвижимости здесь

Обновление: в этом случае Actuator создает еще один экземпляр Embedded Tomcat (контейнер сервлета). Смотрите здесь и здесь

Ответ 3

Начиная с springboot 2, EmbeddedServletContainerFactory упомянутый в решении ootero, больше не доступен, поэтому вам следует использовать либо TomcatServletWebServerFactory либо TomcatReactiveWebServerFactory соответствии с вашим контекстом.

Раствор остается таким же, кроме заводского впрыска:

@Bean
public TomcatServletWebServerFactory servletContainer() {
    TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
    Connector[] additionalConnectors = this.additionalConnector();
    if (additionalConnectors != null && additionalConnectors.length > 0) {
        tomcat.addAdditionalTomcatConnectors(additionalConnectors);
    }
    return tomcat;
}

Ответ 4

Это старый пост, и, скорее всего, проблема уже решена, но я все равно хотел высказать свое мнение для дальнейших читателей. Я думаю, что это неправильный способ мышления, и я не вижу, когда вам действительно понадобится приложение с двумя портами.

Spring boot создан для использования в микросервисной архитектуре. Так что в этом случае вы должны разделить свое приложение на 2 приложения, где у каждого из них будет свой порт. Это хорошо по разным причинам, но наиболее очевидным является то, что ваш API может иметь 1.000.000 запросов в день, а администратор - только 10.

Скорее всего, у вас много общего кода, но это будет третье приложение, которое вы должны упаковать как jar и импортировать в оба проекта api и admin.