Tomcat中的零停机部署(和回滚); 演练和清单
如果您認為Tomcat不能再進步,那您就錯了。 Tomcat 7引入了所謂的并行部署 。 這是由SpringSource / VMWare貢獻的。
簡而言之,并行部署是一種能夠并行部署一個以上版本的Web應(yīng)用程序的功能,使所有版本都可以在完全相同的URL下使用。
考慮一下。 如果您有新版本的應(yīng)用程序,則只需將其放入運行舊版本的Tomcat中 ,它將運行。 實際上,它們都會起作用。 Tomcat處理應(yīng)用程序版本之間的所有會話管理和流量路由。 無需重新啟動Tomcat 。 無需停止處理請求。 無需與您的老板談?wù)撏C時間。 您的老板無需與任何客戶談?wù)撏C時間。
讓我們看看實際情況,對吧? 使用下面的命令,您可以啟動一個最小的Web應(yīng)用程序來演示此功能。
$ 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現(xiàn)在,您有兩個名為foo ## 001.war和foo ## 002.war的 Web應(yīng)用程序。 ## 001和## 002指定WAR文件的版本號。 每個都有自己的索引頁面,該頁面顯示當(dāng)前時間以及是舊的還是新的Web應(yīng)用程序。 創(chuàng)建此功能的人員選擇了一個非常簡單的解決方案,用于告訴Tomcat什么是替代版本。 您要做的就是在WAR的文件名上加上## <version> 。 簡單有效,如果看起來有些古怪。
現(xiàn)在部署Web應(yīng)用程序的“舊”版本。
$ cp foo##001.war apache-tomcat-7.0.12/webapps/打開瀏覽器,輸入WAR文件的URL(例如http:// localhost:8080 / foo )并注意時間。 請注意,您在URL上看不到版本號。 頁面每秒自動刷新。 在表面之下, Tomcat將與您的瀏覽器建立會話。 以后再說。
現(xiàn)在部署Web應(yīng)用程序的“新”版本。
$ cp foo##002.war apache-tomcat-7.0.12/webapps/請注意,在已經(jīng)打開的瀏覽器窗口中,時間仍在滴答作響,并且仍顯示舊版本。 打開第二個瀏覽器,在該瀏覽器中,也打開http:// localhost:8080 / foo 。 為了獲得最佳結(jié)果,請使用完全不同的瀏覽器以避免任何會話異常。 我使用Safari和Opera進行了測試。
您應(yīng)該看到第二個瀏覽器選擇了新的Web應(yīng)用程序,而舊的Web應(yīng)用程序仍在使用第一個瀏覽器。
很整潔吧?
好的,您是否破壞了部署并想回滾? 很簡單,只需刪除新版本, Tomcat就會自動退回到使用舊版本。 辛苦了 現(xiàn)在就試試:
$ rm apache-tomcat-7.0.12/webapps/foo##002.war您會注意到網(wǎng)頁會自動切換為使用舊版本的應(yīng)用程序。
您將必須制定自己的部署策略。 您可能選擇讓舊版本耗盡。 在舊應(yīng)用程序上的所有會話都到期后,您可以從Tomcat中刪除舊部署。 另一方面,您可以只保留舊代碼。 它不會造成任何傷害。
當(dāng)您想開始在Tomcat服務(wù)器上使用版本化的WAR文件時,需要考慮一些事項。 因此,在您離開并更改公司的部署策略之前,請檢查以下列表。
我將按順序解釋這些內(nèi)容。 大多數(shù)是主題的變體; 考慮一下您的代碼對機器資源所做的假設(shè)。
內(nèi)部緩存應(yīng)該是直寫的,并且很快過期
同一Web應(yīng)用程序的不同版本各自具有自己的類上下文。 這意味著需要檢查Web應(yīng)用程序中的所有本地緩存??。 如果您主動緩存并長時間保留緩存的信息,則該Web應(yīng)用程序的一個版本可能看不到另一個版本所做的更改。
設(shè)想一個情況,其中兩個版本的Web應(yīng)用程序都使用相同的數(shù)據(jù)庫,并且都具有本地緩存??以避免訪問該數(shù)據(jù)庫。 如果該Web應(yīng)用程序的一個版本更改了數(shù)據(jù)庫中的記錄,則其他版本將看不到該更改,直到該信息自己的緩存版本過期為止。
如果您在Web應(yīng)用程序中執(zhí)行任何內(nèi)存中緩存,請在確定緩存不會提供不可接受的過時信息之前不要使用并行部署。
您需要啟用會話
Tomcat使用其自己的會話管理來確定應(yīng)由哪個版本的Web應(yīng)用程序處理哪些請求。 如果您打算自己實現(xiàn)會話處理,或者如果您在Tomcat中關(guān)閉了會話處理,那么并行部署將對您不起作用。
日志去哪兒了?
您可能指定將日志記錄寫入某個地方的日志文件。 如果未在日志文件名中使用應(yīng)用程序的完整上下文名稱,則可能會遇到兩種情況:Web應(yīng)用程序的兩個版本都寫入同一日志文件。 這樣做的問題是,您可能不知道應(yīng)用程序的哪個版本生成了在該文件中找到的輸出。
磁盤文件和目錄需要共享
Java EE設(shè)計者的意圖一直是使Web應(yīng)用程序獨立于底層機器和文件系統(tǒng)。 如果您的應(yīng)用程序使用數(shù)據(jù)文件,請花點時間考慮一下當(dāng)您的Web應(yīng)用程序的兩個版本開始讀寫它們時會發(fā)生什么。
特別是,請考慮將Java的監(jiān)視器和鎖限制在單個上下文中。 因此,如果您使用某種類型的鎖來保護對文件的訪問,則擁有該Web應(yīng)用程序的兩個版本意味著您在JVM中具有兩個鎖,從而可能允許兩個線程對其進行訪問。
沒有TCP套接字監(jiān)聽器
一些應(yīng)用程序不僅僅服務(wù)于HTTP請求。 他們有自己的TCP套接字處理程序為客戶端提供服務(wù)。 通過部署一個以上版本的Web應(yīng)用程序,您可以獲得多個偵聽器。 顯然這是行不通的。 只有一個偵聽器可以在任何給定端口上偵聽。
您的應(yīng)用必須能夠取消部署
如果您希望能夠回退已損壞的發(fā)行版,或者希望清理Web應(yīng)用程序的舊的,未使用的版本,則需要徹底取消部署Web應(yīng)用程序。 幸運的是, Tomcat也可以幫助您。
希望這些警告不會使您停止使用Tomcat中的零停機時間部署。 您可能需要解決一些問題才能使其正常運行。 但是,讓我們面對現(xiàn)實吧,通過使您的應(yīng)用程序?qū)Y源的假設(shè)更少,無論如何您將獲得一個更強大的應(yīng)用程序。
PS。 我喜歡將SVN修訂號用作WAR版本命名方案。 因此,我的WAR文件被命名為foo ## <svn版本=””>。war 。 唯一需要注意的是,將版本作為字符串進行比較以確定版本順序。 因此,您可能必須對版本號進行零填充以確保正確訂購。
參考: Tomcat中的零停機部署(和回滾); JCG合作伙伴 Kees Jan在Java Monitor論壇上 的演練和清單
快樂編碼 拜倫相關(guān)文章:
- 每個程序員都應(yīng)該知道的事情
- 正確記錄應(yīng)用程序的10個技巧
- 軟件設(shè)計法則
- Java最佳實踐系列
- 生存在狂野西部開發(fā)過程中的9條提示
翻譯自: https://www.javacodegeeks.com/2011/06/zero-downtime-deployment-and-rollback.html
總結(jié)
以上是生活随笔為你收集整理的Tomcat中的零停机部署(和回滚); 演练和清单的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎样连接和设置光猫和路由器如何设置连接路
- 下一篇: 使用迭代器时如何避免Concurrent