tomcat不停机部署

亲爱的大家,

如果您认为Tomcat不能再进步,那您就错了。 Tomcat 7引入了所谓的并行部署 。 这是由SpringSource / VMWare贡献的。

简而言之,并行部署是指能够并行部署一个以上版本的Web应用程序,从而使所有版本都可以在完全相同的URL下使用。

考虑一下。 如果您有新版本的应用程序,则可以将其放到运行旧版本的Tomcat中 ,它将运行。 实际上,它们都将起作用。 Tomcat处理应用程序版本之间的所有会话管理和流量路由。 无需重新启动Tomcat 。 无需停止处理请求。 无需与您的老板谈论停机时间。 您的老板无需与任何客户谈论停机时间。

让我们看看实际情况,对吧? 使用下面的命令,您可以启动一个最小的Web应用程序来演示此功能。

$ mkdir WEB-INF
$ echo "" > WEB-INF/web.xml
$ echo 'old version ' > index.jsp
$ jar cf foo##001.war WEB-INF index.jsp
$ echo 'NEW version ' > index.jsp
$ jar cf foo##002.war WEB-INF index.jsp

现在,您有两个名为foo ## 001.warfoo ## 002.war的 Web应用程序。 ## 001## 002指定WAR文件的版本号。 每个都有自己的索引页面,该页面显示当前时间以及它是旧的还是新的Web应用程序。 创建此功能的人员选择了一个非常简单的解决方案,用于告诉Tomcat什么是替代版本。 您要做的就是在WAR的文件名上加上## <version> 。 简单有效,如果看起来有些古怪。

现在部署Web应用程序的“旧”版本。

$ cp foo##001.war apache-tomcat-7.0.12/webapps/

