【发布时间】:2015-02-20 08:19:18
【问题描述】:
在我的架构中,我使用 spring 作为 web 服务器,提供静态 html 和 javascript 页面,以及作为一个 rest api。 目前,我的 spring 应用程序侦听端口 8080。尽管我可以轻松地将其更改为端口 80,但我认为 api 和 web 服务器应该在不同的端口上,并且认为没有理由创建一个单独的应用程序来提供静态内容,哪个弹簧可以轻松做到。
我确实查看了网上和其他一些问题,发现 spring 可以使用多个 servlet 容器监听两个不同的端口。甚至有人说,只需创建多个应用程序上下文即可。
但是,没有提及如何做到这一点,至少对我来说,这不是微不足道的,尤其是在使用 Spring Boot 时。
- 如何创建多个 servlet 容器或多个应用程序上下文,以便侦听多个端口(80 和 8080)?
- 设置这些之后,我如何控制哪个 servlet 做什么? 也就是哪一个服务静态页面,哪一个服务其余api?
-
编辑
以下问题似乎与我自己的问题相匹配,但如前所述,我不知道如何实现这一点,特别是在使用 Spring Boot/Annotations 时,而不是 xml 配置。
Configure multiple servletcontainers/servlets with spring boot
编辑(2)
这样的一个很好的用例是让您的网站启用 ssl,但不是必需的。也就是说,您希望通过 potr 443 启用 ssl,但允许用户通过端口 80 使用不安全的访问。
编辑(3)
我不知道 Dave Syer 的答案是否是最好的,但它似乎有效。 请注意,与他的方法不同,我使用 servlet 容器定制器来更改端口,但我仍然使用第二个线程并创建第二个 spring 应用程序。
编辑(回答)
Dave Syer 的原始答案有效,但这不是我想要的。 正如他的一个 cmets 所述,答案是创建第二个 Connector 对象 如果您使用的是 Tomcat servlet 容器(spring 的默认值),或者码头的 Handler。
我使用了类似以下的东西:
public class App implements EmbeddedServletContainerCustomizer {
public void customize(ConfigurableEmbeddedServletContainer container) {
TomcatEmbeddedServletContainerFactory tombat = (TomcatEmbeddedServletContainerFactory)container;
tomcat.addAditinoalTomcatConnectors(...);
}
}
【问题讨论】:
-
要启动 Spring Boot 应用程序上下文,您通常会使用
SpringApplication。为什么你需要这样做?它能解决什么问题? -
我不想这样做,也不会解决任何问题。不知道你是怎么做到的。如前所述,我正在尝试创建一个 second 应用程序上下文,因此我可以监听两个不同的端口。
-
是的,但是您将如何启动第二个上下文 (
SpringApplication)?只是不清楚你为什么需要它。 -
据我了解,SpringApplication 创建上下文,但您可以手动完成,因此创建第二个。只是不确定如何。另外,看看这个:stackoverflow.com/questions/21630820/…
-
那是一个重复的问题,而你的答案是不同的吗?
标签: spring-mvc spring-boot web-architecture servlet-container