V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
muhuan
V2EX  ›  Java

SpringBoot 创建的 jar 包热部署

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

    有一台服务器,部署了 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   ·   实用小工具   ·   1003 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:05 · PVG 06:05 · LAX 14:05 · JFK 17:05
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.