puerto mvc example configurar change cambiar application spring spring-boot spring-boot-actuator

mvc - Configure Spring Boot con dos puertos



spring boot web application example (3)

Estoy tratando de configurar una aplicación en Spring Boot con dos puertos diferentes, pero aún no tengo. Mi primera aproximación ha sido con dos controladores y he definido un @Bean dentro de los dos controladores con container.setPort (8080); Y mi segunda aproximación ha sido agregar la dependencia del actuador y cambiar el puerto de la administración, pero mi aplicación no se ejecuta. "Dirección ya en uso: enlace", ¿Cómo puedo configurar una aplicación con dos puertos? Quiero un puerto para administrador y el otro puerto es para consultas de mi API.


Como se mencionó anteriormente, se podrían configurar server.port y management.port junto con management.context-path propiedades de management.context-path para hacer que el contenedor incorporado escuche en diferentes puertos (propiedades relacionadas con la administración para acceder a los puntos finales del Actuator ).

Para escuchar en puertos que no sean server.port y 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); } }

Recientemente escribí en un blog sobre este tema en http://tech.asimio.net/2016/12/15/Configuring-Tomcat-to-Listen-on-Multiple-ports-using-Spring-Boot.html


Desde springboot 2, EmbeddedServletContainerFactory mencionado en la solución ootero ya no está disponible, por lo que debe usar TomcatServletWebServerFactory o TomcatReactiveWebServerFactory según su contexto.

La solución permanece igual aparte de la inyección de fábrica:

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


Para cambiar el puerto de administración del actuador, puede usar la propiedad

management.port=8081

Ver lista completa de propiedades here

Actualización: Actuator crea una instancia más de Embedded Tomcat (contenedor de servlets) en este caso. Mira here y here