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

小弟,请教大家一个问题 Java web 项目 大家是怎么做到 服务器热更新的?

  •  
  •   zzf2017 · 2018-08-07 10:33:19 +08:00 · 11848 次点击
    这是一个创建于 2304 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近开发了 java web 的项目 ,把代码 打成 war 包 放到服务器上,但是 我发现每次都要删除旧 war 包,添加新 war 包才能 发布新的版本,问问各位大佬,java 有没有什么 热更新技术?

    64 条回复    2018-09-03 17:14:48 +08:00
    zzf2017
        1
    zzf2017  
    OP
       2018-08-07 10:39:01 +08:00
    自己顶一顶
    huiyadanli
        2
    huiyadanli  
       2018-08-07 10:40:43 +08:00
    灰度发布?
    FanError
        3
    FanError  
       2018-08-07 10:43:25 +08:00
    nginx 放在前端,upstream 2 个 tomcat
    停掉一个,更新,启动,
    再停到另一个,更新,启动。
    ioth
        4
    ioth  
       2018-08-07 10:44:48 +08:00
    一个项目一个 war
    恐怖
    guixiexiezou
        5
    guixiexiezou  
       2018-08-07 10:45:10 +08:00
    spring loaded 了解下( java agent 的具体应用)
    或者 java agent 了解下
    亦或者 classloader 类加载机制了解下, 这两种都可以实现热更新功能。
    如果想体验强大的功能,JLabel 可以试试
    jiangjz
        6
    jiangjz  
       2018-08-07 10:46:52 +08:00 via Android
    Jenkins 了解一下
    momocraft
        7
    momocraft  
       2018-08-07 11:18:14 +08:00
    两个容器,半夜偷偷换掉一个,再换掉一个
    nongmei
        8
    nongmei  
       2018-08-07 11:24:29 +08:00
    整两台服务器,外边放个 nginx 做负载均衡
    xiaoyangsa
        9
    xiaoyangsa  
       2018-08-07 11:25:38 +08:00
    现在用的 3 楼做法,关注下看看有没啥黑科技
    sunchen
        10
    sunchen  
       2018-08-07 11:26:43 +08:00
    动态代理
    mortonnex
        11
    mortonnex  
       2018-08-07 11:28:50 +08:00
    @guixiexiezou JRebel
    zzf2017
        12
    zzf2017  
    OP
       2018-08-07 11:37:11 +08:00
    @FanError 原来大家都是用两个容器,轮流来发布吗,这也是思路,但是这个具体是怎么做的呢,烦请告知下
    huhu3312
        13
    huhu3312  
       2018-08-07 11:40:40 +08:00
    @zzf2017 百度一下 漫画 蓝绿部署。这种应该是蓝绿部署,说错了大佬们别打我
    wxsm
        14
    wxsm  
       2018-08-07 11:43:10 +08:00
    oracle weblogic
    lihongjie0209
        15
    lihongjie0209  
       2018-08-07 11:57:21 +08:00
    热更新不懂, 但是你可以用 expand war + rsync 来增量更新, 可以使更新时间大大缩短.
    yanaraika
        16
    yanaraika  
       2018-08-07 12:21:25 +08:00
    复杂一点的话 k8s
    derrickT
        17
    derrickT  
       2018-08-07 12:21:46 +08:00   ❤️ 1
    灰度发布
    x7395759
        18
    x7395759  
       2018-08-07 12:53:18 +08:00
    灰度发布吧,没必要上热更新,不可控总感觉。
    wanghui
        19
    wanghui  
       2018-08-07 13:30:41 +08:00 via iPhone
    没明白楼主的真实诉求是什么,你到底要热部署,还是要自动化部署?
    mritd
        20
    mritd  
       2018-08-07 13:38:59 +08:00 via iPhone   ❤️ 1
    从理论上来说,线上不应该做 java 的热部署(class 扫描,动态加载); 你应当实现的是自动化部署,比如简单点上面说的 nginx 负载,复杂点上 k8s 容器集群
    geying
        21
    geying  
       2018-08-07 13:43:52 +08:00
    换 PHP
    LichMscy
        22
    LichMscy  
       2018-08-07 13:47:14 +08:00
    多个 pod 拉起新的以后停掉旧的
    acrisliu
        23
    acrisliu  
       2018-08-07 13:47:45 +08:00
    @momocraft 哈哈哈,半夜偷偷换笑死
    目前用 Spring Cloud 多实例负载均衡,更新的时候先更新一部分实例,待启动完毕后再更新剩下的。
    zlhsvc
        24
    zlhsvc  
       2018-08-07 13:48:22 +08:00   ❤️ 1
    换 PHP 就没有这个问题了
    xiaoheshang
        25
    xiaoheshang  
       2018-08-07 13:52:51 +08:00
    我们就用的 3 楼的做法,只不过是用 jenkins 实现的,一直都很顺利。
    lgpqdwjh
        26
    lgpqdwjh  
       2018-08-07 13:59:46 +08:00   ❤️ 1


    这样
    choice4
        27
    choice4  
       2018-08-07 14:06:27 +08:00
    使用 git 管理 弄个钩子好像就可以
    zzf2017
        28
    zzf2017  
    OP
       2018-08-07 14:20:29 +08:00
    @wanghui 我要的其实是热更新,但是后面大家提到了自动部署,我也去看了下 jenkins,感觉不错,我决定尝试下
    lurenw
        29
    lurenw  
       2018-08-07 14:28:51 +08:00
    收费:JRebel
    免费:DECVM

    web 项目自动化+灰度发布就得了,用啥热更新。热更新最方便的地方还是辅助开发,不需要频繁 redeploy
    TommyLemon
        30
    TommyLemon  
       2018-08-07 14:40:56 +08:00
    APIJSON 可以实现大部分 API 的热部署。
    开放(GET,HEAD)API 是完全自动化的不用管;
    简单的非开放 API(POST,DELETE,PUT)一般只需要后端修改校验规则的 Request 表就行,即时生效。

    APIJSON 自动将前端传的 JSON 参数转为 SQL 语句执行并返回结果,
    期间自动校验权限、结构、内容,自动防 SQL 注入。

    通过自动化 API,前端可以定制任何数据、任何结构!
    大部分 HTTP 请求后端再也不用写接口了,更不用写文档了!
    前端再也不用和后端沟通接口或文档问题了!再也不会被文档各种错误坑了!
    后端再也不用为了兼容旧接口写新版接口和文档了!再也不会被前端随时随地没完没了地烦了!

    在线解析
    自动生成文档,清晰可读永远最新
    自动生成请求代码,支持 Android 和 iOS
    自动生成 JavaBean 文件,一键下载
    自动管理与测试接口用例,一键共享
    自动校验与格式化 JSON,支持高亮和收展

    对于前端
    不用再向后端催接口、求文档
    数据和结构完全定制,要啥有啥
    看请求知结果,所求即所得
    可一次获取任何数据、任何结构
    能去除重复数据,节省流量提高速度

    对于后端
    提供通用接口,大部分 API 不用再写
    自动生成文档,不用再编写和维护
    自动校验权限、自动管理版本、自动防 SQL 注入
    开放 API 无需划分版本,始终保持兼容
    支持增删改查、模糊搜索、正则匹配、远程函数等

    后端接口和文档自动化,前端(客户端) 定制返回 JSON 的数据和结构!
    创作不易,GitHub 右上角点 Star 支持下吧,谢谢^_^
    github。com/TommyLemon/APIJSON
    zzf2017
        31
    zzf2017  
    OP
       2018-08-07 14:52:53 +08:00
    @TommyLemon 这是在打广告吗
    azev
        32
    azev  
       2018-08-07 15:09:02 +08:00
    @FanError 如果有用户正在访问要停掉的那个机器是怎么处理?
    ETiV
        33
    ETiV  
       2018-08-07 15:20:46 +08:00 via iPhone
    nginx reload 热更新、upstream 配权重 灰度
    zhangtao
        34
    zhangtao  
       2018-08-07 15:21:37 +08:00
    换 golang
    TommyLemon
        35
    TommyLemon  
       2018-08-07 15:25:52 +08:00
    @zzf2017 可以这么说,能帮到别人的广告就是好广告哦
    mritd
        36
    mritd  
       2018-08-07 15:26:03 +08:00
    @zhangtao #34 他是想实现那种 代码更新了 在不停机的情况下,程序 自动 reload 自己的代码;脚本语言好好些,静态编译语言不怎么好搞,而且说实话我感觉这玩意一直很危险....玩意出了个洞,relaod 一个 rm -rf 岂不爽歪歪了
    TommyLemon
        37
    TommyLemon  
       2018-08-07 15:27:30 +08:00
    @zzf2017 评论里连换语言个建议都有,换个库不是更轻松嘛
    zzf2017
        38
    zzf2017  
    OP
       2018-08-07 15:29:45 +08:00
    @mritd 就是这个意思, 这位大哥说的对
    zhangtao
        39
    zhangtao  
       2018-08-07 15:31:27 +08:00
    @mritd 如果只是代码更新 reload,我觉得只实现了一半的平滑;举例来说配置文件更新了,还需要重启容器;所以要做到 web server 能平滑重启才是比较完美的,这一点 golang 可以完美做到,php 也是不行的,fpm 重启一样是不平滑的
    mritd
        40
    mritd  
       2018-08-07 15:40:37 +08:00   ❤️ 1
    @zhangtao #39 平滑重启 那个语言都有自己的套路,跑题了;楼主问的是 动态 reload 自己的代码,据我所知 go 目前唯一实现的就是那个 插件机制,编译成 so 然后实现热插拔; java 我记着是自己实现了 classloader ;由于 java 编译完的玩意理论上是个中间码,所以这方面的东西好像多一点; go 编译完是目标平台二进制,我估计也只有 动态库这个套路了;


    @zzf2017 #38 但是不论哪种语言,我都不建议在生产环境做这种自我更新的行为,这种一旦出现漏洞或者安全问题,后果很严重;实际上 代码热更新与自动化部署最终对于用户来说目标只有一个 ==> "更新无感";要做到这种完全可以在运维层,比如负载均衡器、API 网关处做处理,而在应用层处理闲的有点多余了,就算你应用层做好处理了,将来架构扩展啥的都还得折腾;所以我建议 应用层做好本职工作,提供好服务;运维层也做好本职工作,实现可靠地 后端 HA 代理
    kaedea
        41
    kaedea  
       2018-08-07 15:41:42 +08:00 via Android
    OSGi ?
    Devopsre
        42
    Devopsre  
       2018-08-07 15:49:41 +08:00
    @lgpqdwjh 这是第三方模块做的吧 upsync ?
    qinxi
        43
    qinxi  
       2018-08-07 16:02:05 +08:00
    @TommyLemon 不知道你的评论有什么意义.
    跟问题除了语言都是 java,基本没有任何相关

    再看一下你的过往评论......
    并不是想否定你的开源精神, 只是讨厌你推广的方式
    TommyLemon
        44
    TommyLemon  
       2018-08-07 16:23:39 +08:00
    @qinxi Java web 开发 + 热更新,都符合,怎么会不相关呢?
    rockyou12
        45
    rockyou12  
       2018-08-07 17:24:59 +08:00
    java 代码、class 层面的热更新除了本地开发没多大用,还不好控制服务器上的版本。用 7 层或 4 层的负载均衡更新才是现在的王道,特别是用 k8s、rancher 这些容器平台,甚至不需要自己去配 nginx 规则,在集群中就可以自动帮你切换容器。
    tangzhangming
        46
    tangzhangming  
       2018-08-07 17:34:23 +08:00
    投诚 PHP
    zwy100e72
        47
    zwy100e72  
       2018-08-07 17:55:03 +08:00 via iPhone
    @TommyLemon 还是建议同样的话不要复制粘贴很多次,可以相对提高信息的信噪比😀
    guanhui07
        48
    guanhui07  
       2018-08-07 17:58:00 +08:00
    换 php
    zzf2017
        49
    zzf2017  
    OP
       2018-08-07 18:07:41 +08:00
    @tangzhangming @guanhui07 @zlhsvc @geying
    但是我拒绝
    TommyLemon
        50
    TommyLemon  
       2018-08-07 18:11:08 +08:00
    @zwy100e72 感谢你的建议
    qinxi
        51
    qinxi  
       2018-08-07 18:28:46 +08:00
    @TommyLemon 并没有看到热更新的介绍. 甚至连 '更新' 两个字都没有
    WhatIf
        52
    WhatIf  
       2018-08-07 18:54:57 +08:00 via iPhone
    哪有那么复杂,下载下来的 tomcat 默认就是支持热部署的,除非你的文件时间有问题,认为不应该发布新版本
    热部署有个问题就是内存的使用,很容易 perm size 问题,这时候要重启 tomcat 了
    lgpqdwjh
        53
    lgpqdwjh  
       2018-08-07 19:39:41 +08:00
    @Devopsre 完全基于 lua 实现,这两个月会开源
    sdrzlyz
        54
    sdrzlyz  
       2018-08-07 20:06:42 +08:00 via Android
    热更新 http server 的话,可以用 fd 呀。。。fd 的话,与语言的关系就不大了。。。
    robert9484
        55
    robert9484  
       2018-08-07 22:01:53 +08:00
    蓝绿发布的时候,怎么把将要更新的机器流量停掉?因为不可能茂茂然停掉的,因为可能还有会话存在
    TommyLemon
        56
    TommyLemon  
       2018-08-07 22:21:15 +08:00
    @qinxi 确实有的,只是没写哈。
    开放(GET,HEAD)API 是完全自动化的不用管,前端(客户端)改下请求 JSON 就会自动改变 SQL 语句;
    简单的非开放 API(POST,DELETE,PUT)一般只需要后端修改校验规则的 Request 表就行,规则即时生效。
    以上接口一般在中小型互联网网站与客户端 App 中占 80%-95%,也就是用 APIJSON 大部分 API 都支持热更新。
    https://github.com/TommyLemon/APIJSON
    micean
        57
    micean  
       2018-08-07 22:29:22 +08:00
    如果系统还在负载中,能实现热更新吗? classloader 能顺利卸载?
    如果不在负载中,冷热更新有意义吗?
    Antidictator
        58
    Antidictator  
       2018-08-08 09:04:40 +08:00
    @jiangjz 为什么只有我+1
    jiangjz
        59
    jiangjz  
       2018-08-08 09:15:25 +08:00 via Android
    @Antidictator 可能不符合楼主需求
    Jafee
        60
    Jafee  
       2018-08-08 09:47:32 +08:00
    Jenkins 可以在你 Push 代码的时候自动拉取,然后清理、编译、测试、打包、运行,一条龙服务。
    xxdd
        61
    xxdd  
       2018-08-08 10:12:54 +08:00
    热更新和热部署不一样吧···

    一个不停服务 一个停服务。

    我选择 3L

    Jenkins 只不过把你手动发布改成自动发布。
    755rQlBW742S6Fcc
        62
    755rQlBW742S6Fcc  
       2018-08-08 10:21:56 +08:00
    k8s 轮流更新 或者灰度发布
    internelp
        63
    internelp  
       2018-08-08 12:14:04 +08:00
    3L 的方案,已经稳定使用 2 年了,机器人随时帮我上线。
    mouyase
        64
    mouyase  
       2018-09-03 17:14:48 +08:00
    接触过的热更新基本都是在后面挂在了一部分 lua 的脚本……
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1120 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 19:08 · PVG 03:08 · LAX 11:08 · JFK 14:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.