阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 應用拆分的多或少都有問題。多則維護成本高,每次釋出一堆應用。少則拆分成本高,無用功能很難下線。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 故障不隔離。當一個系統由多人同時參與開發時,修改A功能,可能會影響B功能,引發故障。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 多分支開發引發沖突。多分支開發完之後合并會産生沖突。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 牽一發動全身。一處核心代碼的改動,或一個基礎Jar的更新需要回歸整個系統。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 更新和遷移成本高。中間件更新每個應用都有更新成本。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用?
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 可插拔,一個應用由多個子產品組成,應用裡的子產品可拆和合,子產品可快速在多個系統中遷移和部署。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 子產品化開發,子產品之間互相隔離,實作故障隔離。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 一個子產品一個分支,不會引發代碼沖突。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 在子產品中增加或修改功能,隻會影響目前子產品,不會影響整個應用。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 動态部署,在運作時把子產品部署到應用中,快速修複故障,提高釋出效率。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 多版本部署,可以在運作時同時部署某個子產品的新舊版本,進行AB TEST。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 減少資源消耗,通過部署子產品的方式減少應用數量和機器數量。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 資料管理中心,如果你需要開發一個資料管理系統,這個系統需要去不同的異構系統采集資料,這些系統會提供不同類型的接口,如RPC,HTTP等。并且資料采集的資料源多,每種資料源都需要對接和開發,資料品質比較差,需要經常修改代碼進行釋出。在這種場景下,通過子產品化開發,實作一個資料源使用一個子產品進行對接,上線新資料源隻需要新增子產品,修改BUG隻需要修改某個子產品,并能快速上線。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 背景管理系統,網際網路應用發展到一定階段會出現很多背景需求,如客服查詢使用者的資訊幫助解答問題,開發查背景資料排查系統BUG,營運使用背景功能發送營運活動等。這些功能釋出頻率會大于核心系統,如果放在核心系統裡會影響其穩定性,是以我們必須要建一個背景系統來開發背景功能,但是這樣又帶來一個新的問題,很多開發都會來這個系統進行開發,拉多分支造成代碼沖突,A業務的BUG影響到B業務。是以如果每個業務線一個子產品,每個子產品使用一個單獨的分支進行開發,就能進行隔離開發,提高開發速度,開發完後在運作時加載到系統中。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 微服務內建測試, 目前一個微服務是一個FAT JAR,如果有幾十個微服務,則需要啟動很多程序,DEBUG端口會很多,使用JarsLink架構合并FAT JAR,再路由請求到其他JAR,就可以隻啟動一個程序進行DEBUG測試。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 名額計算系統,可以把消息轉發到不同的子產品中進行處理,并輸出名額。
目前螞蟻金服微貸事業部幾個系統和幾十個子產品已經使用JarsLink架構。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 類隔離:架構為每個子產品的Class使用單獨的ClassLoader來加載,每個子產品可以依賴同一種架構的不同的版本。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 執行個體隔離:架構為每個子產品建立了一個獨立的Spring上下文,來加載子產品中的BEAN,執行個體化失敗不會影響其他子產品。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 資源隔離:後續會支援子產品之間的資源隔離,每個子產品使用獨立的CPU和記憶體資源。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 動态釋出:子產品能在運作時動态加載到系統中,實作不需要重新開機和釋出系統新增功能。支援突破雙親委派機制,在運作時加載父加載器已經加載過的類,實作子產品更新依賴包不需要系統釋出。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 動态解除安裝:子產品能在運作時被動态解除安裝幹淨,實作快速下線不需要功能。
提供了通用靈活的API讓系統和子產品進行互動。
JarsLink為每個子產品建立一個新的URLClassLoader來加載子產品。并且支援突破雙親委派,設定了overridePackages的包将由子類加載進行加載,不優先使用父類加載器已加載的。
解除安裝子產品需要滿足三個條件:
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 子產品裡的執行個體對象沒有被引用
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 子產品裡的Class沒有被引用
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 類加載器沒有被引用
是以需要做到三點解除安裝執行個體,解除安裝類和解除安裝類加載器,整個子產品的解除安裝順序如下:
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用?
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 關閉資源:關閉HTTP連接配接池或線程池。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 關閉IOC容器:調用applicationContext.close()方法關閉IOC容器。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 移除類加載器:去掉子產品的引用。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 解除安裝JVM租戶(開發中):解除安裝該子產品使用的JVM租戶,釋放資源。
子產品化開發需要解決隔離性問題,否則各子產品之間會互相影響。子產品之間的隔離有三個層次:
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 類隔離:為每個子產品建立一個類加載器來實作類隔離。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 執行個體隔離:為每個子產品建立一個新的IOC容器來加載子產品裡面的BEAN。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 資源隔離:對每個子產品隻能使用指定的CPU和記憶體。
目前JarsLink實作了類隔離和執行個體隔離,資源隔離準備引入ALIJVM多租戶來解決。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 子產品間通訊
子產品之間的通訊也有三種方式,RPC,本地調用,深克隆/反射。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用?
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 本地調用:目前JarsLink的doAction就是使用的這種通訊方式,這種方式要求子產品的類加載器是父子關系,且IOC容器也是父子容器。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? RPC調用:用于跨JVM的子產品之間調用,利用SOFA 4動态API在子產品中釋出和引用TR服務來實作。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 深克隆/反射:深克隆其他子產品的入參,反射其他子產品的方法實作調用。
OSGI類加載機制的關系采用的是網狀結構,每個子產品通過 Export-Package 來聲明我要給别人用哪些類,通過 Import-Package來聲明我要用别人的哪些類。JarsLink采用扁平化管理,每個子產品都有一個共同的父類,這個父類加載器就是加載ModuleLoader類的加載器,如果是SOFA應用,子產品的父加載器是KernelAceClassLoader,類加載器關系如下:
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 如果所有子產品都需要使用的類,可以通過KernelAceClassLoader加載,如果是SOFA系統可以通過POM引入。
JarsLink架構的類圖如下:
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用?
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? AbstractModuleRefreshScheduler:入口類,負責定期掃描本地和記憶體中的子產品是否發生變更,如果變更,則更新子產品。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? ModuleLoader:子產品加載引擎,負責子產品加載。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? ModuleManager:子產品管理者,負責在運作時注冊,解除安裝,查找子產品和執行Action。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? Module:子產品,一個子產品有多個Action。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? Action:子產品裡的執行者。
JarsLink Maven Repo
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? JarsLink依賴的POM也需要引入
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 在系統中引入以下兩個BEAN。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 使用JarsLink API非常簡單,隻需要繼承AbstractModuleRefreshScheduler,并提供子產品的配置資訊,代碼如下:
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 這個排程器在bean初始化的時候會啟動一個排程任務,每分鐘重新整理一次子產品,如果子產品的版本号發生變更則會更新子產品。實作這個方法時,必須把子產品(jar包)下載下傳到機器本地,子產品的配置資訊說明如下:
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? name:全局唯一,建議使用英文,忽略大小寫。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? enabled:目前子產品是否可用,預設可用,解除安裝子產品時可以設定成false。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? version:子產品的版本,如果版本号和之前加載的不一緻,架構則會重新加載子產品。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? Properties:spring屬性配置檔案。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? moduleUrl:子產品的本地存放位址。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? overridePackages:需要突破雙親委派的包名,一般不推薦使用,範圍越小越好,如com.alipay.XX。
把ModuleRefreshSchedulerImpl類注冊成Spring的bean。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? JarsLink API 暫時不提供子產品可視化管理能力,是以需要使用其他系統來管理和釋出子產品。目前可以通過com.alipay. jarslink.api.ModuleManager#getModules擷取運作時所有子產品的資訊。
你也可以使用API來加載并注冊子產品,詳細使用方式可以參考ModuleManagerTest,代碼如下。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 在子產品中隻需要實作并開發Action,代碼如下:
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 開發者需要利用JarsLink API把請求轉發給子產品,先根據子產品名查找子產品,再根據aciton name查找Action,最後執行Action。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 通過moduleConfig的Properties屬性可以設定Spring bean變量的配置資訊。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 可以把HTTP請求轉發給子產品處理。
可以把消息轉發給子產品進行處理。遵循預設大于配置的方式,你可以把TOPIC當做子產品名,EventCode當做ActionName來轉發請求。
JarsLink架構最重要的兩個接口是ModuleManager和ModuleLoader。
ModuleManager負責注冊,解除安裝,查找子產品和執行Action。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? ModuleLoader隻負責加載子產品。
阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用? 近期,JarsLink會支援多版本加載,并陸續支援子產品間調用、資源隔離等特性。我們也希望更多的童鞋參與進來,讓JarsLink幫助更多開發者提升效率。
原文釋出時間為:2018-03-22
本文作者:清英