深入理解六邊形架構(gòu)

六邊形架構(gòu)或六角架構(gòu)是Alistair Cockburn在2005年提出凌唬,解決了傳統(tǒng)的分層架構(gòu)所帶來(lái)的問(wèn)題,實(shí)際上它也是一種分層架構(gòu)漏麦,只不過(guò)不是上下或左右客税,而是變成了內(nèi)部和外部。在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(DDD)和微服務(wù)架構(gòu)中都出現(xiàn)了六邊形架構(gòu)的身影撕贞,在《實(shí)現(xiàn)領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)》一書(shū)中更耻,作者將六邊形架構(gòu)應(yīng)用到領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的實(shí)現(xiàn),六邊形的內(nèi)部代表了application和domain層麻掸,而在Chris Richardson對(duì)微服務(wù)架構(gòu)模式的定義中酥夭,每個(gè)微服務(wù)使用六邊形架構(gòu)設(shè)計(jì),足見(jiàn)六邊形架構(gòu)的重要性脊奋。那么讓我們一探究竟熬北,它為何如此受青睞。

問(wèn)題

傳統(tǒng)的分層架構(gòu)具有廣泛的應(yīng)用诚隙,例如經(jīng)典的三層架構(gòu)讶隐,把系統(tǒng)分為表示層、業(yè)務(wù)邏輯層久又、數(shù)據(jù)訪問(wèn)層巫延。在Martin Fowler的《企業(yè)應(yīng)用架構(gòu)模式》一書(shū)中做過(guò)深入闡述效五,本書(shū)04年出版,時(shí)至今日分層架構(gòu)仍然是常用的設(shè)計(jì)方法炉峰,分層架構(gòu)可以降低耦合畏妖、提高復(fù)用、分而治之疼阔,但同時(shí)也還是存在一些問(wèn)題:

應(yīng)用邏輯在不同層泄露戒劫,導(dǎo)致替換某一層變得困難、難以對(duì)核心邏輯完整測(cè)試:你是否有過(guò)困惑婆廊,代碼到底應(yīng)該放在哪個(gè)層迅细,雖然定義了各層的職責(zé),但是總有人不嚴(yán)格遵循層次的分界淘邻,對(duì)于三層架構(gòu)茵典,常常會(huì)出現(xiàn)業(yè)務(wù)邏輯寫(xiě)在了表示層,或者業(yè)務(wù)邏輯直接和數(shù)據(jù)訪問(wèn)綁定宾舅。

傳統(tǒng)的分層架構(gòu)是一維的結(jié)構(gòu)统阿,有時(shí)應(yīng)用不光是上下的依賴,可能是多維的依賴贴浙,這時(shí)一維的結(jié)構(gòu)就無(wú)法適應(yīng)了砂吞。

六邊形架構(gòu)又稱為端口-適配器,這個(gè)名字更容器理解崎溃。六邊形架構(gòu)將系統(tǒng)分為內(nèi)部(內(nèi)部六邊形)和外部,內(nèi)部代表了應(yīng)用的業(yè)務(wù)邏輯盯质,外部代表應(yīng)用的驅(qū)動(dòng)邏輯袁串、基礎(chǔ)設(shè)施或其他應(yīng)用。內(nèi)部通過(guò)端口和外部系統(tǒng)通信呼巷,端口代表了一定協(xié)議囱修,以API呈現(xiàn)。一個(gè)端口可能對(duì)應(yīng)多個(gè)外部系統(tǒng)王悍,不同的外部系統(tǒng)需要使用不同的適配器破镰,適配器負(fù)責(zé)對(duì)協(xié)議進(jìn)行轉(zhuǎn)換。這樣就使得應(yīng)用程序能夠以一致的方式被用戶压储、程序鲜漩、自動(dòng)化測(cè)試、批處理腳本所驅(qū)動(dòng)集惋,并且孕似,可以在與實(shí)際運(yùn)行的設(shè)備和數(shù)據(jù)庫(kù)相隔離的情況下開(kāi)發(fā)和測(cè)試。

內(nèi)涵

六邊形架構(gòu)的重點(diǎn)體現(xiàn)在以下幾個(gè)方面:

關(guān)注點(diǎn)

