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;
}