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