已经上线的springboot项目,如何做到不停机更新?

第一种:Nginx 版本
针对一般的单体应用,通过 Nginx 切换端口可以做到平滑无感知的更新。 大致的步骤是这样的:
1、打一个新的 jar 包,端口号和之前旧的不同。
2、运行新的 jar 包(注意旧的和新的同时在运行)。
3、在 Nginx 配置中把域名转发到新的端口上。
4、确认转发无误后关闭旧的 jar 包。 这主要是利用了 Nginx 的无感知重载配置文件的功能,只需要 reload 一下就可以实现无缝切换。

第二种:K8S
针对比较大型一点的项目,可以利用 K8S 滚动更新,可以参考星球嘉宾 macrozheng 的这篇文章:自从上了K8S,项目更新都不带停机的!

第三种:SpringCloud Gateway实现灰度发布
灰度发布(又名金丝雀发布)是指在黑与白之间,能够平滑过渡的一种发布方式。在其上可以进行A/B testing,即让一部分用户继续用产品特性A,一部分用户开始用产品特性B,如果用户对B没有什么反对意见,那么逐步扩大范围,把所有用户都迁移到B上面来。灰度发布可以保证整体系统的稳定,在初始灰度的时候就可以发现、调整问题,以保证其影响度。
参考文章:Spring Cloud Gateway 网关如何实现灰度发布?


除此之外,在配置文件里可以添加

1
2
server.shutdown=graceful
spring.lifecycle.timeout-per-shutdown-phase=30s

做到优雅停机,参考文章:Spring——项目优雅停机 - 曹伟雄 - 博客园

当我们配置了优雅停机时,可能会有两种可能性:

  • 应用中没有正在进行的请求。在这种情况下,应用程序将会直接关闭,而无需等待宽限期结束后才关闭。
  • 如果应用中有正在处理的请求,则应用程序将等待宽限期结束后才能关闭。如果应用在宽限期之后仍然有待处理的请求,应用程序将抛出异常并继续强制关闭。