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

SpringBoot 创建的 jar 包热部署

  •  
  •   muhuan · 15 天前 · 2364 次点击

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

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

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

    谢谢大佬们,nginx 的 upstream 学习到了;
    lipcao
        13
    lipcao  
       15 天前
    滚动发布的原理不就是先拉起新的服务然后健康检测,通过了再关掉旧的服务 就是周期时间长
    liuzhaowei55
        14
    liuzhaowei55  
       15 天前 via iPhone
    @muhuan 这个需要优先解决
    luodaoyi
        15
    luodaoyi  
       15 天前
    上 docker 不好么 简单弄个 swarm 自动滚动发布
    oneoyn
        16
    oneoyn  
       15 天前
    我用的负载均衡 两个节点 每次更新就是 关闭节点 N 更新节点 N 启动节点 N 写好 shell 脚本 一键更新 很快
    sunwei0325
        17
    sunwei0325  
       15 天前
    既然是一个实例, 肯定用的人不多, 趁晚上服务器不注意的时候来一下子?
    muhuan
        18
    muhuan  
    OP
       15 天前 via iPhone
    @oneoyn 更新不费时间,主要启动过程大约 5s 左右
    muhuan
        19
    muhuan  
    OP
       15 天前 via iPhone
    @sunwei0325 对的,之前是这样子,不过希望周末开发一点就可以随时更新😀
    Huozy
        20
    Huozy  
       15 天前
    如果你们能接受对客户停机几秒钟 那可以 kill -几来着 是会在所有接口运行完成之后再 kill 掉进程,再更新重启。
    完全是理论,不知道会不会有严重问题
    dqzcwxb
        21
    dqzcwxb  
       15 天前
    蓝绿发布 滚动发布 灰度发布
    muhuan
        22
    muhuan  
    OP
       15 天前 via iPhone
    @Huozy #20 之前的操作就是这种🤪
    keeguai
        23
    keeguai  
       14 天前
    用 docker ,同时开两个服务,轮流升级就行了
    muhuan
        24
    muhuan  
    OP
       14 天前
    @keeguai mini 型配置云主机,docker 还是不考虑了
    seepiner
        25
    seepiner  
       13 天前
    花半天一天学下 docker swarm ,以后每次部署更新节省的时间是千倍百倍的
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1758 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 17:21 · PVG 01:21 · LAX 10:21 · JFK 13:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.