不重启Tomcat服务实现网站应用程序的部署和回滚

2011年06月11日 其他资源 12条评论 阅读11817次

 

不重启 Tomcat 服务实现部署 ( 和回滚 )

如果你认为 tomcat 不会更好了,那你就想错了。 Tomcat7 引进了由 SpringSource/VMWare 贡献的的一个叫做“并行部署”的新功能。

简单地说,并行部署能够使用同一个 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.war” 和“ foo##002.war” 的两个版本, ##001 ##002 指定了 war 文件的版本数。每一个版本都有自己独自的可显示当前时间和它是否为新旧版本的索引页面。创建这个新特征的开发人员们选择了一个令人惊叹地简单的解决方案来告诉 Tomcat 哪个是可供选择的版本。所有你要做的是在 war 文件名中加入 ##<version> 。这的确很简单,有效。

下面部署 web 应用程序的老版本。

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

打开浏览器,输入 war 文件的地址(如 http://localhost:8080/foo ),观察页面上时间一秒一秒地走过。注意,你并没有看到地址栏中有这个应用程序的版本号。这个页面按秒自动刷新,不看这个表层现象, Tomcat 会和你的浏览器建立一个会话,以后还会有更多。

下面部署 web 应用程序的新版本。

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

注意,在已经打开的浏览器窗口中,页面上显示的时间仍然一秒一秒地走过,页面上仍旧显示旧版本信息。下面,打开第二个浏览器窗口,仍然在地址栏中输入 http://localhost:8080/foo ,为得到最好效果,最好使用内核不同的浏览器来避免会话碰撞。我是使用 Safari Opera 来测试的。

你应该能看到第二个浏览器窗口显示了新版本的程序,而第一个浏览器窗口仍然为老版本的应用程序服务。

好,你发现新版本很糟糕,你想返回到老版本。很简单,只需要移除新本版, Tomcat 就会自动地回滚使用就版本。尝试一下吧 ~

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

你会注意到页面自动转换为使用旧版本的程序了。

你将很有战略性地开发自己的程序,你可能选择排除旧版本,一旦所有在旧版本上的会话都被终止,你就可以从 Tomcat 中移除这个旧版本的部署了。另一方面,你也可以只留下旧代码,它也不会有什么影响。

当你要开始要在 Tomcat 中使用带有版本号的 war 文件时有几点要注意的。在你在工作中要改变部署之前,请检查以下情况。

1 、内部缓存应能被快速地写入和清除;

2 、会话是可用的;

3 、日志文件输出到哪

4 、磁盘文件和目录能被共享

5 、没有 TCP 套接字监听

6 、应用程序要能够取消部署

下面,我就开始按顺序依次解释上面所说的每一条。

内部缓存应能被快速地写入和清除

同一个应用程序的不同版本都有独自的类上下文。这就意味着在你应用程序中任何本地缓存都能被看见。如果缓存在本地保存了很长时间,一个版本的应用程序可能被另一个改变的版本识别。

有图片的情况下两个版本的 Web 应用程序使用相同的数据库,都拥有一个本地缓存,以避免数据库碰撞。如果一个版本的 Web 应用程序改变了数据库中的一条记录,而其他却不会看到自己缓存版本的改变,直到该信息的缓存版本被清除。

如果你处理了任何 Web 应用程序中的内存缓存,不使用并行部署,直到你确信缓存不可接受的陈旧信息

会话需要是可用的

Tomcat 的使用它自己的会话管理方式来确定哪些应用程序请求应当由哪个版本的应用程序来处理。 If you've gone off to implement session handling yourself, or if you switch session handling off in Tomcat , parallel deployment won't work for you. 如果你已经自己实现了会话处理方式,或已经转换为通过 Tomcat 来处理,那么并行部署不会生效。

日志文件输出到哪?

您可能特别指定将日志记录写入日志文件的地方。如果不使用应用程序的日志文件名作为全局上下文,你可能会在某种情况下将两个版本的 Web 应用程序都在写入到同一个日志文件。这个问题会让你在输出的日志文件中找不到哪个是你应用程序生成的日志。

磁盘文件和目录需要被共享

J2EE 设计者的意图一直为 Web 应用程序的独立性底层机器和文件系统无关。如果你的应用程序使用数据文件,请花一点时间来考虑一下当两个版本的 Web 应用程序的版本开始读写数据文件时将会发生什么。

特别地,考虑到 Java 的监听器和锁被限制在单一的上下文。这样,如果你保护访问带有某种锁定文件,有两个版本的 Web 应用程序意味着你有两个锁在 JVM 中,有可能允许两个线程访问它。

没有 TCP 套接字监听

有些应用服务不仅仅是 HTTP 请求。他们有他们自己的 TCP 套接字处理程序来为客户服务。 通过部署多个 Web 应用程序的版本,就会有多个监听。显然,这将无法工作。给给定的端口上,只能有一个监听器可以监听。

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

如果你想能回滚拙劣的版本,或想清除掉旧版本、未使用的 Web 应用程序版本,你的 Web 应用程序就需要车底德取消部署。幸运的是,  Tomcat 在这方面也可以帮你做。

我希望这些提示没有把你关闭使用停机时间为零部署  Tomcat 的。 为使它顺利工作,你可能需要解决一些小问题。但是让我们通过让应用程序消耗更少的假设资源来面对它,总之,你会得到一个更健壮的应用程序。

 

PS:此文来源自http://www.javacodegeeks.com/2011/06/zero-downtime-deployment-and-rollback.html  ,由极乐鸟 完成该文章的翻译。

分享本文至:

WRITTEN BY

avatar
本文标签:Tomcatweb
看了本文是不是觉得很赞,那就赶紧点击下面按钮分享给身边的朋友吧!

12 条评论

  1. 第一次来到你的地盘,看看您的文章,受益匪浅

  2. avatar 母婴导购

    博主呀,时光老人对每个人都是公平合理,要学会管理时间,利用时间、珍惜时间;养成一种好的生活与工作习惯更利于你成功。

  3. avatar 天津卷帘门

    这个部署真的很有用

  4. avatar 斐格

    隔三五的来看看

  5. avatar IT日记

    了解的不多,正好多学学

  6. avatar Dorie

    Now that’s slutbe! Great to hear from you.

  7. avatar 王磊的博客

    嗯,来学习一下了

  8. avatar 减肥药排行榜

    这是个什么东东,进来了解下。

  9. avatar 减肥咖啡

    学习一下,收藏了。

  10. avatar 苏州卫星电视

    还不错.很详细的分析

  11. avatar 宁波废品回收

    这些都没怎么接触过,不过谢谢博主分享了哈

  12. avatar 浙江藏獒园

    分析的挺详细的,学习下,谢谢博主分享

欢迎留言




用户登录

sitemap