【问题标题】:Configure Spring Boot with two ports使用两个端口配置 Spring Boot
【发布时间】:2016-07-21 07:23:16
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    如前所述,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[] {});
        }
    }
    

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

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

    【讨论】:

    • 和补充一样,还有Spring Boot 2.0的修改——stackoverflow.com/questions/47554023/…
    • 你现在如何区分 localhost:port1 -> 为管理员 localhost:port2 提供索引页面 -> 为其他人提供索引页面
    【解决方案2】:

    由于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】:

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

      management.port=8081
      

      查看完整的属性列表here

      更新: 在这种情况下,Actuator 会再创建一个嵌入式 Tomcat(servlet 容器)实例。 见herehere

      【讨论】:

      • 是的,我知道,但可以这样做: management.port =8081 和 server.port=8080 ?并且在同一个应用程序中有两个不同的端口?7
      • 服务器端口默认为8080。 2 个不同的端口意味着 2 个不同的套接字在不同的端口上侦听。
      • 谢谢,我知道这是一种可能性,但我们不希望在执行器端口中有我们的管理应用程序,我们需要一个不同的端口。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        如果只打开一个额外的端口,以下就足够了(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"
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2019-07-11
          • 2019-04-04
          • 2018-05-06
          • 2021-06-22
          • 2018-06-21
          • 2014-01-31
          相关资源
          最近更新 更多