打开浏览器,输入WAR文件的URL(例如http:// localhost:8080 / foo )并注意时间。 请注意,您在URL上看不到版本号。 页面每秒自动刷新。 在表面之下, Tomcat将与您的浏览器建立会话。 以后再说。

现在部署Web应用程序的“新”版本。

$ cp foo##002.war apache-tomcat-7.0.12/webapps/

请注意,在已经打开的浏览器窗口中,时间仍在滴答作响,并且仍显示旧版本。 打开第二个浏览器,在该浏览器中,也打开http:// localhost:8080 / foo 。 为了获得最佳结果,请使用完全不同的浏览器以避免任何会话异常。 我使用Safari和Opera进行了测试。

您应该看到第二个浏览器选择了新的Web应用程序,而旧的Web应用程序仍在为第一个浏览器提供服务。

很整洁吧?

好的,您是否破坏了部署并想回滚? 很简单,只需删除新版本, Tomcat就会自动退回到使用旧版本。 辛苦了 现在就试试:

$ rm apache-tomcat-7.0.12/webapps/foo##002.war

您会注意到网页会自动切换为使用旧版本的应用程序。

您将必须制定自己的部署策略。 您可能选择让旧版本耗尽。 在旧应用程序上的所有会话都到期后,您可以从Tomcat中删除旧部署。 另一方面,您可以只保留旧代码。 它不会造成任何伤害。

当您想开始在Tomcat服务器上使用版本化的WAR文件时,需要考虑一些事项。 因此,在您离开并更改公司的部署策略之前,请检查以下列表。

  1. 内部缓存应该是直写的,并且很快过期
  2. 您需要启用会话
  3. 日志去哪儿了?
  4. 磁盘文件和目录需要共享
  5. 没有TCP套接字监听器
  6. 您的应用必须能够取消部署

我将按顺序解释每个。 大多数是主题的变体; 考虑一下您的代码对机器资源所做的假设。

内部缓存应该是直写的,并且很快过期

同一Web应用程序的不同版本各自具有自己的类上下文。 这意味着您需要检查Web应用程序中具有的所有本地缓存​​。 如果您主动缓存并长时间保留缓存的信息,则该Web应用程序的一个版本可能看不到另一个版本所做的更改。

设想一个情况,其中两个版本的Web应用程序都使用相同的数据库,并且都具有本地缓存​​以避免访问该数据库。 如果该Web应用程序的一个版本更改了数据库中的记录,则其他版本将看不到该更改,直到该信息自己的缓存版本过期为止。

如果您在Web应用程序中执行任何内存中缓存,请在确定缓存不会提供不可接受的过时信息之前不要使用并行部署。

您需要启用会话

Tomcat使用自己的会话管理来确定应由哪个版本的Web应用程序处理哪些请求。 如果您打算自己实施会话处理,或者在Tomcat中关闭会话处理,则并行部署将对您不起作用。

日志去哪儿了?

您可能指定将日志记录写入某个地方的日志文件。 如果未在日志文件名中使用应用程序的完整上下文名称,则可能会遇到两种情况:Web应用程序的两个版本都写入同一日志文件。 这样做的问题是,您可能不知道应用程序的哪个版本生成了在该文件中找到的输出。

磁盘文件和目录需要共享

Java EE设计人员的意图始终是使Web应用程序独立于底层机器和文件系统。 如果您的应用程序使用数据文件,请花点时间考虑一下当您的Web应用程序的两个版本开始读写它们时会发生什么。

特别是,请考虑将Java的监视器和锁限制在单个上下文中。 因此,如果您使用某种类型的锁来保护对文件的访问,则拥有该Web应用程序的两个版本意味着您在JVM中具有两个锁,从而可能允许两个线程对其进行访问。

没有TCP套接字监听器

一些应用程序不仅仅服务于HTTP请求。 他们有自己的TCP套接字处理程序为客户端提供服务。 通过部署一个以上版本的Web应用程序,您可以获得多个侦听器。 显然这是行不通的。 只有一个侦听器可以在任何给定端口上侦听。

您的应用必须能够取消部署

如果您希望能够回退已损坏的发行版,或者希望清理Web应用程序的旧的,未使用的版本,则需要彻底取消部署Web应用程序。 幸运的是, Tomcat也可以帮助您。

我希望这些警告不会使您停止使用Tomcat中的零停机时间部署。 您可能需要解决一些问题才能使其正常运行。 但是,让我们面对现实吧,通过使您的应用程序对资源的假设更少,无论如何您将获得一个更强大的应用程序。

PS。 我喜欢将SVN修订号用作WAR版本命名方案。 因此,我的WAR文件名为foo ## <svn版本=””>。war 。 唯一要注意的是,将版本作为字符串进行比较以确定版本顺序。 因此,您可能必须对版本号进行零填充以确保正确订购。

参考: Tomcat中的零停机部署(和回滚); JCG合作伙伴 Kees Jan在Java Monitor论坛上 的演练和清单

快乐编码
拜伦

相关文章:

  • 每个程序员都应该知道的事情
  • 正确记录应用程序的10个技巧
  • 软件设计法则
  • Java最佳实践系列
  • 生存在荒野西部开发过程中的9条提示

翻译自: https://www.javacodegeeks.com/2011/06/zero-downtime-deployment-and-rollback.html

tomcat不停机部署

tomcat不停机部署_Tomcat中的零停机部署(和回滚); 演练和清单相关推荐

  1. Tomcat中的零停机部署(和回滚); 演练和清单

    亲爱的大家, 如果您认为Tomcat不能再进步,那您就错了. Tomcat 7引入了所谓的并行部署 . 这是由SpringSource / VMWare贡献的. 简而言之,并行部署是一种能够并行部署一 ...

  2. mysql事务管理及spring声明式事务中主动异常抛出使数据库回滚

    mysql事务管理及spring声明式事务中主动异常抛出使数据库回滚 参考文章: (1)mysql事务管理及spring声明式事务中主动异常抛出使数据库回滚 (2)https://www.cnblog ...

  3. java更新数据库错误就回滚_Java 中对数据库操作时的 回滚

    Connection conn=null; conn.rollback()就可以回滚 //用jdbc连接数据库 //举例子,比如你在写一个级联删除的方法的时候,为了保证数据完整性,删除的时候一定要确定 ...

  4. java mysql 回滚_Java 中对数据库操作时的 回滚

    Connection conn=null; conn.rollback()就可以回滚 //用jdbc连接数据库 //举例子,比如你在写一个级联删除的方法的时候,为了保证数据完整性,删除的时候一定要确定 ...

  5. tomcat配置mysql数据源_Tomcat中配置mysql数据源

    上面的就是老师给我们的关于数据库配置的文档,看起来好像不长,但是有几点需要特别注意,下面我就自己的理解来谈谈能关系到成败的几点,同时,将我出错的原因说明一下. 1.先看这段配置: type=" ...

  6. Nhibernate中的连接超时时事务回滚引发异常的处理方法

    最近在做一个短信项目,采用的nhibernate+sqlserver.因为数据量大,所以采用多线程的方式.有时会触发超时.当超时时事务再回滚也会触发异常nhibernate Transaction n ...

  7. springboot事务回滚源码_Spring Boot中的事务是如何实现的

    1. 概述 一直在用SpringBoot中的@Transactional来做事务管理,但是很少想过SpringBoot是如何实现事务管理的,今天从源码入手,看看@Transactional是如何实现事 ...

  8. springboot 事务手动回滚_Spring Boot中的事务是如何实现的

    1. 概述 一直在用SpringBoot中的@Transactional来做事务管理,但是很少想过SpringBoot是如何实现事务管理的,今天从源码入手,看看@Transactional是如何实现事 ...

  9. 自动化代码部署、代码回滚、命令执行软件之capistrano

    Hi,本周第一天没什么事,所以就先分享一下我研究自动化代码部署与回滚软件的经验.这个软件有什么用途?主要是解决自动进行代码的部署,避免手动部署时出现错误,节省时间,同时在出现问题的时候,能回滚到之前的 ...

最新文章

  1. 机房收费系统总结【3】-数据库细节
  2. jsp使用mysql技术分页_JSP分页技术实现
  3. 配置kali linux
  4. 5.3 使用tensorflow搭建GoogLeNet网络 笔记
  5. 02/03_Pytorch安装、Conda安装Pythorch,换源、pytorch官网、验证、安装jupyter、卸载、安装、启动jupyter、配置Jupyter notebook、使用
  6. 应用层勾子IAT HOOK(源码)
  7. 牛客题霸 [ 未排序数组中累加和为给定值的最长子数组长度] C++题解/答案
  8. kuka机器人焊接飞溅大_库卡机器人KCP4示教器屏幕校准方法
  9. (转)会议期刊论文发表介绍(计算机科学领域)
  10. chrome+android+浏览器下载图片不显示,chrome谷歌浏览器部分图片不显示怎么办
  11. 小米11新旗舰通过3C认证:支持最高67.1W快充
  12. android 控件xpath软件_Appium-关于appium的原生控件的 xpath 定位问题及常用方法
  13. debian 8 和centos 配置java 环境变量的正确姿态
  14. 网站小尾巴 流量统计 网站流量统计 解决方案
  15. 【C++拾遗之二】fseek、ftell函数读取文件
  16. OpenGL 中的 Render To Texture
  17. mysql修改数据库字段数值_mysql修改数据库字段的操作
  18. 无人机和地面三维激光扫描仪在1:500城市基本地形图测绘中的应用
  19. 注册表功能大全(转)
  20. 以太网芯片W3100A到W3150A+的移植笔记(一)

热门文章

  1. 属性编辑器未在PropertyEditorManager中注册?
  2. 什么样的事才是有意义的
  3. ssm(Spring+Spring mvc+mybatis)Dao层实现类——DeptDaoImpl
  4. oracle基本笔记整理及案例分析2
  5. 2018蓝桥杯省赛---java---A---7(三体攻击)
  6. python简单爬虫课题_VS2019python爬虫入门
  7. 队列和消息队列_消息队列概述[幻灯片]
  8. java 编程工具_Java开发工具可以促进编程!
  9. netflix测试能不能看_Netflix监管者测试–引入知事,准官员
  10. observable_在Completablefuture和Observable之间转换