【问题标题】:How to re-deploy springboot application without down time如何在不停机的情况下重新部署 Spring Boot 应用程序
【发布时间】:2019-05-01 07:38:45
【问题描述】:

我的资源有限,所以我无法使用 docker 和 kubernetes 设置完整的 microservices 架构,并且我的应用程序正在不断地被用户使用。

我必须为每个新版本/热修复重新部署我的应用程序,您知道我怎样才能以最少的停机时间实现这一目标吗?

关于我的应用的信息:

  • 服务器中的启动持续时间:80 seconds。
  • 端口:8080
  • 应用服务器:embedded tomcat
  • 春季启动版本:2.0.1.RELEASE。
  • 我在公司 nginx 反向代理背后。
  • 包装:jar
  • 舞台:production

我想到了这个解决方案:

  • 设置内部 nginx 侦听端口 8080 而不是我的应用程序并转发到新端口。
  • 每次我想部署时,我都会在一个新的不同端口中启动我的应用程序并更改 nginx conf 然后重新加载它。

以前有人遇到过这个问题吗?或任何想法如何实现它?

提前谢谢你。

【问题讨论】:

  • 对于正常的 Tomcat 设置,您可以在同一上下文路径上部署应用程序的多个版本。新用户将看到您应用的新版本。但不知道这在嵌入式 Tomcat 案例中如何工作:tomcat.apache.org/tomcat-9.0-doc/config/context.html#Naming
  • @Selaron 谢谢你的回答,确实我已经用springboot嵌入了tomcat,我正面临这个问题。要切换到 tomcat,我必须测量影响并复制我的所有配置并更改我的应用程序设计(不包括 tomcat 和 packagin 和..)
  • 请运行公司 nginx 代理的人在您的应用程序的两个实例之间进行负载平衡,例如一个在8080 上运行,一个在8081 上运行。然后,您可以一次更新一个应用程序。您可能还需要将某些事情外部化,例如在单独的主机上运行任何会话管理,而不是依赖于内存中的会话处理。
  • @AlexB +1 我很欣赏这个想法,因为 nginx 中有健康检查。谢谢
  • 添加为可能的答案

标签: spring-boot tomcat downtime hot-reload


【解决方案1】:

请运行公司 nginx 代理的人员在您的应用程序的两个实例之间进行负载平衡,例如一个在8080 上运行,一个在8081 上运行。然后,您可以一次更新一个应用程序。您可能还需要将某些事情外部化,例如在单独的主机上运行任何会话管理,而不是依赖于内存中的会话处理。

upstream production {
    server 123.456.789:8080;
    server 123.456.789:8081;
}

server {
    listen 80;
    server_name some.host;
    location / {
        proxy_pass http://production;
    }
}

https://docs.nginx.com/nginx/admin-guide/load-balancer/http-load-balancer/

您需要能够动态地configure Spring Boot's server port 以使应用程序侦听不同的端口。或者,您也可以让它们在不同的主机上运行。

【讨论】:

  • 再次感谢您的回答,我赞成,当我们投入生产时,我会将其标记为正确答案。
  • @Incepter 怎么了
猜你喜欢
  • 1970-01-01
  • 2021-11-16
  • 2016-07-23
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
相关资源
最近更新 更多