主頁 > 軟體設計 > 微服務架構設計模式學習筆記——六邊形架構

微服務架構設計模式學習筆記——六邊形架構

2021-09-04 09:13:40 軟體設計

目錄

一 軟體架構的4+1模型

二 分層架構風格

三 六邊型架構

四 代碼示例

五 總結


一 軟體架構的4+1模型

先上圖,軟體架構的4+1模型如圖1.1所示:

圖1.1 4+1模型

注:上圖中的元素一詞來源于軟體架構的定義

計算機系統的軟體架構是構建這個系統所需要的一組架構,包括軟體元素、它們之間的關系以及兩者的屬性

-----Bass等著《Documenting Software Architectures:Views and Beyond》

每個視圖的目的如下:

邏輯視圖:以面向物件語言為例,元素包括類和包,它們之間的關系可理解為類和包之間的關系(繼承、關聯和依賴),

實作視圖:構建編譯系統的輸出,該視圖由打包代碼的模塊和組件組成,組件是有一個或多個模塊組成的可執行單元或可部署單元,元素之間的關系為模塊之間的依賴或組合關系,

行程視圖:表示運行時的組件,其中,元素表示一個行程,元素之間的關系為行程間的通信,

部署視圖:表示行程如何映射到機器,其中,元素由機器和行程組成,機器之間的關系為網路,

4 + 1中的1表示場景,場景負責把視圖串聯在一起,每個場景負責描述在一個視圖中的多個架構元素是如何協作來完成一個請求,

二 分層架構風格

分層架構是典型的架構例子,該架構將元素按照“層”的方式組織,每個層有定義明確的職責,同時限制了層與層之間的依賴關系,即:每一層只能依賴于緊鄰的下層或下面的任何層,以常見的三層架構為例(三層架構是應用于邏輯視圖的分層架構),三層架構將應用程式的類組織展示如圖2.1所示:

圖2.1 三層分層架構

在實際開發程序中,三層架構隨著業務的逐漸龐大會出現很明顯的弊端,比如,在表示層中有邏輯層的代碼,導致在實際的三層架構模型中,下層會依賴上層,違背了三層分層機構只能上層依賴下層的原則,導致分層邊界越來越模糊,

三 六邊型架構

為了解決分層架構,隨著業務逐漸判斷導致邊界模糊的問題,六邊形架構應運而生,六邊形架構(也稱為埠-配接器架構)可以看做是分層架構的替代品,如圖3.1所示,

圖3.1 六邊形架構結構圖

六邊形架構風格以業務邏輯為核心的方式組織邏輯視圖,應用具備一個或多個入站配接器,而不是表示層,入站配接器通過呼叫埠來呼叫業務邏輯處理外部的請求,同樣的,應用具備一個或多個出站配接器,而不是資料持久層,出站配接器由業務邏輯中的出站埠呼叫,來呼叫外部系統(mysql,redis,zk等等) ,六邊形架構的一個優點是業務邏輯不依賴于配接器,而是配接器來依賴于業務邏輯,

業務邏輯具有一個或多個埠,在埠中,定義了一組操作,這些操作關于業務如何與外部互動(處理外部請求、呼叫外部系統),以Java開發為例,埠可以理解為Java介面,入站埠是業務邏輯公開的API(如Controller呼叫的業務邏輯介面),供外界呼叫,出站埠是業務邏輯呼叫外部系統的方式

業務邏輯周圍有配接器,配接器也包括入站配接器和出站配接器,其中,入站配接器通過呼叫入站埠來處理外部的請求,我們常見的入站配接器有Spring MVC的controller,訊息代理客戶端等,特別注意的是,多個入站配接器可以呼叫相同的入站埠

出站配接器實作出站埠,通過呼叫外部程式/服務/系統的方式來處理業務邏輯的請求,如訪問資料庫,呼叫遠程RPC,發布訂閱時間等等,

六邊形架構的一個重要好處是,它將業務邏輯和配接器的邏輯分離開,和三層分層架構不同的是,業務邏輯不再依賴表示層或資料訪問層,通過這種分離,對業務邏輯進行單獨的測驗變得更容易,六邊形架構更準確地反映了現代應用程式的架構,外部請求通過多個配接器呼叫業務邏輯,業務邏輯也可以呼叫多個出站配接器,每個配接器呼叫不同的外部系統,

四 代碼示例

以Tom Hombergs的代碼為例進行部分說明,代碼地址如下:

https://github.com/thombergs/buckpal,代碼結構如圖4.1所示:

圖4.1 代碼結構

六邊形架構的原則是業務邏輯不能依賴與配接器,而是配接器需要依賴與業務邏輯,以入站配接器為例,SendMoneyController作為一個入站配接器,它需要呼叫入站埠來呼叫業務邏輯實作具體的請求,這里的入站埠為sendMoney(SendMoneyCommand command)方法,如圖4.2所示:

圖4.2 SendMonryCotroller

針對出站配接器,需要采用依賴倒置的原則(高層模塊不應該依賴底層模塊,兩者都應該依賴其抽象;抽象不應該依賴細節,細節應該依賴抽象,一句話總結就是面向介面編程),

在業務邏輯sendMoney方法中,宣告了2個出站埠loadAccountPort和updateAccountStatePort,出站埠LoadAccountPort,UpdateAccountStatePort是兩個介面,由對應的出站配接器去實作,出站埠是定義在業務邏輯中的,根據依賴倒置原則,出站配接器必須依賴于對應的出站配接器,進而依賴于業務邏輯,而不是業務邏輯依賴于出站配接器,實作了LoadAccountPort和UpdateAccountStatePort出站埠的出站配接器如圖4.3所示:

圖4.3 AccountPersistenceAdapter出站配接器

在業務邏輯sendMoney方法中,通過呼叫實作了出站埠的出站配接器的具體方法在完成業務邏輯對外部系統的呼叫,如圖4.4所示

圖4.4 sendMoney業務邏輯

五 總結

以下是個人理解,可能有誤:

在我看來,當一個服務體量不大的時候,三層分層結構和六邊形架構的區別不大,因為在體量不大的情況下,服務的輸入埠和輸出埠較少,可以簡單的將整個服務看做三層分層架構,隨著服務體量的逐漸擴大,六邊形架構的特點會逐漸體現,通過才有依賴倒置,將業務邏輯和輸入、輸出隔離開,這也是六邊形架構以業務為核心的特點,由于這種特性,六邊形架構適用于對業務代碼的測驗,不用依賴于輸入和外部系統,

還是那句話,技術沒有銀彈,選擇什么樣的技術,架構需要從自身的業務考慮,只有適合自己業務的架構,沒有絕對一勞永逸的架構,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/297444.html

標籤:其他

上一篇:VLAN和埠

下一篇:HTTP HTTPS

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more