Java 是不是没有好的热部署方案?

2019-07-24 09:46:43 +08:00
 StarkWhite

像 Node,PHP 推代码到服务器就行了,Java 每次打 jar/war 包、停止旧服务、启动新服务,挺麻烦的,从启动到能访问还得等几分钟。

17263 次点击
所在节点    Java
118 条回复
StarkWhite
2019-07-24 15:02:44 +08:00
@fivesmallq
例子挺全的,但一看核心库居然只有 10 多个类。
原来我以为它基于 Spring,怎么看都不像,用它岂不是得还框架了。。。
https://github.com/playframework/playframework/tree/master/core/play-java/src/main/java/play
yuankui
2019-07-24 15:08:15 +08:00
我们之前,有个 spring 应用,启动很慢,我专门统计了下每个 bean 的初始化时间长。后来发现主要是以下几类:

- 那些需要远程连接服务进行初始化的,比如 RPC 连接初始化
- 那些需要加载大量数据到内存中的(比如建立一个字典)


所以,要想应用实现热加载,关键是让应用无状态,这就是 php 的主要是方式。

另外一个就是状态向后兼容,比如之前内存保存在一个对象 class A(a,b,c),后面加了个字段 class A'(a,b,c,d),目前 jvm 里面还没有工具支持,将这种数据 A 对象升级成 A'对象,但是实际上,让人来做,是可以做的。js 是可以的,因为 js 运行时全是 object ( kv ),天然具有向后兼任性。所以即使 js 应用,有状态,数据还是能做到兼容,不需要重启。

所以综上,主要是问题其实不是 Java 的问题,而是框架的问题,也就是 spring 的问题。(楼上不是有人说 play 支持热加载吗?我没具体看啥原理哈)

可能目前这个还不是痛点,就是大家遇到了,也是尽量先不启动应用进行开发,而是进行“单元开发”=》“单元测试”

等差不多了, 在起应用,然后这个时候,即使有小 bug,也可以利用 IDE 的动态加载,将 body 体里面的实现替换,这个是不需要重启的。
arrow8899
2019-07-24 15:31:28 +08:00
拆分服务,减小部署包大小;
减少不必要的依赖,加快启动速度;
无状态;
分布式负载均衡,滚动升级。
StarkWhite
2019-07-24 15:34:36 +08:00
@yuankui 赞,感谢分享。网上看到说 Play 也是基于 hotswap 的原理,看起来也会有 #58 楼 hotswap 的各种不支持的问题。
StarkWhite
2019-07-24 15:35:50 +08:00
@cominghome 个人小项目也整个流水线?真是袁隆平的锅 /狗头
kaneg
2019-07-24 15:37:37 +08:00
JSP 可以解决你的问题
StarkWhite
2019-07-24 15:51:45 +08:00
@kaneg JSP 这种古董技术都要淘汰了。。。现在都是前后端分离
freexyxyz
2019-07-24 15:58:32 +08:00
@StarkWhite 你想实现 “提交代码……然后服务器自动更新好” 用 CI/CD 工具就行……流水线就是 devops 里的一个叫法,可以玩的很高级,也可以往简单了玩……你配个持续部署出来就行了
StarkWhite
2019-07-24 16:39:26 +08:00
@freexyxyz 在公司也用 Jenkins,自己业务搞个小项目也用它不划算啊
StarkWhite
2019-07-24 16:39:59 +08:00
@StarkWhite 业余
StarkWhite
2019-07-24 17:13:42 +08:00
@rockyou12 是啊,费力不讨好。
低配 ECS 云服务器,Nginx 重载配置到生效也得好几分钟 /囧
StarkWhite
2019-07-24 17:14:48 +08:00
@efaun 目前在做个人小项目,单机、单体服务,搞分布式运维麻烦,还要钱啊
StarkWhite
2019-07-24 17:15:21 +08:00
@Xbluer 不止是重启,还要打包,上传。。。
efaun
2019-07-24 17:21:40 +08:00
@StarkWhite #70 低成本解决的话就弄定时任务,找个深夜无人的时候自动化发布
yiyi11
2019-07-24 17:43:32 +08:00
如果你要的是只是效率,而不是真正的不停机更新,那么可以试下这个:
https://help.aliyun.com/document_detail/108590.html?spm=a2c4g.11174283.3.5.1813190cmVAJlX

Alibaba Cloud Toolkit
idea 插件
配置服务器的地址,一键打包,上传,部署 springboot 应用。
StarkWhite
2019-07-24 18:04:56 +08:00
@efaun 唉,项目太小弄定时任务不划算
StarkWhite
2019-07-24 18:06:28 +08:00
@Takamine 楼上(#34 )说 devtools 太 low 了,实际上还是重启。这不是我想要的效果。。。
wowo243
2019-07-24 18:37:16 +08:00
jrebel 应该是最好的了,但是个人认为依然不够好
momocraft
2019-07-24 18:44:31 +08:00
我觉得至少要保证版本变更是原子的吧

所谓 “ PHP 支持热加载” 听上去像面向巧合运营
Xbluer
2019-07-24 18:48:42 +08:00
@StarkWhite maven 负责编译测试打包,scp 上传,,ssh 远程命令重启。以上用一个脚本封装一下完全没问题。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/585647

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX