最近开发了 java web 的项目 ,把代码 打成 war 包 放到服务器上,但是 我发现每次都要删除旧 war 包,添加新 war 包才能 发布新的版本,问问各位大佬,java 有没有什么 热更新技术?
最近开发了 java web 的项目 ,把代码 打成 war 包 放到服务器上,但是 我发现每次都要删除旧 war 包,添加新 war 包才能 发布新的版本,问问各位大佬,java 有没有什么 热更新技术?
1
zzf2017 OP 自己顶一顶
|
2
huiyadanli Aug 7, 2018
灰度发布?
|
3
FanError Aug 7, 2018
nginx 放在前端,upstream 2 个 tomcat
停掉一个,更新,启动, 再停到另一个,更新,启动。 |
4
ioth Aug 7, 2018
一个项目一个 war
恐怖 |
5
guixiexiezou Aug 7, 2018
spring loaded 了解下( java agent 的具体应用)
或者 java agent 了解下 亦或者 classloader 类加载机制了解下, 这两种都可以实现热更新功能。 如果想体验强大的功能,JLabel 可以试试 |
6
jiangjz Aug 7, 2018 via Android
Jenkins 了解一下
|
7
momocraft Aug 7, 2018
两个容器,半夜偷偷换掉一个,再换掉一个
|
8
nongmei Aug 7, 2018
整两台服务器,外边放个 nginx 做负载均衡
|
9
xiaoyangsa Aug 7, 2018
现在用的 3 楼做法,关注下看看有没啥黑科技
|
10
sunchen Aug 7, 2018
动态代理
|
11
mortonnex Aug 7, 2018
@guixiexiezou JRebel
|
14
wxsm Aug 7, 2018
oracle weblogic
|
15
lihongjie0209 Aug 7, 2018
热更新不懂, 但是你可以用 expand war + rsync 来增量更新, 可以使更新时间大大缩短.
|
16
yanaraika Aug 7, 2018
复杂一点的话 k8s
|
17
derrickT Aug 7, 2018 灰度发布
|
18
quickma Aug 7, 2018
灰度发布吧,没必要上热更新,不可控总感觉。
|
19
wanghui Aug 7, 2018 via iPhone
没明白楼主的真实诉求是什么,你到底要热部署,还是要自动化部署?
|
20
mritd Aug 7, 2018 via iPhone 从理论上来说,线上不应该做 java 的热部署(class 扫描,动态加载); 你应当实现的是自动化部署,比如简单点上面说的 nginx 负载,复杂点上 k8s 容器集群
|
21
geying Aug 7, 2018
换 PHP
|
22
LichMscy Aug 7, 2018
多个 pod 拉起新的以后停掉旧的
|
24
zlhsvc Aug 7, 2018 换 PHP 就没有这个问题了
|
25
xiaoheshang Aug 7, 2018
我们就用的 3 楼的做法,只不过是用 jenkins 实现的,一直都很顺利。
|
26
RealLiuSha Aug 7, 2018 这样 |
27
JohnZorn Aug 7, 2018
使用 git 管理 弄个钩子好像就可以
|
29
lurenw Aug 7, 2018
收费:JRebel
免费:DECVM web 项目自动化+灰度发布就得了,用啥热更新。热更新最方便的地方还是辅助开发,不需要频繁 redeploy |
30
TommyLemon Aug 7, 2018
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 |
31
zzf2017 OP @TommyLemon 这是在打广告吗
|
33
ETiV Aug 7, 2018 via iPhone
nginx reload 热更新、upstream 配权重 灰度
|
34
zhangtao Aug 7, 2018
换 golang
|
35
TommyLemon Aug 7, 2018
@zzf2017 可以这么说,能帮到别人的广告就是好广告哦
|
36
mritd Aug 7, 2018
@zhangtao #34 他是想实现那种 代码更新了 在不停机的情况下,程序 自动 reload 自己的代码;脚本语言好好些,静态编译语言不怎么好搞,而且说实话我感觉这玩意一直很危险....玩意出了个洞,relaod 一个 rm -rf 岂不爽歪歪了
|
37
TommyLemon Aug 7, 2018
@zzf2017 评论里连换语言个建议都有,换个库不是更轻松嘛
|
39
zhangtao Aug 7, 2018
@mritd 如果只是代码更新 reload,我觉得只实现了一半的平滑;举例来说配置文件更新了,还需要重启容器;所以要做到 web server 能平滑重启才是比较完美的,这一点 golang 可以完美做到,php 也是不行的,fpm 重启一样是不平滑的
|
40
mritd Aug 7, 2018 @zhangtao #39 平滑重启 那个语言都有自己的套路,跑题了;楼主问的是 动态 reload 自己的代码,据我所知 go 目前唯一实现的就是那个 插件机制,编译成 so 然后实现热插拔; java 我记着是自己实现了 classloader ;由于 java 编译完的玩意理论上是个中间码,所以这方面的东西好像多一点; go 编译完是目标平台二进制,我估计也只有 动态库这个套路了;
@zzf2017 #38 但是不论哪种语言,我都不建议在生产环境做这种自我更新的行为,这种一旦出现漏洞或者安全问题,后果很严重;实际上 代码热更新与自动化部署最终对于用户来说目标只有一个 ==> "更新无感";要做到这种完全可以在运维层,比如负载均衡器、API 网关处做处理,而在应用层处理闲的有点多余了,就算你应用层做好处理了,将来架构扩展啥的都还得折腾;所以我建议 应用层做好本职工作,提供好服务;运维层也做好本职工作,实现可靠地 后端 HA 代理 |
41
kaedea Aug 7, 2018 via Android
OSGi ?
|
43
qinxi Aug 7, 2018
|
44
TommyLemon Aug 7, 2018
@qinxi Java web 开发 + 热更新,都符合,怎么会不相关呢?
|
45
rockyou12 Aug 7, 2018
java 代码、class 层面的热更新除了本地开发没多大用,还不好控制服务器上的版本。用 7 层或 4 层的负载均衡更新才是现在的王道,特别是用 k8s、rancher 这些容器平台,甚至不需要自己去配 nginx 规则,在集群中就可以自动帮你切换容器。
|
46
tangzhangming Aug 7, 2018
投诚 PHP
|
47
zwy100e72 Aug 7, 2018 via iPhone
@TommyLemon 还是建议同样的话不要复制粘贴很多次,可以相对提高信息的信噪比😀
|
48
guanhui07 Aug 7, 2018
换 php
|
49
zzf2017 OP |
50
TommyLemon Aug 7, 2018
@zwy100e72 感谢你的建议
|
51
qinxi Aug 7, 2018
@TommyLemon 并没有看到热更新的介绍. 甚至连 '更新' 两个字都没有
|
52
WhatIf Aug 7, 2018 via iPhone
哪有那么复杂,下载下来的 tomcat 默认就是支持热部署的,除非你的文件时间有问题,认为不应该发布新版本
热部署有个问题就是内存的使用,很容易 perm size 问题,这时候要重启 tomcat 了 |
53
RealLiuSha Aug 7, 2018
@Devopsre 完全基于 lua 实现,这两个月会开源
|
54
sdrzlyz Aug 7, 2018 via Android
热更新 http server 的话,可以用 fd 呀。。。fd 的话,与语言的关系就不大了。。。
|
55
robert9484 Aug 7, 2018
蓝绿发布的时候,怎么把将要更新的机器流量停掉?因为不可能茂茂然停掉的,因为可能还有会话存在
|
56
TommyLemon Aug 7, 2018
@qinxi 确实有的,只是没写哈。
开放(GET,HEAD)API 是完全自动化的不用管,前端(客户端)改下请求 JSON 就会自动改变 SQL 语句; 简单的非开放 API(POST,DELETE,PUT)一般只需要后端修改校验规则的 Request 表就行,规则即时生效。 以上接口一般在中小型互联网网站与客户端 App 中占 80%-95%,也就是用 APIJSON 大部分 API 都支持热更新。 https://github.com/TommyLemon/APIJSON |
57
micean Aug 7, 2018
如果系统还在负载中,能实现热更新吗? classloader 能顺利卸载?
如果不在负载中,冷热更新有意义吗? |
58
Antidictator Aug 8, 2018
@jiangjz 为什么只有我+1
|
59
jiangjz Aug 8, 2018 via Android
@Antidictator 可能不符合楼主需求
|
60
Jafee Aug 8, 2018
Jenkins 可以在你 Push 代码的时候自动拉取,然后清理、编译、测试、打包、运行,一条龙服务。
|
61
xxdd Aug 8, 2018
热更新和热部署不一样吧···
一个不停服务 一个停服务。 我选择 3L Jenkins 只不过把你手动发布改成自动发布。 |
62
755rQlBW742S6Fcc Aug 8, 2018
k8s 轮流更新 或者灰度发布
|
63
internelp Aug 8, 2018
3L 的方案,已经稳定使用 2 年了,机器人随时帮我上线。
|
64
mouyase Sep 3, 2018
接触过的热更新基本都是在后面挂在了一部分 lua 的脚本……
|