我正在尝试使用两个不同的端口在 Spring Boot 中配置一个应用程序,但我还没有。我的第一个近似值是使用两个控制器,并且我在两个控制器中定义了一个 @Bean 与 container.setPort(8080); 我的第二个近似是添加执行器依赖项并更改管理端口,但我的应用程序没有运行。“地址已在使用:绑定”,如何配置具有两个端口的应用程序?我想要一个端口用于管理员,另一个端口用于咨询我的 api。
问问题
42276 次
5 回答
32
如前所述,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[] {});
}
}
应用程序.yml
server:
port: ${appPort:8800}
additionalPorts: 8881,8882
应用程序.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上写了关于这个主题的博客
于 2016-12-19T08:17:37.027 回答
5
由于ootero 解决方案EmbeddedServletContainerFactory
中提到的springboot 2不再可用,因此您应该使用其中一个或根据您的上下文使用。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;
}
于 2019-07-04T08:51:54.973 回答
1
要在单个项目中运行 2 个或更多应用程序或更改默认端口,您可以执行如下操作
@SpringBootApplication
public class NewApplication {
public static void main(String[] args) {
SpringApplication app = new SpringApplication(NewApplication .class);
app.setDefaultProperties(Collections.singletonMap("server.port", "8083"));
app.run(args);
}
}
于 2020-04-30T09:36:07.990 回答
0
如果只打开一个额外的端口,则以下内容就足够了(Kotlin):
@Configuration
class AdditionalEndpointConfig {
@Bean
@ConditionalOnProperty(PORT_PROPERTY)
fun tomcatServletWebServerFactory(@Value("\${$PORT_PROPERTY}") additionalPort: Int) =
TomcatServletWebServerFactory().apply {
addAdditionalTomcatConnectors(
Connector("org.apache.coyote.http11.Http11NioProtocol").apply {
scheme = "http"
port = additionalPort
})
}
companion object {
const val PORT_PROPERTY = "server.additional.port"
}
}
于 2021-09-15T09:26:09.583 回答