1. 程式人生 > >模組化開發框架實現原理

模組化開發框架實現原理

本文是螞蟻金服微貸事業部自主研發的模組化開發框架TITAN的實現原理,該框架後續可能會開源,敬請期待!

需求背景

  • 應用拆分的多或少都有問題。多則維護成本高,每次釋出一堆應用。少則拆分成本高,無用功能很難下線。
  • 故障不隔離。當一個系統由多人同時參與開發時,修改A功能,可能會影響B功能,引發故障。
  • 多分支開發引發衝突。多分支開發完之後合併會產生衝突。
  • 牽一髮動全身。一處核心程式碼的改動,或一個基礎Jar的升級需要回歸整個系統。
  • 升級和遷移成本高。中介軟體升級每個應用都有升級成本。

模組化開發的好處

  • 可插拔,一個應用由多個模組組成,應用裡的模組可拆和合,模組可快速在多個系統中遷移和部署。
  • 模組化開發,模組之間互相隔離,實現故障隔離。
  • 一個模組一個分支,不會引發程式碼衝突。
  • 在模組中增加或修改功能,只會影響當前模組,不會影響整個應用。
  • 動態部署,在執行時把模組部署到應用中,快速修復故障,提高發布效率。
  • 多版本部署,可以在執行時同時部署某個模組的新舊版本,進行AB TEST。
  • 減少資源消耗,通過部署模組的方式減少應用數量和機器數量。

TITAN的應用場景

模組化開發框架適用於一些易變的系統,需要經常在一個系統中開發需求,比如如下場景

  • 資料採集,資料採集的資料來源多,而且每種資料來源都需要對接和開發,且資料質量很差,需要經常調整解析程式碼,通過模組化開發,實現一個數據源使用一個模組進行對接。
  • 指標計算,每種訊息一個模組,把訊息轉發到模組中進行訊息處理。
  • 後臺管理系統,幾乎每個系統都有後臺開發的需求,新建應用則應用數多,維護成本高,引入模組化開發,一個二級域一個模組來開發後臺功能。
  • 業務核對系統,需要不停的在線上增加核對程式碼,每個系統一個核對模組。

要實現模組化開發,需要實現幾個功能,如何實現模組的載入和解除安裝,如何實現模組間的隔離和通訊,和模組的類載入機制。

模組載入

TITAN為每個模組建立一個新的URLClassLoader來載入模組。並且支援突破雙親委派,設定了overridePackages的包將由子類載入進行載入,不優先使用父類載入器已載入的。

模組的解除安裝

解除安裝模組需要滿足三個條件

  • 模組裡的例項物件沒有被引用
  • 模組裡的Class沒有被引用
  • 類載入器沒有被引用

所以需要做到三點解除安裝例項,解除安裝類和解除安裝類載入器,整個模組的解除安裝順序如下:

  • 關閉資源:關閉HTTP連線池或執行緒池。
  • 關閉IOC容器:呼叫applicationContext.close()方法關閉IOC容器。
  • 移除類載入器:去掉模組的引用。
  • 解除安裝JVM租戶(開發中):解除安裝該模組使用的JVM租戶,釋放資源。

模組間隔離

模組化開發需要解決隔離性問題,否則各模組之間會互相影響。模組之間的隔離有三個層次:

  • 類隔離:為每個模組建立一個類載入器來實現類隔離。
  • 例項隔離:為每個模組建立一個新的IOC容器來載入模組裡面的BEAN。
  • 資源隔離:對每個模組只能使用指定的CPU和記憶體。

目前TITAN實現了類隔離和例項隔離,資源隔離準備引入JVM多租戶來解決。

模組間通訊

模組之間的通訊也有三種方式,RPC,本地呼叫,深克隆/反射。

  • 本地呼叫:目前TITAN的doAction就是使用的這種通訊方式,這種方式要求通訊的兩個模組都在一個JVM裡,兩個模組的類載入器是父子關係,並且兩個模組的IOC容器也是父子容器。
  • RPC呼叫:用於跨JVM的模組之間呼叫,可以在D模組中釋出服務,C模組引用RPC服務。
  • 深克隆/反射:深克隆其他模組的入參,反射其他模組的方法實現呼叫,要求兩個模組在一個JVM下。

類載入機制

OSGI類載入機制的關係採用的是網狀結構,每個模組通過 Export-Package 來宣告我要給別人用哪些類,通過 Import-Package來宣告我要用別人的哪些類。而TITAN框架採用的是扁平化管理,每個模組都有一個共同的父類,這個父類載入器就是載入ModuleLoader類的載入器,好處是便於維護,每個模組的類做到充分隔離,缺點是會載入重複的Class,適用於模組較少的場景。


方 騰飛

花名清英,併發網(ifeve.com)創始人,暢銷書《Java併發程式設計的藝術》作者,螞蟻金服技術專家。目前工作於支付寶微貸事業部,關注網際網路金融,併發程式設計和敏捷實踐。微信公眾號aliqinying。