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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:
http://www.pswp.cn/news/374880.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/374880.shtml
英文地址,請注明出處:http://en.pswp.cn/news/374880.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

javaweb 學習資源

http://jinnianshilongnian.iteye.com/category/231099轉載于:https://www.cnblogs.com/sishahu/p/5368018.html

HDU 1863 暢通工程(最小生成樹,prim)

題意&#xff1a; 給出圖的邊和點數&#xff0c;要求最小生成樹的代價&#xff0c;注&#xff1a;有些點之間是不可達的&#xff0c;也就是可能有多個連通圖。比如4個點&#xff0c;2條邊:1-2&#xff0c;3-4。 思路&#xff1a; 如果不能連通所有的點&#xff0c;就輸出‘?’…

2000年不算在21世紀

練習3-5 輸出閏年 (15 分) 輸出21世紀中截止某個年份以來的所有閏年年份。注意&#xff1a;閏年的判別條件是該年年份能被4整除但不能被100整除、或者能被400整除。 想當然地以為21世紀是2000~2099&#xff0c;當然沒有通過 if(N > 2000&&N < 2099){for(int i …

使用迭代器時如何避免ConcurrentModificationException

Java Collection類是快速失敗的&#xff0c;這意味著如果在使用迭代器遍歷某個線程的同時更改了Collection&#xff0c;則iterator.next&#xff08;&#xff09;將拋出ConcurrentModificationException 。 在多線程以及單線程環境下都可能出現這種情況。 讓我們通過以下示例探…

Sublime Text 3實用快捷鍵大全

下面是我通過網上教程和文本資料學習sublime Text3時收集的一些實用功能和常用快捷鍵&#xff0c;現在分享出來&#xff0c;如果還有其它的好用的功能可以在下面留言&#xff0c;以便互相學習和交流&#xff0c;謝謝&#xff01;。 選擇類 CtrlD 選中光標所占的文本&#xff0c…

Tomcat中配置JNDI數據源

準備工作&#xff1a; Tomcat版本&#xff1a;tomcat6.0以上 下例中均使用MySQL數據庫 將對應數據源的jar包和MySQL的驅動包拷貝至tomcat的lib文件夾下 一、全局數據源 1步驟一&#xff1a;配置 在tomcat下的conf/server.xml的GlobalNamingResources節點標簽中增加如下配置&…

練習3-8 查詢水果價格 (15 分)

練習3-8 查詢水果價格 (15 分) 給定四種水果&#xff0c;分別是蘋果&#xff08;apple&#xff09;、梨&#xff08;pear&#xff09;、桔子&#xff08;orange&#xff09;、葡萄&#xff08;grape&#xff09;&#xff0c;單價分別對應為3.00元/公斤、2.50元/公斤、4.10元/公…

JavaFX 2.0 beta示例應用程序和思考

我有一段時間回過頭來玩JavaFX&#xff0c;并且在使用該語言方面有好有壞的經驗。 隨著JavaFX 2.0 beta的發布&#xff0c;我想嘗試一下。 在這里&#xff0c;我開發了一個簡單的地址解析應用程序&#xff0c;該應用程序將使用Google地址編碼API來獲取地址并提供該位置的緯度-經…

$Android自定義控件在不同狀態下的屬性

在寫代碼的時候&#xff0c;有時候需要控件在不同狀態下顯示不同的外觀&#xff0c;比如在按鈕按下的時候要變顏色&#xff0c;EditText獲取焦點時候邊框要變顏色等。那么下面就來梳理一下這些是怎么實現的。 &#xff08;一&#xff09;按鈕按下時候變顏色 1、在項目的drawabl…

解析DBR操作系統引導記錄數據

理解文件系統。你必須要熟悉DBR&#xff0c;下面我們就來看看文件系統解析DBR數據。 Dos Boot Record(DBR)操作系統引導記錄是由操作系統的格式化程序建立的。在文件系統驅動操作不論什么一個磁盤卷時&#xff0c;這一部分的信息將被讀取并作為文件系統在這個磁盤卷上的參數被使…

簡單冒泡排序

將5個數字按從小到大排序。 #include <stdio.h> #include <stdlib.h> #include <math.h> int main() {int x[5] {0},temp 0;for(int i 0;i<5;i){scanf("%d",&x[i]);}//冒泡排序&#xff08;升序&#xff09;for(int j 0;j<4;j)//n個…

YouTube Java API入門

在本教程中&#xff0c;我將介紹Google的YouTube API &#xff0c;該API可讓您使用YouTube的功能來啟用應用程序。 YouTube是“殺手級”互聯網應用程序之一&#xff0c;其流量占互聯網總流量的很大一部分。 在開始之前&#xff0c;請確保您已閱讀《 API概述指南》 。 我們將主…

mysql在mac上的坑

默認端口3306&#xff1f; 正確答案&#xff1a;3307 轉載于:https://www.cnblogs.com/dudream/p/5375551.html

ServletContext圖解

servlet之間共享數據資源&#xff01; 轉載于:https://www.cnblogs.com/felixzh/p/4615902.html

C語言怎么輸出百分號%

規律&#xff1a;printf函數中&#xff0c;當出現多個%時&#xff0c;由左至右&#xff0c;每兩個%結合輸出一個% #include <stdio.h> #include <stdlib.h> #include <math.h> int main() {int c 52;printf("% \n %% \n %%% \n %%%% \n %%%%% \n %%%%…

入侵Jasper以獲取JSP頁面的對象模型

為了對我的JSP進行一些檢查和統計分析&#xff0c;我需要一個包含在其中的元素的類似于DOM的層次模型。 但是&#xff0c;解析JSP頁面并不是一件容易的事&#xff0c;最好留給它一個出色的工具-Tomcat&#xff0c;Jetty&#xff0c;GlassFish以及其他所有工具都可以使用Jasper …

Linux自動化安裝cobbler

1介紹 1.1 PXE PXE技術與RPL技術不同之處為RPL是靜態路由&#xff0c;PXE是動態路由。RPL是根據網卡上的ID號加上其他記錄組成的一個Frame&#xff08;幀&#xff09;向服務器發出請求。而服務器中已有這個ID數據&#xff0c;匹配成功則進行遠程啟動。PXE則是根據服務器端收到的…

iOS9適配系列教程

https://github.com/ChenYilong/iOS9AdaptationTips 轉載于:https://www.cnblogs.com/zsw-1993/p/4879118.html

C語言形參

形參和實參區別 形參出現在函數定義中&#xff0c;在整個函數體內都可以使用&#xff0c;離開該函數則不能使用。實參出現在主調函數中&#xff0c;進入被調函數后&#xff0c;實參變量也不能使用。 形參和實參的功能是作數據傳送。發生函數調用時&#xff0c;主調函數把實參…

避免延遲的JPA集合

Hibernate&#xff08;實際上是JPA&#xff09;具有集合映射&#xff1a; OneToMany&#xff0c; ManyToMany&#xff0c; ElementCollection。 所有這些默認情況下都是惰性的。 這意味著集合是List或Set接口的特定實現&#xff0c;其中包含對持久會話的引用&#xff0c;并且只…