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

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

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

17265 次点击
所在节点    Java
118 条回复
StarkWhite
2019-07-24 20:26:57 +08:00
@wowo243 它有啥问题呢?
billlee
2019-07-24 22:05:24 +08:00
@StarkWhite #51 一台服务器也可以搞集群,你在一台机器上起两个服务就可以了
okwork
2019-07-24 22:18:30 +08:00
楼主服务器配置了多少内存?

用过一个 4G 内存的机器,项目一启 2G 就没了,后来加到 8G 搞 2 个端口,勉强实现灰度。
oneisall8955
2019-07-24 22:45:37 +08:00
我说下这个情况,让我想起之前几个月的坑。
1.tomcat 有 autodeploy 选项,直接打 war 包到 webapps 下,会自动解压更新项目。但是都是会停掉服务对应的项目重新开启,也就是说虽然 tomcat pid 不变,但是项目还是停掉在开。况且这个热部署有个坑,就是热部署太多次会导致 Compressed class 满了从而 oom 异常了。(这个空间默认 1G,每次看你 class 总内存多少,除一下就知道多少次就回报异常了)
所以这个选项对于楼主没用
2.jrebel 对于开发环境很有用,但有时候还抽风会不生效。这个是 jvm 的一个插件,开发环境我信赖他可以帮助我节约时间,避免多次重启服务器浪费时间。但是对于生产环境,我并不需要每时每刻去实时修改,而是在开发时候,通过频繁修改本地代码实时更新校验修改是否正确,最后再更新到服务器上。况且这个插件还是收费的,你在生产环境里面部署,破解了,被商业检测出来会不会存在什么问题?况且有时候本地调试还会失效,万一生产上面抽风失效了呢?但是自己的小项目,可以尝试这种方式。
3.问题关键是楼主的单体应用里面。假如是 nginx 配置服务集群均衡,配合上 CI 工具写个脚本一个 tomcat 重启更新就很难自己感受到重启这件事了。还节省自己打包,上传,移动到 webapps 这个步骤,除了实际上是要重启服务器这个操作,基本能满足楼主的要求了吧。
愚见,并没有实际解决楼主问题,以上均自己工作经验一点分享。
q397064399
2019-07-24 22:57:03 +08:00
Java 重启太耗时,主要是 bean 的装配,这种工作本来应该放到编译时做的,但是为了更好的解耦,目前 Spring 依赖注入这套玩法灵活性很高,把很多编译时可以做的事情,都放到了运行时,有些 Bean 检查网络连接之类的,反正整个装配阶段是极其耗时的

另外 Jvm 的特性我不是很清楚,

另外热更新的这种事情最好不要做,序列化 /反序列化 会产生很多问题,有些小公司的项目本来就混乱,DB 的 model 类又不做版本管理,我至少吃过好几次序列化的亏,这还不是热更新,考虑到热更新 会出更多问题,没有良好的版本管理跟发布流程 建议不要做这种费力不讨好的事情,现在微服务大行其道,就是要利用小服务 这种加载 运行 速度快的特性,即使出问题 可以通过灰度 等方法来解决。
realpg
2019-07-25 00:37:52 +08:00
@jowan #20
你那些并不是 PHP 的内容啊……
涉及的也不是 PHP 热更新的部分
Weixiao0725
2019-07-25 09:02:10 +08:00
@pursuer 请问有相关的资料吗?如果 java 支持内存删除的话,我想那些打桩工具不需要只在启动的时候注入,任何程序运行的时候都可以重新卸载某个类然后再读入字节码,编辑和载入。
StarkWhite
2019-07-25 10:16:50 +08:00
@billlee 用不同的端口吗?
StarkWhite
2019-07-25 10:18:43 +08:00
@okwork 最低配的阿里云 ECS,1 核 1GHz,1G 内存,40G 云盘。。。
StarkWhite
2019-07-25 10:19:42 +08:00
@oneisall8955 感谢分享,打这么多字,辛苦了哈
pursuer
2019-07-25 10:34:30 +08:00
@Weixiao0725
直接看 classloader 的 api 文档就可以
加载卸载还是要以 classloader 为单位的。没有引用的 classloader,System.gc 就清理了,只是要保证没有引用很困难,要求工程的模块化做的很好。
StarkWhite
2019-07-25 10:36:59 +08:00
@pursuer 被人案例了 apijson 的热更新,但我没有看到它有用 classloader,这个靠谱吗?
https://v2ex.com/t/586011
wangxiaoaer
2019-07-25 10:48:29 +08:00
我们一般开个新端口启动一个新的应用,nginx 指向新应用,重启 nginx,停止老应用。
StarkWhite
2019-07-25 11:01:54 +08:00
@wangxiaoaer 我那个垃圾服务器重启 nginx 得几分钟才能让配置生效。。。
fivesmallq
2019-07-25 11:06:55 +08:00
@StarkWhite https://github.com/playframework/play1 你看错了,你看的那个是 2.x 的,用 scala 重写的,1.x 的才是主要用 java 的。
StarkWhite
2019-07-25 11:12:33 +08:00
@fivesmallq 这样啊,感谢,我再瞅瞅
StarkWhite
2019-07-25 11:19:04 +08:00
@fivesmallq 这个代码量就正常了,像是一个 HTTP Server 框架该有的,哈哈
fivesmallq
2019-07-25 11:26:20 +08:00
@StarkWhite 对的,你跑下 demo,会喜欢的,适合中小型项目
StarkWhite
2019-07-25 11:59:54 +08:00
@fivesmallq 感谢,我试试。现在已经用 SpringBoot 开发了一些接口了。
如果 Play 确实好用,而且迁移成本不高的话,可以迁过去看看。
StarkWhite
2019-07-25 12:00:31 +08:00
@StarkWhite 话说这个框架有么有什么大的坑呢?

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

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

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

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

© 2021 V2EX