1.傳統(tǒng)架構(gòu)常見(jiàn)問(wèn)題
傳統(tǒng)的分層架構(gòu)具有廣泛的應(yīng)用空免,例如經(jīng)典的三層架構(gòu),把系統(tǒng)分為表示層盆耽、業(yè)務(wù)邏輯層蹋砚、數(shù)據(jù)訪問(wèn)層。
時(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)了专筷。
2.六邊形架構(gòu)特點(diǎn)
架構(gòu)圖
特點(diǎn)
關(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)胸蛛。
代碼(模塊劃分)示例:
GitHup地址: https://github.com/pprector/hexagon
3. 模塊講解
調(diào)用流程圖:
java代碼模塊截圖:
模塊說(shuō)明:
hexagon-bootstrap 啟動(dòng)類、配置文件樱报、集成測(cè)試
hexagon-facade 外觀層, 對(duì)外提供所有的接口定義
hexagon-domain 領(lǐng)域?qū)? 處理主要的業(yè)務(wù)邏輯問(wèn)題,如果邏輯復(fù)雜,可擴(kuò)展子模塊
hexagon-application 應(yīng)用層,體現(xiàn)對(duì)外功能實(shí)現(xiàn). 判斷當(dāng)前功能性質(zhì): 執(zhí)行不同的操作
hexagon-common 工具類,枚舉類,異常,跨模塊通用對(duì)象.
adaptor/hexagon-adaptor-rpc
adaptor/hexagon-adaptor-http
adaptor/hexagon-adaptor-consumer
適配器層: 適配系統(tǒng)各種形式入口,可根據(jù)業(yè)務(wù)場(chǎng)景定制化
infrastructure/hexagon-infrastructure-cache 緩存
infrastructure/hexagon-infrastructure-producer 消息生產(chǎn)
infrastructure/hexagon-infrastructure-repository 數(shù)據(jù)庫(kù)
infrastructure/hexagon-infrastructure-rpc rpc
infrastructure/hexagon-infrastructure-task 任務(wù)調(diào)度
適配器層: 適配組件,可根據(jù)業(yè)務(wù)場(chǎng)景定制化
模塊依賴關(guān)系
- domain層與facade層不依賴其他層. (common除外)
- application層 依賴 domain,facade. 校驗(yàn)并判斷,承上啟下
- adaptor層實(shí)現(xiàn)facade接口.
- infrastructure 依賴domain,application層 根據(jù)業(yè)務(wù)場(chǎng)景. 定制接口
- bootstrap 依賴所有模塊提供啟動(dòng)能力