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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

最新文章

  1. 两种遍历list
  2. Hibernate注解方式配置-继承关系
  3. [BUG集] android 安卓项目中ORMLITE框架 Must specify one of id, generatedId, and generatedIdSequence with Id
  4. BZOJ1483——[HNOI2009]梦幻布丁
  5. NET 2.0 OCR文字识别技术(Tesseract 引擎)[转]
  6. 285. Inorder Successor in BST
  7. 用RSA实现Web单点登录密码的加密传输
  8. ubuntu12.04已安装SQLite3 而简单易用
  9. iphone 屏幕投射到Mac上
  10. QPixmap有缓冲区的
  11. [Angular 2] Get start with Firebase
  12. web.xml中servlet, bean, filter, listenr 加载顺序汇总
  13. Skynumber
  14. TCP为什么不是两次握手而是三次?
  15. JavaScript状态模式及状态机模型
  16. Confluence 6 PostgreSQL 输入你的数据库细节
  17. Python的图像库
  18. Android FileUtils 文件操作类
  19. unity物理检测的几种方式
  20. SV搭建验证环境

热门文章

  1. 【mybatis源码学习】mybatis和spring框架整合,我们依赖的mapper的接口真相
  2. 使用python比较两个文件的不同之处
  3. makefile——小试牛刀
  4. pipenv 方便的python 开发工作流工具
  5. madlib centos yum 包安装
  6. nginx+php windows安装配置
  7. oracle-pl/sql之二
  8. 数据库与java的连接
  9. redhat 6.4下PXE+Kickstart无人值守安装操作系统
  10. ML(7)——支持向量机1(构建支持向量机)