SpringBoot 创建的 jar 包热部署 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
muhuan
V2EX    Java

SpringBoot 创建的 jar 包热部署

  •  
  •   muhuan 2022-05-13 10:21:36 +08:00 4323 次点击
    这是一个创建于 1255 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    谢谢大佬们,nginx 的 upstream 学习到了;
    lipcao
        13
    lipcao  
       2022-05-13 15:41:23 +08:00
    滚动发布的原理不就是先拉起新的服务然后健康检测,通过了再关掉旧的服务 就是周期时间长
    liuzhaowei55
        14
    liuzhaowei55  
       2022-05-13 15:56:25 +08:00 via iPhone
    @muhuan 这个需要优先解决
    asuraa
        15
    asuraa  
       2022-05-13 15:59:25 +08:00
    上 docker 不好么 简单弄个 swarm 自动滚动发布
    oneoyn
        16
    oneoyn  
       2022-05-13 16:00:03 +08:00   1
    我用的负载均衡 两个节点 每次更新就是 关闭节点 N 更新节点 N 启动节点 N 写好 shell 脚本 一键更新 很快
    sunwei0325
        17
    sunwei0325  
       2022-05-13 16:14:13 +08:00
    既然是一个实例, 肯定用的人不多, 趁晚上服务器不注意的时候来一下子?
    muhuan
        18
    muhuan  
    OP
       2022-05-13 16:28:44 +08:00 via iPhone
    @oneoyn 更新不费时间,主要启动过程大约 5s 左右
    muhuan
        19
    muhuan  
    OP
       2022-05-13 16:30:25 +08:00 via iPhone
    @sunwei0325 对的,之前是这样子,不过希望周末开发一点就可以随时更新
    Huozy
        20
    Huozy  
       2022-05-13 17:17:48 +08:00
    如果你们能接受对客户停机几秒钟 那可以 kill -几来着 是会在所有接口运行完成之后再 kill 掉进程,再更新重启。
    完全是理论,不知道会不会有严重问题
    dqzcwxb
        21
    dqzcwxb  
       2022-05-13 17:20:15 +08:00
    蓝绿发布 滚动发布 灰度发布
    muhuan
        22
    muhuan  
    OP
       2022-05-13 17:54:23 +08:00 via iPhone
    @Huozy #20 之前的操作就是这种
    keeguai
        23
    keeguai  
       2022-05-14 09:21:09 +08:00
    用 docker ,同时开两个服务,轮流升级就行了
    muhuan
        24
    muhuan  
    OP
       2022-05-14 11:53:49 +08:00
    @keeguai mini 型配置云主机,docker 还是不考虑了
    seepiner
        25
    seepiner  
       2022-05-15 17:04:06 +08:00
    花半天一天学下 docker swarm ,以后每次部署更新节省的时间是千倍百倍的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2565 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 28ms UTC 04:14 PVG 12:14 LAX 21:14 JFK 00:14
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86