使用两个端口配置Spring Boot

nol*_*ole 11 spring spring-boot spring-boot-actuator

我正在尝试使用两个不同的端口在Spring Boot中配置应用程序,但我还没有.我的第一个aproximation是两个控制器,我在两个控制器中用container.setPort(8080)定义了一个@Bean; 我的第二个aproximation已经添加了执行器依赖并改变了管理的端口,但我的应用程序没有运行."地址已在使用中:绑定",如何使用两个端口来配置应用程序?我想要一个端口用于管理员,另一个端口用于我的api的咨询.

oot*_*ero 20

因为是之前已经提到的,server.portmanagement.port沿management.context-path特性可以被设置为使嵌入容器监听不同的端口(管理相关的属性来访问Actuator端点).

要收听上比其他港口server.portmanagement.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[] {});
    }
}
Run Code Online (Sandbox Code Playgroud)

application.yml

server:
  port: ${appPort:8800}
  additionalPorts: 8881,8882
Run Code Online (Sandbox Code Playgroud)

Application.java

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

    public static void main(String[] args) {
        SpringApplication.run(Application .class, args);
    }
}
Run Code Online (Sandbox Code Playgroud)

我最近在http://tech.asimio.net/2016/12/15/Configuring-Tomcat-to-Listen-on-Multiple-ports-using-Spring-Boot.html上发表了关于这个主题的博客

  • 正如另外,还有Spring Boot 2.0修改 - /sf/ask/3328781641/?rq=1 (3认同)
  • 您现在如何区分 localhost:port1 -&gt; 为 admin localhost:port2 提供索引页 -&gt; 为其他提供索引页 (2认同)

Cam*_*not 8

由于ootero 解决方案EmbeddedServletContainerFactory中提到的springboot 2不再可用,因此您应该根据您的上下文使用或。TomcatServletWebServerFactoryTomcatReactiveWebServerFactory

除了工厂注入之外,解决方案保持不变:

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


小智 4

要更改执行器管理端口,您可以使用属性

management.port=8081
Run Code Online (Sandbox Code Playgroud)

在此处查看完整的属性列表

更新: 在本例中,Actuator 创建了另一个嵌入式 Tomcat(servlet 容器)实例。请参阅此处此处