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

Posted

技术标签:

【中文标题】如何在 Spring Boot 2(w/WebFlux)中为 HTTP 和 HTTPS 配置两个端口?【英文标题】:How to configure in Spring Boot 2 (w/ WebFlux) two ports for HTTP and HTTPS? 【发布时间】:2018-06-21 14:48:17 【问题描述】:

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

【问题讨论】:

【参考方案1】:

这个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 何时提供官方支持。

【讨论】:

【参考方案2】:

按照 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;
    

【讨论】:

OP 询问的是基于 WebFlux 的应用程序,而不是基于 Servlet 的应用程序。 嗯 - 它帮助了我,所以感谢您提供这个答案。【参考方案3】:

实际上,您可以定义第二个连接器,如 here 所述。因此,您可以将 https 连接器定义为默认连接器和额外的 HTTP 连接器

【讨论】:

您指出的答案在 Spring Boot 2 中无法正常工作,因为嵌入式容器包结构一直是 refactored。 链接的说明是构建一个基于servlet的应用程序,而不是基于webflux的。

以上是关于如何在 Spring Boot 2(w/WebFlux)中为 HTTP 和 HTTPS 配置两个端口?的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 2.0:Spring Boot 如何解决项目启动时初始化资源

Spring Boot 2.0:Spring Boot 如何解决项目启动时初始化资源

如何在 Spring Boot 2.2.6 中提供静态内容?

Spring Boot 2.0:使用 Docker 部署 Spring Boot 开源软件云收

如何在 Spring-boot 上启用 TLS 1.2?

如何在 Spring boot 2 + Webflux + Thymeleaf 中配置 i18n?