【问题标题】:How to deploy 2 microservices from 2 different jars into same port in spring boot如何在 Spring Boot 中将 2 个不同 jar 中的 2 个微服务部署到同一个端口
【发布时间】:2018-05-02 03:02:54
【问题描述】:

我是 Spring Boot 的新手。 我已将微服务部署到某些服务器的 80 端口。该服务的 URL 模式根为“/test”。

然后我将不得不将另一个微服务部署到同一台服务器的同一端口。它的 URL 模式是来自另一个不同 jar 的“/test2”。

是否可以将指向 2 个不同 URL 的 2 个不同 jar 部署到同一个端口?

【问题讨论】:

  • 据我所知你不能!您唯一可以使用的是 application.properties (server.port=XXXX) 并将这两个微服务部署在不同的端口或使用某种策略作为 api 网关。
  • 你不能监听来自两个不同进程的同一个端口。即使您将它们称为微服务并将它们部署在容器中也不行。但是您可以为两者模拟一个端口,请参阅下面的答案。

标签: java spring spring-boot


【解决方案1】:

有两种不同的方法可以做到这一点:

1,前面已经提到了使用代理的方式,让用户以为他们运行的是同一个端口,其实不然。 Nginx 有一个很好的代理功能,Netflix 的 Eureka 也有 20%。

  1. 将您的两个 Spring 应用程序构建为 .war 文件,并将它们部署到应用程序服务器,例如(非嵌入式)Tomcat。 There’s a good blog article on how to generate a .war and deploy it to a standalone Tomcat.

  2. 将这两个服务放在单独的 Docker 容器中。 (但是你仍然需要向外界公开不同的端口,所以这个答案有点作弊。

选项 2 可能是最接近的,而且您仍在 Java 领域……但这并不是 2018 年在 Spring Boot 领域部署事物的最新方式。

【讨论】:

  • 如果您使用选项 2,您不妨制作一个将 A 和 B 作为依赖项的 Boot 顶级包装器。
【解决方案2】:

让第三个微服务作为另外两个的代理。根据请求内容、上下文、URL 模式或适合您的特定应用程序的任何内容将请求转发给他们。

【讨论】:

    【解决方案3】:

    如果你有两者的代码,

    不需要代码,只需包含类名(通过扫描 jar 或询问开发团队) 可以创建一个新的 main 方法来扫描所有包并将它们添加到上下文中。然后开始那个方法。我认为它会扫描类路径中的所有罐子。因此,即使您的新 main 方法在一个 jar 中,它也会扫描另一个 jar 中的类。这样就不必重新包装到一个罐子里了。

    这是保留一个 JVM 和一个端口的一种方式。

    Timir 建议的代理方法也不错。我建议不要使用 Java 微服务,而是使用 Nginx 或 apache Web 服务器进行编写,如果与 Web 服务器相同,则在不同系统或不同端口中运行两个 Java 进程。

    【讨论】:

    • @tkgprog 不错 - 但您要求 OP 从微服务迁移回单体应用。没有?
    • @Timir OP 无论如何都在尝试运行 duolith。
    • @timir 仅用于部署。开发和测试(我希望)仍将是微服务。无论如何,这个问题暗示了这一点。你的方法也很棒。在进程级别编写。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-25
    • 2018-10-02
    • 2012-11-24
    • 1970-01-01
    • 2020-11-25
    • 2019-10-23
    相关资源
    最近更新 更多