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搭配起来用,首先一部分服务器空出来,直到没人用这些空出来的服务器之后,开始进行升级。升级之后。已经连接上旧服务的用户,还是使用之前的服务器进行连接,新接入的用户,旧转接到新的服务器上去。等旧服务所在的服务器已经没有人用的时候,再将旧服务器进行更新。

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

  1. Java Web项目中连接Access数据库的配置方法

    本文是对前几天的"JDBC连接Access数据库的几种方式"这篇的升级.因为在做一些小项目的时候遇到的问题,因此才决定写这篇博客的.昨天已经将博客公布了.可是后来经过一些验证有点问 ...

  2. JAVA WEB项目中各种路径的获取

    JAVA WEB项目中各种路径的获取 标签: java webpath文件路径 2014-02-14 15:04 1746人阅读 评论(0) 收藏 举报  分类: JAVA开发(41)  1.可以在s ...

  3. 怎么将java web 项目导入idea 中

    1.将 java web 项目导 入idea 中, 显示 然后进行 Configure 配置. 2. 点击 open module settings. 3. 4. 选择jar包. 5. 6. 配置to ...

  4. 在cmd命令行使用Maven Archetype插件 generate命令创建简单的java web项目

    前提: 1.下载apache-maven:https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.3.9/binaries/apache ...

  5. Java Web项目报错java.lang.NullPointerException at org.apache.jsp.front.index_jsp._jspInit(index_jsp.java:30)

    环境:myeclipse+tomcat6+jdk6 今天搭建了一个Java Web项目,访问index.jsp时报如下错误: 严重: Servlet.service() for servlet jsp ...

  6. 使用Spring Boot来加速Java web项目的开发

    我想,现在企业级的Java web项目应该或多或少都会使用到Spring框架的. 回首我们以前使用Spring框架的时候,我们需要首先在(如果你使用Maven的话)pom文件中增加对相关的的依赖(使用 ...

  7. Linux(Centos)之安装tomcat并且部署Java Web项目

    1.准备工作 a.下载tomcat linux的包,地址:http://tomcat.apache.org/download-80.cgi,我们下载的版本是8.0,下载方式如图:          b ...

  8. 阿里云部署Java web项目初体验(转)

    林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文主要讲了如何在阿里云上安装JDK.Tomcat以及其配置过程.最后以一个实例来演示在 ...

  9. 【转】Java Web 项目获取运行时路径 classpath

    Java Web 项目获取运行时路径 classpath 假设资源文件放在maven工程的 src/main/resources 资源文件夹下,源码文件放在 src/main/java/下, 那么ja ...

随机推荐

  1. Queue接口的实现类竟然有一个是LinkedList,一个是优先队列(同一个接口,只改了不同的实现类,附源码)

    输出是: Queue接口底层换一个实现类,照样的是调用Queue接口中的方法 import java.util.HashMap; import java.util.LinkedList; import ...

  2. python使用dns轮循检测web服务器是否异常

    我使用的是python2.7,我本来另装了一个python3.6,发现无法安装dnspython,于是只能换回来了 import dns.resolver #这个需要另外下载并安装(下载地址www.d ...

  3. vi常用操作

    什么是vi: vi是Linux/Unix底下最常用的文本编辑器,可以理解为和Windows下的txt一样,咱们一般操作linux服务器的时候都是没有图形化界面的, 怎么移动光标,到哪个位置,替换修改什 ...

  4. 我发起了一个 .Net 平台上的 开源项目 知识图谱 Babana Map 和 文本文件搜索引擎 Babana Search

    起因 也是 前几天 有 网友 在 群 里发了   知识图谱   相关的文章, 还有 有 网友 问起   NLog -> LogStash -> Elastic Search  的 问题, ...

  5. 集成学习之AdaBoost

    AdaBoost 当做出重要决定时,大家可能会考虑吸取多个专家而不只是一个人的意见,机器学习也是如此,这就是集成学习的基本思想.使用集成方法时有多种形式:可以是不同算法的集成,也可以是同一算法在不同设 ...

  6. Linux系统如何模拟Http的get或post请求?

    一.get请求: 1.使用curl命令: curl “http://www.baidu.com” 如果这里的URL指向的是一个文件或者一幅图都可以直接下载到本地 curl -i “http://www ...

  7. Java模板引擎之Freemarker

    Freemarker定义: 一款模板引擎 Freemarker是一个web图层组件不是web框架,解析服务端数据到页面 小例子: <#list 集合 as item> list标签对集合进 ...

  8. 记录一次linux删除mysql

    service mysqld status service mysqld stop ps –ef | grep mysql perl-DBD-MySQL-4.013-3.el6.x86_64 //删除 ...

  9. IDEA中使用springBoot+gradle构建多模块项目

    https://blog.csdn.net/forMelo/article/details/78995875

  10. 使用PHPMAILER实现PHP发邮件功能

    第一步: 打开网址https://github.com/PHPMailer/PHPMailer/ 下载PHPMailer,PHPMailer 需要 PHP 的 sockets 扩展支持,而登录 QQ ...