JarsLink (原名Titan) 是一個基于JAVA的模塊化開發(fā)框架,它提供在運行時動態(tài)加載模塊(一個JAR包)、卸載模塊和模塊間調(diào)用的API。
需求背景?
應(yīng)用拆分的多或少都有問題。多則維護成本高,每次發(fā)布一堆應(yīng)用。少則拆分成本高,無用功能很難下線。?
故障不隔離。當(dāng)一個系統(tǒng)由多人同時參與開發(fā)時,修改A功能,可能會影響B(tài)功能,引發(fā)故障。?
多分支開發(fā)引發(fā)沖突。多分支開發(fā)完之后合并會產(chǎn)生沖突。?
牽一發(fā)動全身。一處核心代碼的改動,或一個基礎(chǔ)Jar的升級需要回歸整個系統(tǒng)。?
升級和遷移成本高。中間件升級每個應(yīng)用都有升級成本。?
模塊化開發(fā)的好處
可插拔,一個應(yīng)用由多個模塊組成,應(yīng)用里的模塊可拆和合,模塊可快速在多個系統(tǒng)中遷移和部署。?
模塊化開發(fā),模塊之間互相隔離,實現(xiàn)故障隔離。?
一個模塊一個分支,不會引發(fā)代碼沖突。?
在模塊中增加或修改功能,只會影響當(dāng)前模塊,不會影響整個應(yīng)用。?
動態(tài)部署,在運行時把模塊部署到應(yīng)用中,快速修復(fù)故障,提高發(fā)布效率。?
多版本部署,可以在運行時同時部署某個模塊的新舊版本,進行AB TEST。?
減少資源消耗,通過部署模塊的方式減少應(yīng)用數(shù)量和機器數(shù)量。?
JarsLink的應(yīng)用場景?
微服務(wù)集成測試, 目前一個微服務(wù)是一個FAT JAR,如果有幾十個微服務(wù),則需要啟動很多進程,DEBUG端口會很多,使用JarsLink框架合并FAT JAR,再路由請求到其他JAR,就可以只啟動一個進程進行DEBUG測試。?
數(shù)據(jù)管理中心,數(shù)據(jù)采集的數(shù)據(jù)源多,而且每種數(shù)據(jù)源都需要對接和開發(fā),通過模塊化開發(fā),實現(xiàn)一個數(shù)據(jù)源使用一個模塊進行對接。?
指標(biāo)計算系統(tǒng),每個TOPIC一個模塊,把消息轉(zhuǎn)發(fā)到模塊中進行消息處理。?
后臺管理系統(tǒng),幾乎每個系統(tǒng)都有后臺開發(fā)的需求,新建應(yīng)用則應(yīng)用數(shù)多,維護成本高,引入模塊化開發(fā),一個二級域一個模塊來開發(fā)后臺功能。?
目前螞蟻金服微貸事業(yè)部幾個系統(tǒng)和幾十個模塊已經(jīng)使用JarsLink框架。
JarsLink的特性?
隔離性?
類隔離:框架為每個模塊的Class使用單獨的ClassLoader來加載,每個模塊可以依賴同一種框架的不同的版本。?
實例隔離:框架為每個模塊創(chuàng)建了一個獨立的Spring上下文,來加載模塊中的BEAN,實例化失敗不會影響其他模塊。?
資源隔離:后續(xù)會支持模塊之間的資源隔離,每個模塊使用獨立的CPU和內(nèi)存資源。?
動態(tài)性?
動態(tài)發(fā)布:模塊能在運行時動態(tài)加載到系統(tǒng)中,實現(xiàn)不需要重啟和發(fā)布系統(tǒng)新增功能。支持突破雙親委派機制,在運行時加載父加載器已經(jīng)加載過的類,實現(xiàn)模塊升級依賴包不需要系統(tǒng)發(fā)布。?
動態(tài)卸載:模塊能在運行時被動態(tài)卸載干凈,實現(xiàn)快速下線不需要功能。?
易用性?
提供了通用靈活的API讓系統(tǒng)和模塊進行交互。