SpringBoot 创建的 jar 包热部署

2022-05-13 10:21:36 +08:00
 muhuan

有一台服务器,部署了 jar 包,指定了端口,同时 nginx 反向代理提供服务,但是服务更新的时候,需要更新 jar 包,当前是关闭服务,重新启动,会有 5s 左右的间隔是服务停机,有比较好的办法么?

想过双端口,固定双端口,新服务启动后自动检测没使用的端口,不过操作起来比较复杂,nginx 上也需要很多配置改造,有更好的方案么?

3813 次点击
所在节点    Java
25 条回复
leogm9408leo
2022-05-13 10:28:04 +08:00
一般企业级服务也就是多机+前置网关,你提的方案单机多端口+nginx 代理的方案已经是成本很低的方案了,把操作写成脚本也可以一键完成,已经挺好的了
LeegoYih
2022-05-13 10:28:38 +08:00
一般通过集群方式,比如有 1 个服务有 2 个实例,先重新部署 1 个,然后再重新部署另外 1 个,这样可以保证服务一直可用。
muhuan
2022-05-13 10:35:33 +08:00
只有一个服务器
kaedeair
2022-05-13 10:36:54 +08:00
docker+traefik 配合 healthy 检查
yazinnnn
2022-05-13 10:43:39 +08:00
nginx -s reload 有什么复杂的....
stonewu
2022-05-13 10:50:42 +08:00
单机跑两个实例,两个端口,模拟 AB 发布,成本其实不高,写好脚本基本就没什么成本了
kytrun
2022-05-13 10:51:53 +08:00
恰好最近在折腾这个,用几个 shell 脚本搞定,写了篇文章记录,https://kytrun.com/spring-cloud-graceful-update/
昨天完善了自动切换 nginx upstream 的脚本,upstream 需要分离一个单独的配置文件: https://github.com/kytrun/snippets/commit/5ee01ff652508e029c1f4a860f30109623c6aa80
yc8332
2022-05-13 10:59:34 +08:00
就是跑两个实例 2 个端口啊。nginx 自动 upstream 就好了。
whx
2022-05-13 11:05:13 +08:00
在另一个端口启动一个临时服务,启动完成后 nginx 指向临时服务端口。
再重启当前主服务,重启完成后 nginx 再指向主服务端口。
最后关闭临时服务。
rehoni
2022-05-13 11:28:01 +08:00
实际上就是部署同一服务在两个端口,nginx 自动 upstream ,然后逐个替换服务升级版本就可以了。
rehoni
2022-05-13 11:28:47 +08:00
顺便想问问 war 包想热部署怎么办...弄两个 tomcat 吗? T 。T
muhuan
2022-05-13 13:09:02 +08:00
其实 nginx 切换还有一个问题是登陆态的改造,我目前没有持久化这部分数据,我改造下;

谢谢大佬们,nginx 的 upstream 学习到了;
lipcao
2022-05-13 15:41:23 +08:00
滚动发布的原理不就是先拉起新的服务然后健康检测,通过了再关掉旧的服务 就是周期时间长
liuzhaowei55
2022-05-13 15:56:25 +08:00
@muhuan 这个需要优先解决
asuraa
2022-05-13 15:59:25 +08:00
上 docker 不好么 简单弄个 swarm 自动滚动发布
oneoyn
2022-05-13 16:00:03 +08:00
我用的负载均衡 两个节点 每次更新就是 关闭节点 N 更新节点 N 启动节点 N 写好 shell 脚本 一键更新 很快
sunwei0325
2022-05-13 16:14:13 +08:00
既然是一个实例, 肯定用的人不多, 趁晚上服务器不注意的时候来一下子?
muhuan
2022-05-13 16:28:44 +08:00
@oneoyn 更新不费时间,主要启动过程大约 5s 左右
muhuan
2022-05-13 16:30:25 +08:00
@sunwei0325 对的,之前是这样子,不过希望周末开发一点就可以随时更新😀
Huozy
2022-05-13 17:17:48 +08:00
如果你们能接受对客户停机几秒钟 那可以 kill -几来着 是会在所有接口运行完成之后再 kill 掉进程,再更新重启。
完全是理论,不知道会不会有严重问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/852576

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX