天天看點

阿裡再開源!基于JAVA的子產品化開發架構JarsLink需求背景子產品化開發的好處JarsLink的應用場景JarsLink的特性實作原理如何使用?

阿裡再開源!基于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

本文作者:清英