如何在Spring Boot 2(w / WebFlux)中为HTTP和HTTPS配置两个端口?

时间:2018-01-12 07:05:16

标签: spring-boot spring-webflux

有人能告诉我在使用Spring Boot 2和WebFlux时如何配置2个端口(用于HTTP和HTTPS)?任何提示都表示赞赏!

3 个答案:

答案 0 :(得分:5)

isn't directly supported by Spring Boot 2 yet

但是,您可能可以通过两种方式使它工作。

默认情况下,Spring Boot WebFlux使用Netty。如果已经配置了for ssl,那么Spring Boot将启动并打开端口8443(或任何已配置的端口)。

然后,添加8080,您可以执行以下操作:

@Autowired
HttpHandler httpHandler;

WebServer http;

@PostConstruct
public void start() {
    ReactiveWebServerFactory factory = new NettyReactiveWebServerFactory(8080);
    this.http = factory.getWebServer(this.httpHandler);
    this.http.start();
}

@PreDestroy
public void stop() {
    this.http.stop();
}

这有点笨拙,因为您的https配置位于一个位置(application.yml),而您的http配置位于Java配置中,但是我已经用一个玩具应用程序对此进行了测试。不过,不确定该解决方案的稳定性如何。

另一个可行的选择是尝试与其他建议等效,但使用该类的响应版本,即TomcatReactiveWebServerFactory。我不知道有什么方法可以为其提供多个连接器,但是您可以覆盖其getWebServer方法:

@Bean
TomcatReactiveWebServerFactory twoPorts() {
    return new TomcatReactiveWebServerFactory(8443) {
        @Override
        public WebServer getWebServer(HttpHandler httpHandler) {
           // .. copy lines from parent class
           // .. and add your own Connector, similar to how tutorials describe for servlet-based support
        }
    }
}

也有点混乱,我自己也没有尝试过这种方法。

当然,请跟踪the ticket,以便您知道Spring Boot 2何时提供官方支持。

答案 1 :(得分:1)

按照jojo_berlin (here's the link)提供的链接中列出的说明操作。不过使用他的EmbeddedTomcatConfiguration类,请使用下面的

@Configuration
public class TomcatConfig {

    @Value("${server.http.port}")
    private int httpPort;

    @Bean
    public ConfigurableServletWebServerFactory webServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        Connector connector = new Connector(TomcatServletWebServerFactory.DEFAULT_PROTOCOL);
        connector.setPort(httpPort);
        factory.addAdditionalTomcatConnectors(connector);

        return factory;
    }
}

答案 2 :(得分:0)

实际上,您可以按照here所述定义第二个连接器。因此,您可以将https连接器定义为默认连接器和其他HTTP连接器