六邊形架構(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)诉字。