0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

架構(gòu)與設(shè)計(jì) 常見(jiàn)微服務(wù)分層架構(gòu)的區(qū)別和落地實(shí)踐

京東云 ? 來(lái)源:jf_75140285 ? 作者:jf_75140285 ? 2024-10-22 15:34 ? 次閱讀

前言

從強(qiáng)調(diào)內(nèi)外隔離的六邊形架構(gòu),逐漸發(fā)展衍生出的層層遞進(jìn)、注重領(lǐng)域模型的洋蔥架構(gòu),再到和DDD完美契合的整潔架構(gòu)。架構(gòu)風(fēng)格的不斷演進(jìn),其實(shí)就是為了適應(yīng)軟件需求越來(lái)越復(fù)雜的特點(diǎn)。

可以看到,越現(xiàn)代的架構(gòu)風(fēng)格越傾向于清晰的職責(zé)定位,且讓領(lǐng)域模型成為架構(gòu)的核心。

基于這些架構(gòu)風(fēng)格,在軟件架構(gòu)設(shè)計(jì)過(guò)程中又有非常多的架構(gòu)分層模型。

傳統(tǒng)三層架構(gòu)

傳統(tǒng)服務(wù)通常使用三層架構(gòu):

?門面層:作為服務(wù)暴露的入口,處理所有的外部請(qǐng)求。部分情況下,門面層甚至不需要單獨(dú)定義對(duì)象而是直接使用服務(wù)層的實(shí)體定義。

?服務(wù)層:作為核心業(yè)務(wù)層,包含所有業(yè)務(wù)邏輯。并對(duì)基礎(chǔ)層能力進(jìn)行簡(jiǎn)單組合提供一定的能力復(fù)用。通常服務(wù)層會(huì)進(jìn)行實(shí)體定義來(lái)防止下層對(duì)象體直接暴露給外部服務(wù),導(dǎo)致底層任何變化都有可能直接傳遞到外部,非常不穩(wěn)定。

?基礎(chǔ)層:用來(lái)存放dao和外部rpc服務(wù)的封裝,二者可以拆分為不同的module,也可合二為一,以不同package進(jìn)行隔離。

三層架構(gòu)特點(diǎn)就是簡(jiǎn)單,適用于一些無(wú)復(fù)雜業(yè)務(wù)場(chǎng)景的小型應(yīng)用,或者“數(shù)據(jù)不可變”作為基礎(chǔ)原則的DOP(面向數(shù)據(jù)編程)服務(wù)。

但是當(dāng)業(yè)務(wù)場(chǎng)景稍微復(fù)雜一些、調(diào)用層級(jí)較多時(shí),可復(fù)用性、可維護(hù)性就都非常差了,很多代碼都耦合在一起,牽一發(fā)動(dòng)全身。

wKgaoWcXVYOABfykAACXUPb6uWA473.png

??

?

DDD架構(gòu)

DDD架構(gòu)可以看做是整潔架構(gòu)的一種實(shí)現(xiàn),分層職責(zé)如下:

?適配層:用來(lái)做外部不同端請(qǐng)求的適配器,隔離不同端的協(xié)議差異,包裝不同端不同樣式的響應(yīng)體。

?應(yīng)用層:用例、任務(wù)入口、消息隊(duì)列監(jiān)聽(tīng)均在這一層,可以理解為業(yè)務(wù)流程的入口,通過(guò)聚合根的構(gòu)造執(zhí)行相應(yīng)的命令操作。

?領(lǐng)域服務(wù)層:包含核心的領(lǐng)域服務(wù)定義,并定義了gateway來(lái)做一層依賴倒置,使基礎(chǔ)設(shè)施層僅做實(shí)現(xiàn)。

?基礎(chǔ)設(shè)施層包含一切基礎(chǔ)能力:數(shù)據(jù)庫(kù)、ES、遠(yuǎn)程調(diào)用封裝等等。

wKgZoWcXVYaAFWHcAAF5DXMtSP4093.png

??

優(yōu)點(diǎn)

?核心穩(wěn)定:領(lǐng)域模型在依賴鏈上是頂層角色,不依賴任何其他模塊,所以極其穩(wěn)定。其他任何業(yè)務(wù)域、存儲(chǔ)、邊緣能力的變化都不會(huì)對(duì)領(lǐng)域模型造成影響。

?敏捷:適合不同團(tuán)隊(duì)一起開(kāi)發(fā)和維護(hù)而不會(huì)產(chǎn)生沖突。

?可拆分:當(dāng)有屆上下文隨著演進(jìn)逐漸膨脹時(shí),很容易拆分成微服務(wù)。

?可擴(kuò)展:添加新的功能非常簡(jiǎn)單,從而使得開(kāi)發(fā)人員能夠更快的部署和調(diào)整。

?可演進(jìn):良好的可測(cè)試性帶來(lái)非常低的重構(gòu)成本,不會(huì)隨著不斷迭代導(dǎo)致項(xiàng)目成為難以修改的“大泥球”。

如此多的優(yōu)點(diǎn)自然帶來(lái)明確的缺點(diǎn)

?專業(yè)性要求較高:需要對(duì)業(yè)務(wù)、架構(gòu)原則理解深刻的人員進(jìn)行設(shè)計(jì)和維護(hù),不恰當(dāng)?shù)念I(lǐng)域模型將使后續(xù)迭代極為痛苦。

?開(kāi)發(fā)成本高:復(fù)雜的架構(gòu)設(shè)計(jì),更多的架構(gòu)分層,自然帶來(lái)代碼行數(shù)的指數(shù)級(jí)增長(zhǎng)。尤其是項(xiàng)目前期的開(kāi)發(fā)任務(wù)變得異常繁重。

?不再適合簡(jiǎn)單的業(yè)務(wù)場(chǎng)景:實(shí)現(xiàn)一個(gè)簡(jiǎn)單的CRUD顯得過(guò)于復(fù)雜。

?改變決策困難:嘗試使用整潔架構(gòu)需要和團(tuán)隊(duì)的管理層和其他成員達(dá)成一致,這往往需要非常強(qiáng)大的說(shuō)服力。如果在架構(gòu)演進(jìn)過(guò)程中想切換回其他架構(gòu)模式也十分困難,幾乎是整個(gè)項(xiàng)目級(jí)別的重構(gòu)工作。

簡(jiǎn)單的微服務(wù)分層架構(gòu)

基于六邊形架構(gòu)規(guī)范的接口適配原則和防腐理念,同時(shí)借鑒了CQRS模式的優(yōu)點(diǎn),我們定義了一個(gè)簡(jiǎn)單的微服務(wù)分層架構(gòu)。

骨架Maven坐標(biāo):

com.jdt.open
simple-microservices-layered-architecture-archetype
1.4.0

分層定義:

?門面層:作為程序的入口,通過(guò)包隔離來(lái)存放JSF服務(wù)、Rest服務(wù)、定時(shí)任務(wù)和MQ消費(fèi),其中對(duì)外提供服務(wù)的接口定義存放在單獨(dú)的api包中。該層的請(qǐng)求定義命名以Request結(jié)尾,響應(yīng)體命名以Response結(jié)尾。

?領(lǐng)域服務(wù)層:每一個(gè)領(lǐng)域服務(wù)存放在單獨(dú)的module中,并通過(guò)單獨(dú)的api包對(duì)外暴露能力。該層的命令請(qǐng)求定義命名以Command結(jié)尾,查詢請(qǐng)求定義命名以Query結(jié)尾,響應(yīng)體命名以Dto結(jié)尾。

?基礎(chǔ)設(shè)施層:存放數(shù)據(jù)庫(kù)、ES、遠(yuǎn)程調(diào)用服務(wù)的封裝。該層的持久化數(shù)據(jù)定義命名以Po結(jié)尾。遠(yuǎn)程命令服務(wù)入?yún)⒚訰pcCommand結(jié)尾,遠(yuǎn)程查詢服務(wù)入?yún)⒚訰pcQuery結(jié)尾,響應(yīng)體命名以RpcDto結(jié)尾。

wKgaoWcXVYeAcF4cAAKr0lvCPic583.png

??

最佳實(shí)踐

1.命令服務(wù)必須訪問(wèn)領(lǐng)域服務(wù)層,允許簡(jiǎn)單查詢直接調(diào)用基礎(chǔ)設(shè)施層。

2.參數(shù)校驗(yàn)、請(qǐng)求出入?yún)⑷罩?、審?jì)日志記錄、TraceID預(yù)埋、異常處理等非核心業(yè)務(wù)能力均由公共組件(參考: Open-Lab組件包 )完成,減少項(xiàng)目?jī)?nèi)部的邊緣能力代碼。

3.由于在門面層進(jìn)行統(tǒng)一的異常處理,非必要時(shí)無(wú)需在項(xiàng)目中進(jìn)行大面積的try-catch,讓代碼更清爽。

4.實(shí)際開(kāi)發(fā)過(guò)程中,門面層、領(lǐng)域服務(wù)層和基礎(chǔ)設(shè)施層均有各自的實(shí)體定義,跨層調(diào)用的對(duì)象體轉(zhuǎn)換使用MapStruct組件來(lái)減少手寫(xiě)映射代碼的工作量。

5.數(shù)據(jù)層使用Fluent-Mybatis,最大好處是減少后期迭代中,數(shù)據(jù)對(duì)象增減字段時(shí)修改Mapper的成本。

優(yōu)點(diǎn)

1. 開(kāi)發(fā)效率

簡(jiǎn)單的業(yè)務(wù)開(kāi)發(fā)過(guò)程中,相比較書(shū)寫(xiě)核心業(yè)務(wù)邏輯,更多的工作量幾乎都是來(lái)自處理跨層調(diào)用時(shí)對(duì)象轉(zhuǎn)換和Mapper定義,通過(guò)MapStruct和Fluent-Mybatis等組件的使用(也許再加上GitHub Copilot

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 分層架構(gòu)
    +關(guān)注

    關(guān)注

    0

    文章

    4

    瀏覽量

    6406
  • 微服務(wù)
    +關(guān)注

    關(guān)注

    0

    文章

    131

    瀏覽量

    7322
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    GPU服務(wù)器AI網(wǎng)絡(luò)架構(gòu)設(shè)計(jì)

    眾所周知,在大型模型訓(xùn)練中,通常采用每臺(tái)服務(wù)器配備多個(gè)GPU的集群架構(gòu)。在上一篇文章《高性能GPU服務(wù)器AI網(wǎng)絡(luò)架構(gòu)(上篇)》中,我們對(duì)GPU網(wǎng)絡(luò)中的核心術(shù)語(yǔ)與概念進(jìn)行了詳盡介紹。本文
    的頭像 發(fā)表于 11-05 16:20 ?88次閱讀
    GPU<b class='flag-5'>服務(wù)</b>器AI網(wǎng)絡(luò)<b class='flag-5'>架構(gòu)</b>設(shè)計(jì)

    邊緣計(jì)算架構(gòu)設(shè)計(jì)最佳實(shí)踐

    邊緣計(jì)算架構(gòu)設(shè)計(jì)最佳實(shí)踐涉及多個(gè)方面,以下是一些關(guān)鍵要素和最佳實(shí)踐建議: 一、核心組件與架構(gòu)設(shè)計(jì) 邊緣設(shè)備與網(wǎng)關(guān) 邊緣設(shè)備 :包括各種嵌入式設(shè)備、傳感器、智能手機(jī)、智能攝像頭等,負(fù)責(zé)采
    的頭像 發(fā)表于 10-24 14:17 ?297次閱讀

    微服務(wù)架構(gòu)與容器云的關(guān)系與區(qū)別

    微服務(wù)架構(gòu)與容器云密切相關(guān)又有所區(qū)別微服務(wù)將大型應(yīng)用拆分為小型、獨(dú)立的服務(wù),而容器云基于容器技術(shù),為
    的頭像 發(fā)表于 10-21 17:28 ?135次閱讀

    指令集架構(gòu)與微架構(gòu)區(qū)別

    指令集架構(gòu)(Instruction Set Architecture,ISA)與微架構(gòu)(Microarchitecture)是計(jì)算機(jī)體系結(jié)構(gòu)中的兩個(gè)重要概念,它們?cè)谔幚砥鞯脑O(shè)計(jì)和實(shí)現(xiàn)中扮演著不同的角色。以下是對(duì)兩者區(qū)別的詳細(xì)闡述
    的頭像 發(fā)表于 10-05 15:10 ?353次閱讀

    服務(wù)器而言,ARM架構(gòu)與X86架構(gòu)有什么區(qū)別?各自的優(yōu)勢(shì)在哪里?

    ,x86 架構(gòu)服務(wù)器在市場(chǎng)占主導(dǎo),有強(qiáng)大處理能力和廣泛軟件兼容性,廣泛用于企業(yè)數(shù)據(jù)中心。ARM 架構(gòu)服務(wù)器近年崛起,憑借低功耗、高效能優(yōu)勢(shì)在云計(jì)算和
    的頭像 發(fā)表于 09-09 14:05 ?1179次閱讀

    Proxyless的多活流量和微服務(wù)治理

    1. 引言 1.1 項(xiàng)目的背景及意義 在當(dāng)今的微服務(wù)架構(gòu)中,應(yīng)用程序通常被拆分成多個(gè)獨(dú)立的服務(wù),這些服務(wù)通過(guò)網(wǎng)絡(luò)進(jìn)行通信。這種架構(gòu)的優(yōu)勢(shì)在于
    的頭像 發(fā)表于 08-28 16:54 ?1515次閱讀
    Proxyless的多活流量和<b class='flag-5'>微服務(wù)</b>治理

    ai服務(wù)器是什么架構(gòu)類型

    AI服務(wù)器,即人工智能服務(wù)器,是專門為人工智能應(yīng)用設(shè)計(jì)的高性能計(jì)算服務(wù)器。AI服務(wù)器的架構(gòu)類型有很多種,以下是一些
    的頭像 發(fā)表于 07-02 09:51 ?863次閱讀

    不能獨(dú)立開(kāi)發(fā),是因?yàn)槟悴欢浖?b class='flag-5'>架構(gòu)

    不想錯(cuò)過(guò),記得右上角-查看公眾號(hào)-設(shè)為星標(biāo),摘下星星送給我嵌入式軟件架構(gòu)設(shè)計(jì)一般采用分層思想,稱為“分層架構(gòu)”。part1一、什么是分層
    的頭像 發(fā)表于 03-15 08:09 ?935次閱讀
    不能獨(dú)立開(kāi)發(fā),是因?yàn)槟悴欢浖?b class='flag-5'>架構(gòu)</b>

    游戲公司不使用微服務(wù)架構(gòu)的原因

    微服務(wù)基本只有 request/response 的模式。做不了 streaming?微服務(wù)通常要求應(yīng)用是無(wú)狀態(tài)的才能做到水平擴(kuò)展。streaming 本身就是加入了狀態(tài)
    的頭像 發(fā)表于 12-29 11:18 ?397次閱讀

    如何搭建微服務(wù)架構(gòu)的全局圖景

    如果一直保持共用數(shù)據(jù)庫(kù)的模式,則整個(gè)架構(gòu)會(huì)越來(lái)越僵化,失去了微服務(wù)架構(gòu)的意義。因此小明和小紅一鼓作氣,把數(shù)據(jù)庫(kù)也拆分了。所有持久化層相互隔離,由各個(gè)服務(wù)自己負(fù)責(zé)。另外,為了提高系統(tǒng)的實(shí)
    的頭像 發(fā)表于 12-27 15:16 ?451次閱讀
    如何搭建<b class='flag-5'>微服務(wù)</b><b class='flag-5'>架構(gòu)</b>的全局圖景

    dubbo和spring cloud區(qū)別

    Dubbo和Spring Cloud是兩個(gè)非常流行的微服務(wù)框架,各有自己的特點(diǎn)和優(yōu)勢(shì)。在本文中,我們將詳細(xì)介紹Dubbo和Spring Cloud的區(qū)別。 1.架構(gòu)設(shè)計(jì): Dubbo是阿里巴巴開(kāi)源
    的頭像 發(fā)表于 12-04 14:47 ?1529次閱讀

    如何構(gòu)建彈性、高可用的微服務(wù)?

    基于微服務(wù)的應(yīng)用程序可實(shí)現(xiàn)戰(zhàn)略性數(shù)字轉(zhuǎn)型和云遷移計(jì)劃,對(duì)于開(kāi)發(fā)團(tuán)隊(duì)來(lái)說(shuō),這種架構(gòu)十分重要。那么,如何來(lái)構(gòu)建彈性、高可用的微服務(wù)呢?RedisEnterprise給出了一個(gè)完美的方案。文況速覽
    的頭像 發(fā)表于 11-26 08:06 ?436次閱讀
    如何構(gòu)建彈性、高可用的<b class='flag-5'>微服務(wù)</b>?

    設(shè)計(jì)微服務(wù)架構(gòu)的原則

    微服務(wù)是一種軟件架構(gòu)策略,有利于改善整體性能和可擴(kuò)展性。你可能會(huì)想,我的團(tuán)隊(duì)需不需要采用微服務(wù),設(shè)計(jì)微服務(wù)架構(gòu)有哪些原則?本文會(huì)給你一些靈感
    的頭像 發(fā)表于 11-26 08:05 ?536次閱讀
    設(shè)計(jì)<b class='flag-5'>微服務(wù)</b><b class='flag-5'>架構(gòu)</b>的原則

    docker微服務(wù)架構(gòu)實(shí)戰(zhàn)

    的容器化技術(shù),為微服務(wù)架構(gòu)的實(shí)施提供了強(qiáng)大的支持。本文將介紹Docker微服務(wù)架構(gòu)的實(shí)戰(zhàn)經(jīng)驗(yàn),包括Docker的概述、微服務(wù)
    的頭像 發(fā)表于 11-23 09:26 ?611次閱讀

    springcloud微服務(wù)架構(gòu)

    Spring Cloud是一個(gè)開(kāi)源的微服務(wù)架構(gòu)框架,它提供了一系列工具和組件,用于構(gòu)建和管理分布式系統(tǒng)中的微服務(wù)。它基于Spring框架,旨在通過(guò)簡(jiǎn)化開(kāi)發(fā)過(guò)程和降低系統(tǒng)復(fù)雜性來(lái)幫助開(kāi)發(fā)人員構(gòu)建彈性
    的頭像 發(fā)表于 11-23 09:24 ?1147次閱讀