使用两个端口配置Spring Boot

时间:2016-04-01 13:03:47

标签: spring spring-boot spring-boot-actuator

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

5 个答案:

答案 0 :(得分:19)

如前所述,server.portmanagement.port以及management.context-path属性可以设置为使嵌入式容器侦听不同的端口(与管理相关的属性来访问{ {1}}端点)。

收听Actuatorserver.port以外的其他端口:

management.port

application.yml

@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.java

server:
  port: ${appPort:8800}
  additionalPorts: 8881,8882

我最近在http://tech.asimio.net/2016/12/15/Configuring-Tomcat-to-Listen-on-Multiple-ports-using-Spring-Boot.html

上发表了关于此主题的博文

答案 1 :(得分:1)

要更改Actuator管理端口,您可以使用属性

{{1}}

查看完整的属性列表here

<强>更新 在这种情况下,Actuator会再创建一个嵌入式Tomcat(servlet容器)实例。 请参阅herehere

答案 2 :(得分:1)

由于springboot 2,ootero solution中提到的EmbeddedServletContainerFactory不再可用,因此您应根据具体情况使用TomcatServletWebServerFactoryTomcatReactiveWebServerFactory

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

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

答案 3 :(得分:0)

这是旧文章,很可能问题已经解决,但是无论如何我还是想对更多读者说我的看法。我认为这是错误的思维方式,我看不到您何时真正需要带有两个端口的应用程序。

创建了Spring Boot以用于微服务体系结构。因此,在这种情况下,您应该将您的应用程序分为2个应用程序,每个应用程序都将具有自己的端口。出于不同的原因,这是件好事,最明显的是,您的api每天可以有1.000.000个请求,而管理员只有10个。

大多数情况下,您可能有很多共享代码,但是与第三个应用程序相比,应该打包为jar并将其导入到项目api和admin中。

答案 4 :(得分:0)

要在一个项目中运行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);
     }
}