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