waisir
V2EX  ›  Java

Spring Boot 2.0 你们是如何做到 0 宕机热部署的?

  •  
  •   waisir · Apr 15, 2019 · 12344 views
    This topic created in 2762 days ago, the information mentioned may be changed or developed.

    Spring Boot 新手。正在学习中,新项目用到 Spring Boot,但在 0 宕机发布这个问题上有疑惑。

    由于之前使用 PHP,发布流程中使用新版代码替换原有代码即可。

    了解到 java 可以使用源代码、jar、war+tomcat 这几种方式运行。了解到有 spring-loaded 和 devtools 与热部署有关。(闻其名总感觉像类似像 webpack 中的 hot-reload...,仅限开发使用,用在生存环境会不会有性能问题?)

    目前我使用的是 jar 包,每次发布需要中断约 15s 的时间(单机 1G+1Core)。我怀疑是我姿势不对,请不吝赐教。

    47 replies  •  2021-10-18 11:01:46 +08:00
    mind3x
    mind3x
    Apr 16, 2019❤️2
    1
    你没有 load balancer 和冗余节点,单机谈什么热部署……
    misaka19000
    misaka19000
    Apr 16, 2019 via Android❤️1
    2
    多负载 + 优雅停机
    zjp
    zjp
    Apr 16, 2019 via Android
    3
    有再加一层代理的可以用单机多实例,启动完切代理端口。不过 1G 内存有点悬…
    hyperbin
    hyperbin
    Apr 16, 2019 via Android
    4
    Java 还能源码部署?
    WordTian
    WordTian
    Apr 16, 2019 via Android
    5
    多节点加负载均衡吧
    yuikns
    yuikns
    Apr 16, 2019 via iPhone❤️1
    6
    试试 docker ?
    petercui
    petercui
    Apr 16, 2019
    7
    凌晨停机部署
    jbiao520
    jbiao520
    Apr 16, 2019 via Android
    8
    滚动部署
    Cbdy
    Cbdy
    Apr 16, 2019 via Android
    9
    lb 了解一下
    xuanbg
    xuanbg
    Apr 16, 2019❤️1
    10
    idea 有热部署功能,但仅限于在 idea 里面运行或调试。生产环境就只能做双机热备或分布式才能实现不停机更新了。其实不停机热更也只适用于版本兼容的情况,不兼容的时候,热更是要出大问题的!
    hangszhang
    hangszhang
    Apr 16, 2019
    11
    生产环境的热部署没有多大意义
    lhx2008
    lhx2008
    Apr 16, 2019 via Android❤️1
    12
    你需要前端再带一个 nginx,然后旧的不要停,直接起一个新的 jar,然后 nginx 改端口,平滑重启,把旧 jar 包的 kill 掉
    gramyang
    gramyang
    Apr 16, 2019
    13
    不是都说 Java 对热部署的支持不友好,最好不要热部署的吗?
    Sharuru
    Sharuru
    Apr 16, 2019 via Android
    14
    单机谈什么热部署...

    你 PHP 上传代码不要时间吗...顶多说是线上修 bug 的时候方便点( doge )
    daryu
    daryu
    Apr 16, 2019
    15
    用 docker swarm 的 stack destory,弄多个实例做灰度发布或者金丝雀发布
    mritd
    mritd
    Apr 16, 2019 via iPhone
    16
    Kubernetes 了解一下
    cominghome
    cominghome
    Apr 16, 2019
    17
    直接覆盖代码你怕是没死过...
    kaneg
    kaneg
    Apr 16, 2019 via iPhone❤️3
    18
    能接受 1G1 核的配置,还接受不了 15s 的停机时间?
    lawler
    lawler
    Apr 16, 2019❤️1
    19
    所以,你知道了为什么 PHP 是世界上最好的语言,而 Java 不是了吧?
    whp1473
    whp1473
    Apr 16, 2019
    20
    if(机器数>=2){ while(关闭一台旧的,启动一台新的) }
    huijiewei
    huijiewei
    Apr 16, 2019❤️1
    21
    nginx 后面跑 2 个 jar 实例 热切换
    allanzhuo
    allanzhuo
    Apr 16, 2019
    22
    生产环境热部署,真的是不怕死啊
    keymao
    keymao
    Apr 16, 2019
    23
    单机热部署啥... 多个负载 切换一个 更新一个呗... 轮换着来 业务就不会停了...
    chendy
    chendy
    Apr 16, 2019
    24
    前面放一个反代,启动新节点,启动之后把流量切过去就行了
    不过 1c1g 的配置也没多大的量吧,停一会就停一会吧…
    zifangsky
    zifangsky
    Apr 16, 2019
    25
    不要问,问就是:PHP 是世界上最好的语言!
    hantsy
    hantsy
    Apr 16, 2019
    26
    You should consider applying blue-green pipelines with DevOps.

    It is an issue of the languages/frameworks you are using, you have to envolve your development progress.
    LokiSharp
    LokiSharp
    Apr 16, 2019
    27
    多节点负载均衡
    gscoder
    gscoder
    Apr 16, 2019
    28
    集群部署呗。。开发模式下那种热更新浪费性能,没有用在生产环境的。你说的这种只有脚本型语言才做得到,比如 php
    loveCoding
    loveCoding
    Apr 16, 2019
    29
    nginx 反代两个 jar 实例端口就行
    abcbuzhiming
    abcbuzhiming
    Apr 16, 2019
    30
    我就说很多人误以为 PHP 不需要编译,所以就能热部署了。实际上你们这种玩法就是错的。根本达不到真的热部署的要求
    hahaayaoyaoyao
    hahaayaoyaoyao
    Apr 16, 2019 via Android
    31
    @abcbuzhiming 是的
    luozic
    luozic
    Apr 16, 2019
    32
    冗餘 (網關 app 容器 數據庫)+ 分佈式并發控制架構才有 不停機更新,其他的估計是’自以爲“的不停機更新。
    ala2008
    ala2008
    Apr 16, 2019
    33
    负载均衡
    yc8332
    yc8332
    Apr 16, 2019❤️1
    34
    其实楼主的意思就是不停机部署。。。单机应该是不可能,不然就是单机起两个,不同端口,启完了再切过去新端口
    coolzilj
    coolzilj
    Apr 16, 2019 via Android❤️1
    35
    你们吓得楼主都不敢出来说话了
    waisir
    waisir
    OP
    Apr 16, 2019❤️1
    36
    @coolzilj。。。

    非常感谢各位的回答,答案已经很清晰了。
    freedomshi
    freedomshi
    Apr 16, 2019
    37
    还是 php 最好。。。
    a663
    a663
    Apr 16, 2019 via Android
    38
    k8s
    hillMonkey
    hillMonkey
    Apr 16, 2019
    39
    Portainer + Swarm
    rffan
    rffan
    Apr 16, 2019
    40
    没办法单节点热部署,无论如何都得重启 tomcat 等容器。
    xfriday
    xfriday
    Apr 16, 2019
    41
    k8s 单节点也可以滚动更新的,更新过程中旧副本集继续提供服务,更新完成并成功才切换到新副本集,如果失败自动回滚
    Infernalzero
    Infernalzero
    Apr 16, 2019
    42
    你想就靠单机解决这个问题的话就只能不用 spring 这套了,micronaut 那套就是为了优化这个问题,在编译时完成了依赖注入
    qiyuey
    qiyuey
    Apr 17, 2019
    43
    集群的事情,不要靠单机解决
    ricwang
    ricwang
    Apr 17, 2019
    44
    docker 部署,nginx 做负载,起一个新版本的容器,正常后再 kill 原本旧版本的容器
    我的处理方式
    wizzer
    wizzer
    Apr 22, 2019
    45
    自带运维中心,演示地址 https://nutzwk.wizzer.cn
    zhaoxueqin248
    zhaoxueqin248
    May 6, 2020
    46
    @mind3x 单纯请教,就是以前看过 Nginx 就是单机 直接更换 sbin/nginx 二进制执行文件,新老 NGINX 进程替换, 来进行的 Nginx 升级。讲道理 ,Spring-Boot 应该从技术上也是是可行的吧?
    Rorysky
    Rorysky
    Oct 18, 2021
    47
    @allanzhuo 有需要不停机的场景
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   1796 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 108ms · UTC 09:27 · PVG 17:27 · LAX 01:27 · JFK 04:27
    ♥ Do have faith in what you're doing.