【发布时间】:2018-06-21 14:48:17
【问题描述】:
谁能告诉我在使用 Spring Boot 2 和 WebFlux 时如何配置 2 个端口(用于 HTTP 和 HTTPS)?任何提示表示赞赏!
【问题讨论】:
标签: spring-boot spring-webflux
谁能告诉我在使用 Spring Boot 2 和 WebFlux 时如何配置 2 个端口(用于 HTTP 和 HTTPS)?任何提示表示赞赏!
【问题讨论】:
标签: spring-boot spring-webflux
这个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 何时提供官方支持。
【讨论】:
按照 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;
}
}
【讨论】:
实际上,您可以定义第二个连接器,如 here 所述。因此,您可以将 https 连接器定义为默认连接器和额外的 HTTP 连接器
【讨论】: