- 注:文章來源:極客時間的專欄《從0開始學架構》
- 微內核架構(Microkernel Architecture),也被稱爲插件化架構(Plug-in Architecture),是一種面向功能進行拆分的可擴展性架構,一般用於實現基於產品的應用
- 例如Eclipse這類IDE軟件、UNIX這類操做系統、淘寶APP這類客戶端軟件等,也有一些企業將本身的業務系統設計成微內核的架構,例如保險公司的保險覈算邏輯系統,不一樣的保險品種能夠將邏輯封裝成插件
基本架構
核心系統
- 主要負責和具體業務功能無關的通用功能,例如模塊加載、模塊間通訊等
插件模塊
- 主要負責實現具體的業務邏輯,例如「學生信息管理」系統中的「手機號碼註冊」功能
微內核的基本架構圖
- 上圖中核心繫統功能比較穩定,不會由於業務功能擴展而不斷修改,插件模塊能夠根據業務功能的須要不斷地擴展
- 微內核的架構本質就是將變化部分封裝在插件裏面,從而達到快速靈活擴展的目的,而又不影響總體系統的穩定
設計關鍵點
- 微內核的核心繫統設計的關鍵技術有:插件管理、插件鏈接和插件管理
1. 插件管理
- 核心系統須要知道當前有哪些插件可用,如何加載這些插件,何時加載插件。常見的實現方法是插件註冊表機制
- 核心系統提供插件註冊表(能夠是配置文件,也能夠是代碼,還能夠是數據庫),插件註冊表含有每一個插件模塊的信息,包括它的名字、位置、加載時機(啓動就加載,仍是按需加載)等
2. 插件鏈接
- 指插件如何鏈接到核心系統。一般來講,核心系統必須指定插件和核心繫統的鏈接規範,而後插件按照規範實現,核心系統按照規範加載便可
- 常見的鏈接機制有OSGi(Eclipse使用)、消息模式、依賴注入(Spring使用),甚至使用分佈式的協議都是能夠的,好比RPC或者HTTP Web的方式
3. 插件通訊
- 指插件間的通訊。雖然設計的時候插件間是徹底解耦的,但實際業務運行過程當中,必然會出現某個業務流程須要多個插件協做,這就要求兩個插件間進行通訊
- 因爲插件之間沒有直接聯繫,通訊必須經過核心系統,所以核心系統須要提供插件通訊機制
- 這種狀況和計算機相似,計算機的CPU、硬盤、內存、網卡是獨立設計的配置,但計算機運行過程當中,CPU和內存、內存和硬盤確定是有通訊的,計算機經過主板上的總線提供了這些組件之間的通訊功能
- 微內核的核心繫統也必須提供相似的通訊機制,各個插件之間才能進行正常的通訊
OSGi架構簡析
- OSGi全稱是Open Service Gateway initiative,自己實際上是指OSGi Alliance。它是一個非盈利的國際組織,旨在創建一個開放的服務規範,爲經過網絡向設備提供服 務創建開放的標準,這個標準就是OSGi specification。若是沒有特別說明,通常都是指OSGi的規範
- OSGi聯盟的初衷是構建一個在廣域網和局域網或設備上展開業務的基礎平臺,因此OSGi的最先設計也是針對嵌入式應用的,諸如機頂盒、服務網關、手機、汽車等都是其應用的主要環境
- 因爲OSGi具有動態化、熱插拔、高可複用性、高效性、擴展方便等優勢,它被應用了PC上的應用開發
- 尤爲是Eclipse這個流行軟件採用OSGi標準後,OSGi更是成了首選的插件化標準
- 如今OSGi已經和嵌入式應用關聯不大了,更可能是將OSGi當作一個微內核的架構模式
OSGi框架的邏輯架構圖
1. 模塊層(Module層)
- 模塊層實現插件管理功能。OSGi中,插件被稱爲Bundle,每一個Bundle是一個Java的JAR文件,每一個Bundle裏面都包含一個元數據文件MANIFEST.MF,這個文件包含了Bundle的基本信息
- 例如,Bundle的名稱、描述、開發商、classpath,以及須要導入的包和輸出的包等,OSGi核心系統會將這些信息加載到系統中用於後續使用
一個簡單的MANIFEST.MF樣例以下程序員
// MANIFEST.MF
Bundle-ManifestVersion: 2
Bundle-Name:UserRegister
Bundle-SymbolicName: com.test.userregister
Bundle-Version: 1.0
Bundle-Activator: com.test.UserRegisterActivator
Import-Package: org.log4j;version="2.0",
.....
Export-Package: com.test.userregister;version="1.0",
複製代碼
2. 生命週期層(Lifecycle層)
- 生命週期層實現插件鏈接功能,提供了執行時模塊管理、模塊對底層OSGi框架的訪問
- 生命週期層精確地定義了Bundle生命週期的操做(安裝、更新、啓動、中止、卸載),Bundle必須按照規範實現各個操做。例如:
public class UserRegisterActivator implements BundleActivator {
public void start(BundleContext context) {
UserRegister.instance = new UserRegister ();
}
public void stop(BundleContext context) {
UserRegister.instance = null;
}
}
複製代碼
3. 服務層(Service層)
- 服務層實現插件通訊的功能。OSGi提供了一個服務註冊的功能,用於各個插件將本身能提供的服務註冊到OSGi核心的註冊中心,若是某個服務想用其餘服務,則直接在服務註冊中心搜索可用服務中心就能夠了
- 例如:
// 註冊服務
public class UserRegisterActivator implements BundleActivator {
// 在 start() 中用 BundleContext.registerService() 註冊服務
public void start(BundleContext context) {
context.registerService(UserRegister.class.getName(), new UserRegisterImpl(), null);
}
// 無須在 stop() 中註銷服務,由於 Bundle 中止時會自動註銷該 Bundle 中已註冊的服務
public void stop(BundleContext context) {}
}
// 檢索服務
public class Client implements BundleActivator {
public void start(BundleContext context) {
// 1. 從服務註冊表中檢索間接的「服務引用」
ServiceReference ref = context.getServiceReference(UserRegister.class.getName());
// 2. 使用「服務引用」去訪問服務對象的實例
((UserRegister) context.getService(ref)).register();
}
public void stop(BundleContext context) {}
}
複製代碼
- 注意:這裏的服務註冊不是插件管理功能中的插件註冊,其實是插件間通訊的機制
規則引擎架構簡析
規則引擎從結構上來看也屬於微內核架構的一種具體實現,其中執行引擎能夠看做是微內核,執行引擎解析配置好的業務流,執行其中的條件和規則,經過各類方式來支持業務的靈活多變算法
規則引擎在計費、保險、促銷等業務領域應用較多。例如電商促銷,常見的促銷規則有:數據庫
- 滿100送50
- 3件立減50
- 3件8折
- 第3件免費
- 跨店滿200減100
- 新用戶立減50
以上僅僅列出來常見的幾種,實際上完整列下來可能有幾十上百種,再加上排列組合,促銷方案可能有幾百上千種,這樣的業務若是徹底靠代碼來實現,開發效率遠遠跟不上業務的變化速度,而規則引擎卻可以很靈活的應對這種需求,主要緣由在於:編程
1. 可擴展
- 經過引用規則引擎,業務邏輯實現與業務系統分離,能夠在不改變業務系統的狀況下擴展新的業務功能
2. 易理解
- 規則經過天然語言描述,業務人員易於理解和操做,而不像代碼那樣只有程序員才能理解和開發
3. 高效率
- 規則引擎系統通常提供可視化的規則定製、審批、查詢及管理,方便業務人員快速配置新的業務。
規則引擎的基本架構
- 開發人員將業務功能分解提煉爲多個規則,將規則保存在規則庫中
- 業務人員根據業務須要,經過將規則排列組合,配置成業務流程,保存在業務庫中
- 規則引擎執行業務流程實現業務功能
對照微內核架構的設計關鍵點,規則引擎具體是如何實現的:
1. 插件管理
- 規則引擎中的規則就是微內核架構的插件,引擎就是微內核架構的內核。規則能夠被引擎加載和執行。規則引擎架構中,規則通常保存在規則庫中,一般使用數據庫來存儲。
2. 插件鏈接
- 相似於程序員開發的時候須要採用C++、Java等語言,規則引擎也規定了規則的開發語言,業務人員須要基於規則語言來編寫規則文件,而後由規則引擎加載執行規則文件來完成業務功能,所以,規則引擎的插件鏈接實現機制其實就是規則語言
3. 插件通訊
- 規則引擎的規則之間進行通訊的方式就是數據流和事件流,因爲單個規則並不須要依賴其餘規則,所以規則之間沒有主動的通訊,規則只須要輸出數據或者事件,由引擎將數據或者事件傳遞到下一個規則
目前最經常使用的規則引擎是開源的JBoss Drools,採用Java語言編寫,基於Rete算法bash
Drools具備下面的優勢:
- 很是活躍的社區支持,以及普遍的應用
- 快速的執行速度
- 與Java Rule Engine API(JSR-94)兼容
- 提供了基於Web的BRMS——Guvnor,Guvnor提供了規則管理的知識庫,經過它能夠實現規則的版本控制,以及規則的在線修改與編譯,使得開發人員和系統管理人員能夠在線管理業務規則
雖然Drools號稱簡單易用,但實際上其規則語言仍是和編程語言比較相似,在實際應用的時候普通業務人員面對這樣的規則語言,學習成本和理解成本仍是比較高的,例以下面這個樣例 網絡
所以,一般狀況下須要基於Drools進行封裝,將規則配置作成可視化的操做,例以下面電商反欺詐的一個示例架構
注:有興趣瞭解極客時間專欄的同窗,能夠查看極客時間專欄—可提供返現服務框架