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

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论坛上 的演练和清单

快乐编码
拜伦

相关文章:


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

tomcat不停机部署

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/359774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

dataframe建一个空的,创建一个空的Pandas DataFrame,然后填充它?

我想用时间序列计算中的值迭代地填充数据框 . 所以基本上&#xff0c;我想初始化数据框&#xff0c;包括列A&#xff0c;B和时间戳行&#xff0c;全部为0或全部为NaN .然后我会添加初始值并检查此数据&#xff0c;计算前一行中的新行&#xff0c;比如行[A] [t] 行[A] [t-1] 1左…

Android给TextView和EditText等控件设置透明背景、圆角边框

第一种方法&#xff1a;在drawable文件夹下新建一个文件设置背景样式 代码&#xff1a; 在drawable文件夹下面新建text_view_border.xml <?xml version"1.0" encoding"UTF-8"?> <shape xmlns:android"http://schemas.android.com/apk/res/…

将jOOQ与JDBC比较

本文是我们学院课程的一部分&#xff0c;标题为jOOQ –类型安全的数据库查询 。 在SQL和特定关系数据库很重要的Java应用程序中&#xff0c;jOOQ是一个不错的选择。 当JPA / Hibernate抽象过多&#xff0c;JDBC过多时&#xff0c;这是一种替代方法。 它显示了一种现代的领域特…

matlab三维选取二维,基于Matlab绘制二维和三维图形以及其他图形控制函数的使用方法...

Matlab绘图强大的绘图功能是Matlab的特点之一&#xff0c;Matlab提供了一系列的绘图函数&#xff0c;用户不需要过多的考虑绘图的细节&#xff0c;只需要给出一些基本参数就能得到所需图形&#xff0c;这类函数称为高层绘图函数。此外&#xff0c;Matlab还提供了直接对图形句柄…

迭代器生成器可迭代对象_使用迭代器时如何避免ConcurrentModificationException

迭代器生成器可迭代对象Java Collection类是快速失败的&#xff0c;这意味着如果在使用迭代器遍历某个线程的同时更改了Collection&#xff0c;则iterator.next&#xff08;&#xff09;将抛出ConcurrentModificationException 。 在多线程以及单线程环境中都可能出现这种情况。…

Console命令详解,让调试js代码变得更简单

刚刚在浏览关于js方面的博客时发现这个方法挺好玩的&#xff0c;自己爽了一把。 1 <script> 2 console.time(/X(.)X/ test); 3 "XX".match(/X(.)X/); 4 console.timeEnd(/X(.)X/ test); 5 </script> 然后恶补了一下关于Firebug控制台的知识。熟练地使用…

mysql as tmp,启动mysql时显示:/tmp/mysql.sock 不存在的解决办法

启动mysql时显示&#xff1a;/tmp/mysql.sock 不存在的解决方法启动mysql时显示&#xff1a;/tmp/mysql.sock 不存在的解决方法启动mysql时报错的解决(mysql 5.0.45 redhat as43)启动mysql时报错的解决(mysql 5.0.45 redhat as 43)作者: lawzjf(http://lawzjf.itpub.net)发表于…

PHP求体重成绩函数,PHP数组

数组提出一个问题&#xff1a;一个养鸡场有6只鸡&#xff0c;他们的体重分别为3kg&#xff0c;5kg&#xff0c;1k个&#xff0c;3.4kg&#xff0c;2kg&#xff0c;6.kg请问这六只鸡的总体重是多少平均体重是多少请你用现在掌握的技术编一个程序现在我们使用现有的技术来解决问题…

Sublime Text 3插件之Emmet:HTML/CSS代码快速编写神器

一、快速编写HTML代码 1. 初始化 HTML文档需要包含一些固定的标签&#xff0c;比如<html>、<head>、<body>等&#xff0c;现在你只需要1秒钟就可以输入这些标签。比如输入“!”或“html:5”&#xff0c;然后按Tab键&#xff1a; html:5 或!&#xff1a;用于…

批处理停止php服务,通过批处理启动和停止MSSQL+IIS