對(duì)于分層架構(gòu)中層次的界定刮刑,Martin Fowler給出了一個(gè)判定的方法喉祭,就是如果把表示層換成其他實(shí)現(xiàn)养渴,如果和原來(lái)的表示層有重復(fù)實(shí)現(xiàn)的內(nèi)容,那么這部分內(nèi)容就應(yīng)該放到業(yè)務(wù)邏輯層泛烙。那么如何讓開(kāi)發(fā)人員在系統(tǒng)設(shè)計(jì)過(guò)程中始終保持這種視角理卑,傳統(tǒng)的分層架構(gòu)是難以做到的。六邊形架構(gòu)有一個(gè)明確的關(guān)注點(diǎn)蔽氨,從一開(kāi)始就強(qiáng)調(diào)把重心放在業(yè)務(wù)邏輯上傻工,外部的驅(qū)動(dòng)邏輯或被驅(qū)動(dòng)邏輯存在可變性、可替換性孵滞,依賴具體技術(shù)細(xì)節(jié)中捆。而業(yè)務(wù)邏輯相對(duì)更加穩(wěn)定,體現(xiàn)應(yīng)用的核心價(jià)值坊饶,需要被詳盡的測(cè)試泄伪。

外部可替換

一個(gè)端口對(duì)應(yīng)多個(gè)適配器,是對(duì)一類外部系統(tǒng)的歸納匿级,它體現(xiàn)了對(duì)外部的抽象蟋滴。應(yīng)用通過(guò)端口為外界提供服務(wù),這些端口需要被良好的設(shè)計(jì)和測(cè)試痘绎。內(nèi)部不關(guān)心外部如何使用端口津函,從一開(kāi)始就要假定外部使用者是可替換的。六邊形的六并沒(méi)有實(shí)質(zhì)意義孤页,只是為了留足夠的空間放置端口和適配器尔苦,一般端口數(shù)不會(huì)超過(guò)4個(gè)。適配器可以分為2類行施,“主”允坚、“從”適配器,也可稱為“驅(qū)動(dòng)者”和“被驅(qū)動(dòng)者”蛾号。

自動(dòng)測(cè)試

在六邊形架構(gòu)中稠项,自動(dòng)化測(cè)試和用戶具有同等的地位,在實(shí)現(xiàn)用戶界面的同時(shí)就需要考慮自動(dòng)化測(cè)試鲜结。它們對(duì)應(yīng)相同的端口展运。六邊形架構(gòu)不僅讓自動(dòng)化測(cè)試這件事情成為設(shè)計(jì)第一要素,同時(shí)自動(dòng)化測(cè)試也保證應(yīng)用邏輯不會(huì)泄露到用戶界面精刷,在技術(shù)上保證了層次的分界拗胜。

依賴倒置

六邊形架構(gòu)必須遵循如下規(guī)則:內(nèi)部相關(guān)的代碼不能泄露到外部。所謂的泄露是指不能出現(xiàn)內(nèi)部依賴外部的情況贬养,只能外部依賴內(nèi)部挤土,這樣才能保證外部是可以替換的。對(duì)于驅(qū)動(dòng)者適配器误算,就是外部依賴內(nèi)部的仰美。但是對(duì)于被驅(qū)動(dòng)者適配器迷殿,實(shí)際是內(nèi)部依賴外部,這時(shí)需要使用依賴倒置咖杂,由驅(qū)動(dòng)者適配器將被驅(qū)動(dòng)者適配器注入到應(yīng)用內(nèi)部庆寺,這時(shí)端口的定義在應(yīng)用內(nèi)部,但是實(shí)現(xiàn)是由適配器實(shí)現(xiàn)诉字。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末懦尝,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子壤圃,更是在濱河造成了極大的恐慌陵霉,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伍绳,死亡現(xiàn)場(chǎng)離奇詭異踊挠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)冲杀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)效床,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人权谁,你說(shuō)我怎么就攤上這事剩檀。” “怎么了旺芽?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵沪猴,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我甥绿,道長(zhǎng)字币,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任共缕,我火速辦了婚禮,結(jié)果婚禮上士复,老公的妹妹穿的比我還像新娘图谷。我一直安慰自己,他們只是感情好阱洪,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布便贵。 她就那樣靜靜地躺著,像睡著了一般冗荸。 火紅的嫁衣襯著肌膚如雪承璃。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天蚌本,我揣著相機(jī)與錄音盔粹,去河邊找鬼隘梨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛舷嗡,可吹牛的內(nèi)容都是我干的轴猎。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼进萄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼捻脖!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起中鼠,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤可婶,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后援雇,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體矛渴,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年熊杨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了曙旭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡晶府,死狀恐怖桂躏,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情川陆,我是刑警寧澤剂习,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布,位于F島的核電站较沪,受9級(jí)特大地震影響鳞绕,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜尸曼,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一们何、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧控轿,春花似錦冤竹、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至在抛,卻和暖如春钟病,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工肠阱, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留票唆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓辖所,卻偏偏與公主長(zhǎng)得像惰说,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子缘回,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容