问题
I\'m trying configure an application in Spring Boot with two differents ports, but I haven\'t got still. My first aproximation has been with two controllers and I have defined a @Bean inside the two controller with container.setPort(8080); And my second aproximation has been add the actuator dependency and change the port of the managament, but my application don\'t run. \"Address already in use: bind\", How can I confiure an application with two ports? I want one port for admin and the other port is for consults of my api.
回答1:
As is has been mentioned before, server.port
and management.port
along with management.context-path
properties could be set to make the embedded container to listen on different ports (management-related properties to access Actuator
endpoints).
To listen on ports other than server.port
and 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);
}
}
I recently blogged about this topic at http://tech.asimio.net/2016/12/15/Configuring-Tomcat-to-Listen-on-Multiple-ports-using-Spring-Boot.html
回答2:
To change Actuator management port you can use property
management.port=8081
See full list of properties here
Update: Actuator creates one more Embedded Tomcat(servlet container) instance in this case. See here and here
回答3:
Since springboot 2, EmbeddedServletContainerFactory
mentioned in ootero solution is no longer available, so you should use either TomcatServletWebServerFactory
or TomcatReactiveWebServerFactory
according to your context.
The solution stays the same aside from the factory injection :
@Bean
public TomcatServletWebServerFactory servletContainer() {
TomcatServletWebServerFactory tomcat = new TomcatServletWebServerFactory();
Connector[] additionalConnectors = this.additionalConnector();
if (additionalConnectors != null && additionalConnectors.length > 0) {
tomcat.addAdditionalTomcatConnectors(additionalConnectors);
}
return tomcat;
}
回答4:
This is old post and most probably problem is solved already, but I wanted to say my opinion anyway for further readers. I think this is wrong way of thinking and I do not see when you will need app with two ports really.
Spring boot is created to be used in microservice architecture. So in this case you should separate your app in 2 apps, where every of them will have their own port. This is good from different reasons, just one most obvious is that your api can have 1.000.000 requests per day and admin only 10.
Most probably you have a lot of shared code, but it will be than third app that you should package as jar and import it in both projects api and admin.
来源:https://stackoverflow.com/questions/36357135/configure-spring-boot-with-two-ports