电脑安装了不少的开发工具环境&#xff0c;如MSSQL2005(2000)IIS\MySQLApache等等&#xff0c;开机和娱乐时为了加快速度&#xff0c;都得把这些占用内存的开发工具系统服务停止&#xff0c;每项手工操作明显麻烦&#xff0c;用批处理就简单多了... 点一下启动&#xff0c;再点…

k8s secret使用_Java Secret:使用枚举构建状态机

k8s secret使用总览 Java中的枚举比许多其他语言更强大&#xff0c;可以导致令人惊讶的用途。 在本文中&#xff0c;我概述了Java 枚举的一些单独功能&#xff0c;并将它们放在一起形成一个状态机。 单例和实用程序类的枚举 您可以非常简单地将枚举用作Singleton或Utility。…

mydumper备份原理和使用方法

mydumper介绍 MySQL自身的mysqldump工具支持单线程工作&#xff0c;依次一个个导出多个表&#xff0c;没有一个并行的机&#xff0c;这就使得它无法迅速的备份数据。 mydumper作为一个实用工具&#xff0c;能够良好支持多线程工作&#xff0c;可以并行的多线程的从表中读入数据…

大津阈值分割matlab实验,OTSU(大津法)分割源程序(MATLAB版)

接下来介绍OTSU方法的原理&#xff1a;***************************************************************************************************************************************************************OTSU法对于具有双峰性质的灰度图像或是彩色图像的某一通道的分割效…

BZOJ-1798 维护序列

线段树。支持区间加、区间乘、区间查询和。 标记下移还有取模要注意。 var n,p,q,i,s,t:longint; a:int64; num,n1,n2,n3:array[0..500000] of int64; procedure build(o,l,r:longint); var m,i:longint; begin m:(lr) div 2; if lr then begin n1[o]:num[l];…

matlab pca可视化,利用Matlab实现PCA demo展示

input_data rand(1000,3);%随机生成1000个样本&#xff0c;每个样本有x,y,z三个属性 figure(1);%控制画图的窗口为1hold off;%使当前轴和图形不再具备被刷新的性质&#xff0c;关闭在此基础上再画图plot3(input_data(:,1), input_data(:,2), input_data(:,3), ‘ro‘);%% Func…

matlab短均线滞后项,均线理论的滞后性问题

对移动平均线有一定了解的人都会发现移动平均线理论存在一个缺点&#xff0c;那就是移动平均线的信号具有一定的滞后性&#xff0c;这是制约移动平均线运用的最大因素。介绍了均线的计算方法.从它的计算方法中也能看出目前均线的数值要受到前一阶段股价的影响&#xff0c;而且均…

IOS侧滑框架合集

侧滑框架 https://github.com/gresrun/GHSidebarNav https://github.com/ipup/PPRevealSideViewController https://github.com/gotosleep/JASidePanels https://github.com/jamztang/JTRevealSidebarDemo https://github.com/ECSlidingViewController/ECSlidingViewController…

python捕获摄像头帧_Xuggler教程:帧捕获和视频创建

python捕获摄像头帧注意&#xff1a;这是我们的“ Xuggler开发教程 ”系列的一部分。 到目前为止&#xff0c;在我们的Xuggler教程系列中&#xff0c;我们已经对视频处理的Xuggler进行了介绍&#xff0c;并讨论了转码和媒体修改 。 在本教程中&#xff0c;我们将看到如何解码视…

【python核心编程】第六章 序列

1、操作符 &#xff08;1&#xff09;成员关系操作符&#xff1a;in 、not in >>> string abcdefg>>> a in stringTrue>>> h in stringFalse>>> h not in stringTrue *补充知识*&#xff1a;string模块 >>> import string>>…

java物业管理系统设计,JAVA物业管理系统设计与实现(论文+源代码)

【实例简介】JAVA物业管理系统设计与实现(论文源代码)【实例截图】【核心代码】JAVA物业管理系统设计与实现(论文源代码)└── JAVA物业管理系统设计与实现(论文源代码)├── JAVA物业管理系统设计与实现(论文源代码)│ ├── JAVA物业管理系统│ │ ├── JWS│ │…