Java Web项目如何做到升级不断掉服务,同时涉及到的相关问题

Java Web项目如何做到升级不断掉服务,同时涉及到的相关问题

原文地址:https://m.oschina.net/question/737237_2203576

现在容器用的是tomcat,做维护比较多,因为程序老是要升级,更新了class文件,必须要重启环境,这样的话用户体验就非常差,而且耽误时间,实际开发中我用了jrebel插件倒是没什么问题,但是生产环境好像都不推荐这个东西,想问下大型的项目是如何做到的呢?

 

一般是这样,首先,网站架设成,负载均衡器+应用服务器+Session服务器的模式。Session服务器常见的用redismemcache都有。更新的时候,先把一部分(比如1/3)应用服务器下线,更新应用,再重新上线。之后再逐步更新剩下的部分。一次更新1/3的话就分三次上线完成。

可以使用nginx做一台backup服务器,先更新backup服务器,测试完成以后,更新其他非backup服务器。

那现在2/3的服务器上是新代码,1/3的服务器上是老代码。 访问这两组的用户看到的功能是不是不一样?这个怎么解决呢?

tomcatglassfishjboss等都是支持热部署的,修改一个类是不用自己手动重启web服务器的,只有修改外部jar包中的类则必须重启,不然jar包会冲突,不会替换,当然这种热部署是重新加载web容器,性能不佳。生产环境是不建议开启热部署的。

 

你可以在网上搜索一下java服务器代码class类热更新,有一大堆资料,当然你也可以用groovyjrubyscale这些本身运行于jvm而且可热更新的脚本语言,甚至jdk自带一套解析运行js脚本的引擎,还有一种方案就是用业务规则引擎,比如Drools,不过这个也要学习另外一种脚本。

 

大且稳健和高并发的项目往往不是单一的语言能做好的,需要多方面的结合,java组件框架这么多,就需要优秀的架构师去利用整合了。我们并不一定能生成开发出多么优秀的东西,但应该合理利用其它优秀的东西。

 

影响有多大,你一台Tomcat,估计用户也不会多到哪里去吧,凌晨进行。几秒种而已

 

1session可以挂Redis或者Memcached.应用服前面挂nginx或者haproxy做负载均衡。或者只做反向代理也行,nginxhaproxy基本是秒起的,不过不建议这么做。

 

2tomcat是可以开启热加载的,不过一般不建议开启,热加载易导致PermGen space溢出。

 

3jdk7以后开始可以做classloader的卸载,jdk8以后从permgen替换到了metaspace,理论上可以避免permgen的溢出问题,有兴趣可以试试自己写一个应用服务器实践一下。

1:旧数据兼容新功能问题。

升级后,比如报表功能新增了字段,那么历史数据可能没有新增加的字段的功能。

 

2:升级的时候session的问题。

升级的时候,如果负载均衡使用的是黏性策略(session不共享),那么升级服务的时候,肯定有些用户的功能会断掉的,所以一般选择晚上,或者人少的时候升级系统。

升级的时候如果负载均衡策略是session共享,同样有问题,有的用户前一秒连上服务器A,下一秒连上服务器B,那么如果B服务器上的功能是新的,但是还不流程并不兼容之前的老服务,那么用户的操作可能进行不下去。

 

最好的策略是黏性策略和Nginx搭配起来用,首先一部分服务器空出来,直到没人用这些空出来的服务器之后,开始进行升级。升级之后。已经连接上旧服务的用户,还是使用之前的服务器进行连接,新接入的用户,旧转接到新的服务器上去。等旧服务所在的服务器已经没有人用的时候,再将旧服务器进行更新。

posted on 2019-03-31 09:34  坚守梦想  阅读(2684)  评论(0编辑  收藏  举报