【问题标题】:Web server with REST api - Spring Boot - Mulitple servlet containers带有 REST api 的 Web 服务器 - Spring Boot - 多个 servlet 容器
【发布时间】:2015-02-20 08:19:18
【问题描述】:

在我的架构中,我使用 spring 作为 web 服务器,提供静态 html 和 javascript 页面,以及作为一个 rest api。 目前,我的 spring 应用程序侦听端口 8080。尽管我可以轻松地将其更改为端口 80,但我认为 api 和 web 服务器应该在不同的端口上,并且认为没有理由创建一个单独的应用程序来提供静态内容,哪个弹簧可以轻松做到。

我确实查看了网上和其他一些问题,发现 spring 可以使用多个 servlet 容器监听两个不同的端口。甚至有人说,只需创建多个应用程序上下文即可。

但是,没有提及如何做到这一点,至少对我来说,这不是微不足道的,尤其是在使用 Spring Boot 时。

  1. 如何创建多个 servlet 容器或多个应用程序上下文,以便侦听多个端口(80 和 8080)?
  2. 设置这些之后,我如何控制哪个 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


【解决方案1】:

我仍然不知道您为什么要这样做(与仅运行单个容器相比有什么优势?),但是您可以使用 SpringApplication 轻松运行 2 个服务器。使用后台线程的示例:

new Thread(new Runnable() { public void run() {
    SpringApplication.run(StaticServer.class, "--server.port=${static.port:8081}");
}}).start();
SpringApplication.run(ApiServer.class, args);

【讨论】:

  • 我已经编辑了我的问题,添加了我认为创建多个 servlet 容器的好用例。你的答案仍然适用吗?也就是说,创建多个 Spring 应用程序仍然是正确的方式(并且会起作用)吗?
  • 就像你说的,它有效。但是,如果您想在同一个应用程序中支持 SSL 和纯 HTTP,您实际上并不需要 2 个容器。如果你真的有 2 个应用程序,为什么它们需要在同一个 JVM 中?
  • 我知道我可以创建两个独立的 JVM,但我为什么要这样做?创建两个不同的进程,确保每个进程都启动.. 更不用说我还需要分离大部分代码,因为我需要创建不同的项目(尽管我想我可以为此使用命令行参数)。无论如何,我将如何在同一个应用程序中使用一个容器支持 SSL 和纯 HTTP?我以为一个容器只能监听一个端口..
  • 每个容器实现都不同,但它们都有用于添加额外端口的 API。在 Tomcat 中添加一个Connector,在泽西岛我认为它被称为Handler
  • 这就是我想要的!我不敢相信这很简单。请编辑您的答案以表明这是预期的结果。我也会这样做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-20
  • 2021-07-11
  • 2016-10-29
  • 2017-03-14
  • 2017-10-30
相关资源
最近更新 更多