ps:熱部署和熱加載其實是兩個類似但不同的概念,之前理解不深,so,這篇文章重構了下。
一、熱部署與熱加載
在應用運行的時升級軟件,無需重新啟動的方式有兩種,熱部署和熱加載。
對於Java應用程序來說,熱部署就是在服務器運行時重新部署項目,熱加載即在在運行時重新加載class,從而升級應用。
二、實現原理
熱加載的實現原理主要依賴java的類加載機制,在實現方式可以概括為在容器啟動的時候起一條后台線程,定時的檢測類文件的時間戳變化,如果類的時間戳變掉了,則將類重新載入。
對比反射機制,反射是在運行時獲取類信息,通過動態的調用來改變程序行為;
熱加載則是在運行時通過重新加載改變類信息,直接改變程序行為。
熱部署原理類似,但它是直接重新加載整個應用,這種方式會釋放內存,比熱加載更加干凈徹底,但同時也更費時間。
三、在java中應用
1.生產環境
熱部署作為一個比較靈活的機制,在實際的生產上運用還是有,但相對很少,熱加載則基本沒有應用。分析如下
- 一、安全性
熱加載這種直接修改jvm中字節碼的方式是難以監控的,不同於sql等執行可以記錄日志,直接字節碼的修改幾乎無法記錄代碼邏輯的變化,對既有代碼行為的影響難以控制,對於越注重安全的應用,熱加載帶來的風險越大,這好比給飛行中的飛機更換發動機。
- 二、適用的情景
技術大部分是跟需求掛鈎的,而需要熱部署的情景很少。
- 頻繁的部署並且啟動耗時長的應用
- 無法停止服務的應用
在生產中,並沒有需要頻繁部署的應用,即使是敏捷,再快也是一周一次的迭代,並且通過業務划分和模塊化編程,部署的代價完全可以忽略不計,對於現有的應用,啟動耗時再長,也並非長到無法忍受,如果真的這么長,那更應該考慮的是如何進行模塊拆分,分布式部署了。
對於無法停止服務的應用,比如現在的雲計算平台這樣分布式應用,采用分批上線也可以滿足需求,類似熱部署方案應該是放在最后考慮的解決方案。
2.開發環境
在生產中,不會有頻繁的部署並且啟動耗時長的應用,但由於雲計算的興起,熱部署還是有其應用。
而熱加載有點玩火,太危險了。但在開發和debug中,頻繁啟動應用卻隨處可見,熱加載機制可以極大的提升開發效率。這兩種機制,在開發中還有另外一種稱呼—開發者模式。
對於大型項目:往往啟/停需要等待幾分鍾時間。更浪費時間的是,對於一個類中的方法的調試過程,如果修改多次,需要反復的啟停服務器,浪費的時間更多。
以目前的crm項目為例,其啟動時間為5m,以一天debug重啟十次,一個月工作20天來算,每年重啟耗時25人日,如果能完全使用熱加載,每年節省重啟時間近1人月。
crm pool啟動耗時
1.struts2熱加載
在struts2中熱加載即開發者模式,在struts.xml配置
<constant name="struts.devMode" value="true" />
從而當更改struts.xml文件后不需要重新啟動服務器就可以進行程序調試。
2.開發時使用tomcat熱加載
tomcat本身默認開啟了熱部署方式,但熱部署是直接重新加載整個應用,耗時跟重啟服務器差不多,我們需要的其實是熱加載,即修改了哪個class,只重新加載這一個class,這樣耗時幾乎為0。
對於tomcat5.x 以上版本,均已支持一定程度上得熱加載,但這種方式只針對代碼行級別的,也就是說如果新刪方法,注解,類,或者變量時是無效的,只能重啟,這是我目前在公司開發時用的方式,可以顯著降低debug時的重啟次數,提高開發效率
1.將tomcat server.xml文件的context reloadable 值置為false 或者在web modules中編輯取消Auto reloading選項。
<Context reloadable="false"/>
OR
2.修改eclipse中的server配置
這樣做可以在在修改代碼之后,不會自動重啟服務器,而只加載代碼,新增一行java代碼ctrl+s后直接刷新頁面或調用接口即可看到效果,無需重啟tomcat。
3.遠程debug中使用tomcat熱加載
tomcat的熱加載機制不僅可以在本地debug時,tomcat的遠程調試也支持熱部署,通過eclipse debug遠程到遠程tomcat上,修改本地代碼,ctrl+s后直接刷新頁面后調用接口,即可發現遠程tomcat已將本地代碼進行了熱加載。
4.jrebel插件方式
jrebel插件可以進行更徹底的熱加載,不僅包括類,甚至支持spring 等配置文件的熱加載,但公司項目開發環境復雜,目前在eclipse中配置一直沒有成功,只能使用tomcat自帶的熱加載機制。
總結
在實際生產中熱部署在雲計算中運用挺多,但熱加載沒有,而在開發中,熱加載可以顯著的提升工作效率,強烈推薦使用熱加載方式,不僅tomcat,大多數其他servlet容器也支持這種方式,大家可以自行搜索相關技巧。
參考文檔 :
作者:初龍
原文鏈接:https://chulung.com/article/thermal-deployment-and-thermal-loading-of-java
本文由MetaCLBlog於2017-07-17 09:00:02自動同步至cnblogs
本文基於 知識共享-署名-非商業性使用-禁止演繹 4.0 國際許可協議發布,轉載必須保留署名及鏈接。