Dr. Alistair Cockburn;被評選為“歷史上最偉大的150位i-Technology英雄”之一。
他以敏捷方法和有效用例的編寫而聞名,他的最新作品是敏捷的核心
六邊形架構,又稱“端口和適配器模式”,
使用過過設計模式的都知道適配器模式;,適配器模式是為了解決兩個不兼容的接口之間的對接。這種類型的設計模式屬於結構型模式;
Dr. Alistair Cockburn提出的六邊形架構主張使用適配器模式與外部交互,將應用服務於領域服務封裝再系統內部。
這種架構的思想也契合了面向領域驅動設計;面向領域設計,強調以所需解決的領域業務為核心;
先做領域模型的設計,領域邊界的划分;圍繞領域核心,定義倉儲層,緩存,消息隊列,外部服務,通信的接口;通過這些接口,完成領域核心與倉儲層,緩存,消息隊列,外部服務的功能對接;
在這個過程中,領域模型,應用程序便是我們的六邊形架構的核心;圍繞領域核心,定義的倉儲層,緩存,消息隊列,外部服務的接口便是我們的六邊形架構的適配器
近年來,業務邏輯滲入到用戶界面的代碼中,已經成了一個老大難問題。這帶來了三后果:
首先,我們無法干凈地對系統進行自動化測試。這是因為有一些被測邏輯依賴於可視化界面的細節,比如說字段長度和按鈕位置,而這些細節常常發生變化。
由於同樣的原因,我們不可能將一個人工操作的系統切換為批處理系統。
仍然基於這個原因, 當我們想讓一個程序被另一個程序驅動時,也會很困難甚至根本不可能;六邊形的架構初衷是為了解決技術與業務領域的解耦問題,技術與技術之間的解耦問題;
網上常見到的六邊形經典架構圖:
使用面向接口編程的設計,以端口和適配器的設計模式具體實現
六邊形架構的特征
1,面向接口編程,依賴倒置,依賴於抽象
內部的邏輯不泄露到外部;只能外部依賴內部;不能內部依賴外部
對於驅動者適配器,外部依賴內部:舉例:app層與領域層的接口,由領域層定義接口;由app層適配調用接口
對於被驅動者適配器,內部依賴外部,舉例:領域層與倉儲層的接口,由領域層定義接口;由倉儲適配實現接口
2,使用適配器設計模式
3,關注業務邏輯
關注核心業務,設定外部使用者和引用的外部服務都是可替換的(相對於領域層,倉儲服務和app服務是可替換的)
4,外部可替換:得益於依賴抽象和適配器模式的實現方式,使得業務領域邏輯的外部是可替換的
一個端口對應多個適配器,應用通過端口為外部提供服務,內部不關心外部實現;
適配器可以分為2類,“主”、“從”適配器,也可稱為“驅動者”和“被驅動者”
5,自動測試:考慮實現與抽象時,也就需要考慮自動化測試;由於各個層之間相互獨立,
六邊形架構自動化測試可以針對於各個獨立層次設計,
保證應用邏輯不會泄露到用戶界面,在技術上保證了層次的分界
另外,六邊形架構做了項目分層;他將項目分層端口適配器,應用層與領域層;其中中端口包括輸出端口,輸入端口
三層架構
分成表示層,業務邏輯層,數據訪問層,降低耦合,提高復用,分而治之
應用邏輯在不同層泄露,導致替換某一層困難,難以對核心邏輯完整測試
自上而下的依賴,可能多維依賴
自下而上的開發順序;從數據庫,數據訪問層向上設計
三層強調的是職責垂直方向的划分
六邊形架構
分成內部,外部,內部包括業務邏輯,外部包括應用驅動邏輯、基礎設施或其他應用
外部可替換,關注內部領域業務,內部不關注外部
關注點在領域內部
以內部領域的設計開始向外部設計,設計最初從領域開始時不考慮存儲,外部如何調用
強調以業務為核心做垂直方向的模塊划分
內部,外部各個層次可以獨立做單元測試
端口之間的對稱性特征
六邊形架構實現外部可切換的場景
隨着業務的增長,數據量,用戶量,功能的增長;系統需要對原先簡化的設計分而治之;前端技術,數據庫,緩存,大數據,服務器,通信,協議,消息隊列,編程語言,全文等多種技術切換,擴展,多樣化
原本包含付款退款的模塊被拆分成獨立的退款,付款服務;日志服務被拆分成日志存儲,日志分析服務等場景
原本只需支持Mysql,演變成轉向不同的場景下支持Mysql,SqlServer,PostgreSQL,阿里雲,azure
原本只需支持Mysql,演變成用戶服務使用阿里雲Mysql,配置服務使用MongoDB,日志服務使用ES
在倡導以微服務來實現服務的靈活設計,擴展,部署,松耦,簡單開發,延遲決策的趨勢下,
這些場景是微服務應用於大型分布式系統架構時比較常見的面臨的問題
在面對這些問題的時候,這些圍繞我們業務領域的驅動或者被驅動的外部要求我們做到可替換
六邊形架構可以使用的開發順序
1,用FIT(驗收測試框架)測試裝置驅動應用程序,並用mock(內存)數據庫來代替實際數據庫;
2,為應用加上GUI,仍使用mock數據庫;
3,在集成測階段,用自動化測試腳本(例如通過 Cruise Control )驅動應用,並使用包含測試數據的真實數據庫。
4,在實際使用中,由人來操作應用,並使用生產數據庫。