在我的架构中,我使用spring作为Web服务器,提供静态html和javascript页面,以及作为rest api。目前,我的 spring 应用程序侦听端口 8080。尽管我可以轻松地将其更改为端口 80,但我认为 api 和 Web 服务器应该位于不同的端口上,并且没有理由创建一个单独的应用程序来提供静态内容,而 spring 可以轻松做到。
我确实在网上查看了其他一些问题,发现 spring 可以使用多个 servlet 容器在两个不同的端口上收听。一些问题甚至说,所要做的就是创建多个应用程序上下文。
但是,没有提到如何做到这一点,至少对我来说,这并非微不足道,尤其是在使用 Spring Boot 时。
- 如何创建多个 servlet 容器或多个应用程序上下文,以便侦听多个端口(80 和 8080(?
- 设置完这些之后,我如何控制哪个 servlet 做什么?也就是说,哪个提供静态页面,哪个提供其余 API?
-
编辑
下面的问题似乎与我自己的问题相匹配,但如前所述,我不知道如何实现这一点,尤其是在使用 Spring 引导/注释而不是 xml 配置时。
使用弹簧引导配置多个 servlet容器/servlet
编辑 (2(
对于这样的事情,一个很好的用例是使您的网站启用SSL,但不是必需的。也就是说,您希望通过 potr 443 启用 ssl,但允许用户通过端口 80 使用不安全的访问。
编辑 (3(
我不知道戴夫·西尔的答案是否是最好的,但它似乎有效。请注意,与他的方法不同,我使用 servlet 容器定制器来更改端口,但我仍然使用第二个线程并创建第二个 spring 应用程序。
编辑(答案(
Dave Syer的原始答案是有效的,但这不是我想要的。正如他的一条评论中所述,答案是创建第二个连接器对象如果您使用的是 Tomcat servlet 容器(默认为 spring(,或 Handler 表示码头。
我使用了如下所示的内容:
public class App implements EmbeddedServletContainerCustomizer {
public void customize(ConfigurableEmbeddedServletContainer container) {
TomcatEmbeddedServletContainerFactory tombat = (TomcatEmbeddedServletContainerFactory)container;
tomcat.addAditinoalTomcatConnectors(...);
}
}
我仍然不知道你为什么要这样做(与只运行单个容器相比有什么优势?(,但您可以使用 SpringApplication
轻松运行 2 台服务器。使用后台线程的示例:
new Thread(new Runnable() { public void run() {
SpringApplication.run(StaticServer.class, "--server.port=${static.port:8081}");
}}).start();
SpringApplication.run(ApiServer.class, args);