所有的可擴展性架構設計憔购,背后的基本思想都可以總結為一個字 : 拆宫峦!
拆,就是將原本大一統(tǒng)的系統(tǒng)拆分成多個規(guī)模小的部分玫鸟, 擴展時只修改其中一部分即可导绷, 無須整個系統(tǒng)到處都改, 通過這種方式來減少改動范圍屎飘, 降低改動風險 妥曲。
常見的拆分思路有如下三種:
??面向流程拆分:將整個業(yè)務流程拆分為幾個階段贾费,每個階段作為一部分。
??面向服務拆分:將系統(tǒng)提供的服務拆分檐盟, 每個服務作為一部分褂萧。
? 面向功能拆分:將系統(tǒng)提供的功能拆分, 每個功能作為一部分 葵萎。
從范圍上來說导犹, 流程 > 服務 > 功能。以學生管理系統(tǒng)為例羡忘,面向流程拆分:展示層→業(yè)務層→數(shù)據(jù)層→存儲層谎痢。面向服務拆分:將系統(tǒng)拆分為注冊、登錄卷雕、信息管理 节猿、 安全設置等服務。面向功能拆分:登錄服務包括手機號登錄爽蝴、身份證登錄沐批、郵箱登錄三個功能。
不同的拆分方式蝎亚,將得到不同的系統(tǒng)架構,典型的可擴展系統(tǒng)架構如下:
面向流程拆分:分層架構先馆。
面向服務拆分:SOA发框、 微服務。
面向功能拆分:微內核架構煤墙。
這幾個系統(tǒng)架構并不是非此即彼的梅惯,而是可 以在系統(tǒng)架構設計中進行組合使用的。 例如仿野,以學生管理系統(tǒng)為例铣减,我們最終可以這樣設計架構:
( 1) 整體系統(tǒng)采用面向服務拆分中的“微服務”架構,拆分為“注冊服務”“登錄服務” “信息管理服務”“安全服務”脚作,每個服務是一個獨立運行的子系統(tǒng) 葫哗。
(2 )其中的“注冊服務”子系統(tǒng)本身又是采用面向流程拆分的分層架構。
(3 )“登錄服務”子系統(tǒng)采用的是面向功能拆分的“微內核”架構 球涛。
微內核架構
也稱為插件化架構劣针,一種面向功能進行拆分的可擴展架構,通常用于實現(xiàn)基于產品的應用亿扁。
微內核有兩類組件:核心系統(tǒng)和插件模塊捺典。核心系統(tǒng)負責業(yè)務無關的通用功能,插件模塊負責實現(xiàn)具體的業(yè)務邏輯从祝。
核心系統(tǒng)功能比較穩(wěn)定襟己,不會因為業(yè)務功能擴展而不斷修改引谜,插件模塊可以根據(jù)業(yè)務功能的需要不斷地擴展。微內核架構通過隔離變化到插件的方式提供了靈活性擎浴、可擴展性煌张。
微內核的核心系統(tǒng)設計的關鍵技術:
? 插件管理,核心系統(tǒng)需要知道插件的信息退客,常見的實現(xiàn)方式插件注冊表機制骏融。
? 插件連接,插件如何連接到核心系統(tǒng)萌狂。核心系統(tǒng)必須制定插件和核心系統(tǒng)的連接規(guī)范档玻。
??插件通信,插件通信指插件間的通信茫藏,插件間是完全解耦的误趴,但業(yè)務中插件是需要進行通信的,這個通信必須通過核心系統(tǒng)务傲,因此核心系統(tǒng)需要提供插件通信機制凉当。
1.OSGi 架構
OSGi 是一個插件化的標準,現(xiàn)在我們談到 OSGi 售葡,如果 沒有特別說明看杭, 一般都是指 OSGi 的規(guī)范。
Eclipse 從 3.0 版本開始挟伙,拋棄了原來自己實現(xiàn)的插件化框架楼雹,改用了 OSGi 框架 。
Eclips巳采用的 OSGi 框架稱為 Equinox 尖阔, 類似的實現(xiàn)還有 Apache 的 Felix贮缅、 Spring 的 SpringDM 。
OSGi 框架的邏輯架構:
( 1 )模塊層介却,模塊層完成插件管理功能 谴供。插件被稱為 Bundle ,每個 Bundle是一個Java的JAR 文件齿坷。
(2 )生命周期層桂肌,生命周期層完成插件連接功能,生命周期層精確地定義了 bundle 生命周期的操作(安裝胃夏、更新轴或、啟動、停止仰禀、卸載〕照雁, Bundle 必須按照規(guī)范實現(xiàn)各個操作。
(3 )服務層,服務層完成插件通信的功能饺蚊。 OSGi 提供了一個服務注冊的功能萍诱,用于各個插件將自己能提 供的服務注冊到 OSGi 核心的服務注冊中心,如果某個服務想用其他服務污呼,則直接在服務注冊中心搜索可用服務就可以了 裕坊。
2.規(guī)則引擎架構
規(guī)則引擎中的規(guī)則就是微內核架構的插件,引擎就是微內核架構的內核燕酷,規(guī)則可以被引擎加載和執(zhí)行 籍凝。執(zhí)行引擎解析配置好的業(yè)務流,執(zhí)行其中的條件和規(guī)則苗缩。
??通過引入規(guī)則引擎饵蒂,業(yè)務邏輯實現(xiàn)與業(yè)務系統(tǒng)分離,可以在不改動業(yè)務系統(tǒng)的情況下擴展新的業(yè)務功能 酱讶。
??規(guī)則通過自然語言描述退盯,業(yè)務人員易于理解和操作。
??規(guī)則引擎系統(tǒng)一般提供可視化的規(guī)則定制泻肯、審批渊迁、查詢及管理,方便業(yè)務人員快速配置新的業(yè)務灶挟。
規(guī)則引擎的基本架構:
(1 )開發(fā)人員將業(yè)務功能分解提煉為多個規(guī)則琉朽,將規(guī)則保存在規(guī)則庫中 。
(2 )業(yè)務人員根據(jù)業(yè)務需要膏萧,通過將規(guī)則排列組合漓骚,配置成業(yè)務流程,保存在業(yè)務庫中榛泛。
(3 )規(guī)則引 擎執(zhí)行業(yè)務流程,實現(xiàn)業(yè)務功能 噩斟。
對照微內核架構的設計關鍵點曹锨,看規(guī)則引擎如何實現(xiàn):
?插件管理,在規(guī)則引擎架構中剃允,規(guī)則一般保存在規(guī)則庫中沛简,通常使用數(shù)據(jù)庫來存儲。
?插件連接斥废,規(guī)則引 擎的插件連接實現(xiàn)機制其實就是規(guī)則語言椒楣。業(yè)務人員需要基于規(guī)則語言來編寫規(guī)則文件,然后由規(guī)則引 擎加載執(zhí)行規(guī)則文件來 完成業(yè)務功能牡肉。
?插件通信捧灰,規(guī)則引擎的規(guī)則之間進行通信的方式就是數(shù)據(jù)流和事件流。規(guī)則只需要輸出數(shù)據(jù)或事件统锤,由引擎將數(shù)據(jù)或事件傳遞到下一個規(guī)則 毛俏。
目前最常用的規(guī)則引 擎是開源的 JBoss Drools 炭庙,采用 Java 語言編寫 , 基于 Rete 算法 煌寇。