<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          架構(gòu)設(shè)計(jì):業(yè)務(wù)邏輯和技術(shù)分離

          共 5145字,需瀏覽 11分鐘

           ·

          2020-12-23 03:03




          架構(gòu)


          1. 什么是架構(gòu)?


          關(guān)于架構(gòu)這個(gè)概念很難給出一個(gè)明確的定義,也沒(méi)有一個(gè)標(biāo)準(zhǔn)的定義。


          硬是要給一個(gè)概述,我認(rèn)為架構(gòu)就是對(duì)系統(tǒng)中的實(shí)體以及實(shí)體之間的關(guān)系所進(jìn)行的抽象描述。


          架構(gòu)始于建筑,是因?yàn)槿祟惏l(fā)展(原始人自給自足住在樹(shù)上,也就不需要架構(gòu)),分工協(xié)作的需要,將目標(biāo)系統(tǒng)按某個(gè)原則進(jìn)行切分,切分的原則,是要便于不同的角色進(jìn)行并行工作。


          2. 為什么需要架構(gòu)?


          有系統(tǒng)的地方就需要架構(gòu),大到航空飛機(jī),小到一個(gè)電商系統(tǒng)里面的一個(gè)功能組件都需要設(shè)計(jì)和架構(gòu)。


          我很喜歡《系統(tǒng)架構(gòu):復(fù)雜系統(tǒng)的產(chǎn)品設(shè)計(jì)與開(kāi)發(fā)》里面的一句話:結(jié)構(gòu)良好的創(chuàng)造活動(dòng)要優(yōu)于毫無(wú)結(jié)構(gòu)的創(chuàng)造活動(dòng)。


          與之相對(duì)應(yīng)的,現(xiàn)在很多敏捷思想提倡 no design,只要 work 就好。期待好的架構(gòu)可以在迭代中自然涌現(xiàn)。這個(gè)想法有點(diǎn)太理想化了,在現(xiàn)實(shí)中,只要能 work 的代碼,工程師是很少有動(dòng)力去重構(gòu)和優(yōu)化的。


          3. 架構(gòu)師的職責(zé)


          作為架構(gòu)師,我們最重要的價(jià)值應(yīng)該是“化繁為簡(jiǎn)”。但凡讓事情變得更復(fù)雜,讓系統(tǒng)變得更晦澀難懂的架構(gòu)都是值得商榷的。


          架構(gòu)師的工作就是要努力訓(xùn)練自己的思維,用它去理解復(fù)雜的系統(tǒng),通過(guò)合理的分解和抽象,使哪些系統(tǒng)不再那么難懂。我們應(yīng)該努力構(gòu)建易懂的架構(gòu),使得在系統(tǒng)上工作的其他人員(例如設(shè)計(jì)者、實(shí)現(xiàn)者、操作員等)可以較為容易地理解這個(gè)系統(tǒng)。



          軟件架構(gòu)


          軟件架構(gòu)是一個(gè)系統(tǒng)的草圖。軟件架構(gòu)描述的對(duì)象是直接構(gòu)成系統(tǒng)的抽象組件。各個(gè)組件之間的連接則明確和相對(duì)細(xì)致地描述組件之間的通信。在實(shí)現(xiàn)階段,這些抽象組件被細(xì)化為實(shí)際的組件,比如具體某個(gè)類或者對(duì)象。在面向?qū)ο箢I(lǐng)域中,組件之間的連接通常用接口來(lái)實(shí)現(xiàn)。


          軟件架構(gòu)軟件系統(tǒng)提供了一個(gè)結(jié)構(gòu)、行為和屬性的高級(jí)抽象,由構(gòu)件的描述、構(gòu)件的相互作用、指導(dǎo)構(gòu)件集成的模式以及這些模式的約束組成。軟件架構(gòu)不僅顯示了軟件需求和軟件結(jié)構(gòu)之間的對(duì)應(yīng)關(guān)系,而且指定了整個(gè)軟件系統(tǒng)的組織和拓?fù)浣Y(jié)構(gòu),提供了一些設(shè)計(jì)決策的基本原理。


          軟件架構(gòu)的核心價(jià)值應(yīng)該只圍繞一個(gè)核心命題:控制復(fù)雜性。他并不意味著某個(gè)特定的分層結(jié)構(gòu),某個(gè)特定的方法論(貧血、DDD 等)。



          軟件架構(gòu)分類


          在介紹應(yīng)用架構(gòu)之前,我們先來(lái)看一下軟件架構(gòu)的分類。


          隨著互聯(lián)網(wǎng)的發(fā)展,現(xiàn)在的系統(tǒng)要支撐數(shù)億人同時(shí)在線購(gòu)物、通信、娛樂(lè)的需要,相應(yīng)的軟件體系結(jié)構(gòu)也變得越來(lái)越復(fù)雜。軟件架構(gòu)的含義也變得更加寬泛,我們不能簡(jiǎn)單地用一個(gè)軟件架構(gòu)來(lái)指代所有的軟件架構(gòu)工作。按照我個(gè)人理解,我將軟件架構(gòu)劃分為:



          業(yè)務(wù)架構(gòu):由業(yè)務(wù)架構(gòu)師負(fù)責(zé),也可以稱為業(yè)務(wù)領(lǐng)域?qū)<摇⑿袠I(yè)專家。業(yè)務(wù)架構(gòu)屬于頂層設(shè)計(jì),其對(duì)業(yè)務(wù)的定義和劃分會(huì)影響組織結(jié)構(gòu)和技術(shù)架構(gòu)。例如,阿里巴巴在沒(méi)有中臺(tái)部門(mén)之前,每個(gè)業(yè)務(wù)部門(mén)的技術(shù)架構(gòu)都是煙囪式的,淘寶、天貓、飛豬、1688 等各有一套體系結(jié)構(gòu)。而后,成立了共享平臺(tái)事業(yè)部,打通了賬號(hào)、商品、訂單等體系,讓商業(yè)基礎(chǔ)實(shí)施的復(fù)用成為可能。


          應(yīng)用架構(gòu):由應(yīng)用架構(gòu)師負(fù)責(zé),他需要根據(jù)業(yè)務(wù)場(chǎng)景的需要,設(shè)計(jì)應(yīng)用的層次結(jié)構(gòu),制定應(yīng)用規(guī)范、定義接口和數(shù)據(jù)交互協(xié)議等。并盡量將應(yīng)用的復(fù)雜度控制在一個(gè)可以接受的水平,從而在快速的支撐業(yè)務(wù)發(fā)展的同時(shí),在保證系統(tǒng)的可用性和可維護(hù)性的同時(shí),確保應(yīng)用滿足非功能屬性要求(性能、安全、穩(wěn)定性等)。


          分布式系統(tǒng)架構(gòu):分布式系統(tǒng)基本是稍具規(guī)模業(yè)務(wù)的必選項(xiàng)。它需要解決服務(wù)器負(fù)載,分布式服務(wù)的注冊(cè)和發(fā)現(xiàn),消息系統(tǒng),緩存系統(tǒng),分布式數(shù)據(jù)庫(kù)等問(wèn)題,同時(shí)架構(gòu)師要在 CAP(Consistency,Availability,Partition tolerance)之間進(jìn)行權(quán)衡。


          數(shù)據(jù)架構(gòu):對(duì)于規(guī)模大一些的公司,數(shù)據(jù)治理是一個(gè)很重要的課題。如何對(duì)數(shù)據(jù)收集、數(shù)據(jù)處理提供統(tǒng)一的服務(wù)和標(biāo)準(zhǔn),是數(shù)據(jù)架構(gòu)需要關(guān)注的問(wèn)題。其目的就是統(tǒng)一數(shù)據(jù)定義規(guī)范,標(biāo)準(zhǔn)化數(shù)據(jù)表達(dá),形成有效易維護(hù)的數(shù)據(jù)資產(chǎn),搭建統(tǒng)一的大數(shù)據(jù)處理平臺(tái),形成數(shù)據(jù)使用閉環(huán)。


          物理架構(gòu):物理架構(gòu)關(guān)注軟件元件是如何放到硬件上的,包括機(jī)房搭建、網(wǎng)絡(luò)拓?fù)浣Y(jié)構(gòu),網(wǎng)絡(luò)分流器、代理服務(wù)器、Web 服務(wù)器、應(yīng)用服務(wù)器、報(bào)表服務(wù)器、整合服務(wù)器、存儲(chǔ)服務(wù)器和主機(jī)等。


          運(yùn)維架構(gòu):負(fù)責(zé)運(yùn)維系統(tǒng)的規(guī)劃、選型、部署上線,建立規(guī)范化的運(yùn)維體系。



          典型應(yīng)用架構(gòu)


          1. 分層架構(gòu)


          分層是一種常見(jiàn)的根據(jù)系統(tǒng)中的角色(職責(zé)拆分)和組織代碼單元的常規(guī)實(shí)踐。常見(jiàn)的分層結(jié)構(gòu)如下圖所示:



          2. CQRS


          CQS(Command Query Separation,命令查詢分離),最早來(lái)自于 Betrand Meyer(Eiffel 語(yǔ)言之父,OCP 提出者)提出的概念。其基本思想在于,任何一個(gè)對(duì)象的方法可以分為兩大類:


          • 命令(Command): 不返回任何結(jié)果(void),但會(huì)改變對(duì)象的狀態(tài)。


          • 查詢(Query): 返回結(jié)果,但是不會(huì)改變對(duì)象的狀態(tài),對(duì)系統(tǒng)沒(méi)有副作用。



          3. 六邊形架構(gòu)


          六邊形架構(gòu)是 Alistair Cockburn 在 2005 年提出,解決了傳統(tǒng)的分層架構(gòu)所帶來(lái)的問(wèn)題,實(shí)際上它也是一種分層架構(gòu),只不過(guò)不是上下,而是變成了內(nèi)部和外部(如下圖所示)。



          六邊形架構(gòu)又稱為端口-適配器架構(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)用。


          適配器分為兩種類型(如下圖所示),左側(cè)代表 UI 的適配器被稱為主動(dòng)適配器(Driving Adapters),因?yàn)槭撬鼈儼l(fā)起了對(duì)應(yīng)用的一些操作。而右側(cè)表示和后端工具鏈接的適配器,被稱為被動(dòng)適配器(Driven Adapters),因?yàn)樗鼈冎粫?huì)對(duì)主適配器的操作作出響應(yīng)。



          4. 洋蔥圈架構(gòu)


          洋蔥架構(gòu)與六邊形架構(gòu)有著相同的思路,它們都通過(guò)編寫(xiě)適配器代碼將應(yīng)用核心從對(duì)基礎(chǔ)設(shè)施的關(guān)注中解放出來(lái),避免基礎(chǔ)設(shè)施代碼滲透到應(yīng)用核心之中。這樣應(yīng)用使用的工具和傳達(dá)機(jī)制都可以輕松地替換,可以一定程度地避免技術(shù)、工具或者供應(yīng)商鎖定。


          不同的是洋蔥架構(gòu)還告訴我們,企業(yè)應(yīng)用中存在著不止兩個(gè)層次,它在業(yè)務(wù)邏輯中加入了一些在領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的過(guò)程中被識(shí)別出來(lái)的層次(Application,Domain Service,Domain model,Infrastructure 等)。


          另外,它還有著脫離真實(shí)基礎(chǔ)設(shè)施和傳達(dá)機(jī)制應(yīng)用仍然可以運(yùn)行的便利,這樣可以使用 mock 代替它們方便測(cè)試。



          在洋蔥架構(gòu)中,明確規(guī)定了依賴的方向:


          • 外層依賴內(nèi)層

          • 內(nèi)層對(duì)外層無(wú)感知



          COLA?應(yīng)用架構(gòu)


          COLA 架構(gòu)是我團(tuán)隊(duì)自主研發(fā)的應(yīng)用架構(gòu),目前已經(jīng)開(kāi)源。在 COLA 的設(shè)計(jì)中,我們充分汲取了經(jīng)典架構(gòu)的優(yōu)秀思想。除此之外,我們補(bǔ)充了規(guī)范設(shè)計(jì)和擴(kuò)展設(shè)計(jì),并且使用 Archetype 的方式,將架構(gòu)固化下來(lái),以便可以快速的在開(kāi)發(fā)中使用。


          COLA 開(kāi)源地址:https://github.com/alibaba/COLA


          1. 分層設(shè)計(jì)


          COLA 的分層是一種改良了的三層架構(gòu)。主要是將傳統(tǒng)的業(yè)務(wù)邏輯層拆分成應(yīng)用層、領(lǐng)域?qū)雍突A(chǔ)實(shí)施層。如下圖所示,左邊是傳統(tǒng)的分層架構(gòu),右邊是 COLA 的分層架構(gòu)。



          其每一層的作用范圍和含義如下:


          1)展現(xiàn)層(Presentation Layer)


          負(fù)責(zé)以 Rest 的格式接受 Web 請(qǐng)求,然后將請(qǐng)求路由給 Application 層執(zhí)行,并返回視圖模型(View Model),其載體通常是 DTO(Data Transfer Object)。


          2)應(yīng)用層(Application Layer)


          主要負(fù)責(zé)獲取輸入,組裝上下文,做輸入校驗(yàn),調(diào)用領(lǐng)域?qū)幼鰳I(yè)務(wù)處理,如果需要的話,發(fā)送消息通知。當(dāng)然,層次是開(kāi)放的,若有需要,應(yīng)用層也可以直接訪問(wèn)基礎(chǔ)實(shí)施層。


          3)領(lǐng)域?qū)樱―omain Layer)


          主要是封裝了核心業(yè)務(wù)邏輯,并通過(guò)領(lǐng)域服務(wù)(Domain Service)和領(lǐng)域?qū)ο螅‥ntities)的函數(shù)對(duì)外部提供業(yè)務(wù)邏輯的計(jì)算和處理.


          4)基礎(chǔ)實(shí)施層(Infrastructure Layer)


          主要包含 Tunnel(數(shù)據(jù)通道)、Config 和 Common。這里我們使用 Tunnel 概念來(lái)對(duì)所有的數(shù)據(jù)來(lái)源進(jìn)行抽象,這些數(shù)據(jù)來(lái)源可以是數(shù)據(jù)庫(kù)(MySQL,NoSql)、搜索引擎、文件系統(tǒng)、也可以是 SOA 服務(wù)等;Config 負(fù)責(zé)應(yīng)用的配置;Common 是通用的工具類。


          2. 擴(kuò)展設(shè)計(jì)


          對(duì)于只有一個(gè)業(yè)務(wù)的簡(jiǎn)單場(chǎng)景,對(duì)擴(kuò)展性的要求并不突出,這也是為什么擴(kuò)展設(shè)計(jì)常被忽略的原因,因?yàn)槲覀兇蟛糠值南到y(tǒng)都是從單一業(yè)務(wù)開(kāi)始的。但是隨著業(yè)務(wù)場(chǎng)景越來(lái)越復(fù)雜,代碼里面開(kāi)始出現(xiàn)大量的 if-else 邏輯。此時(shí)除了常規(guī)的策略模式以外,我們可以考慮在架構(gòu)層面提供統(tǒng)一的擴(kuò)展解決方案。


          在擴(kuò)展設(shè)計(jì)中,我們提煉出兩個(gè)重要的概念,一個(gè)是業(yè)務(wù)身份,另一個(gè)是擴(kuò)展點(diǎn)。


          業(yè)務(wù)身份是指業(yè)務(wù)在系統(tǒng)唯一標(biāo)識(shí)一個(gè)業(yè)務(wù)或者一個(gè)場(chǎng)景的標(biāo)志。在具體實(shí)現(xiàn)中,我們使用 BizCode 來(lái)表示業(yè)務(wù)身份,其中 BizCode 采用類似 Java 包名命名空間的方式。例如,我們可以用 “ali.tmall” 表示阿里天貓業(yè)務(wù),用 “ali.tmall.car” 表示阿里天貓的汽車業(yè)務(wù),而用 "ali.tmall.car.aftermarket" 代表這是阿里天貓的汽車業(yè)務(wù)的后市場(chǎng)場(chǎng)景。


          每個(gè)業(yè)務(wù)或者場(chǎng)景都可以實(shí)現(xiàn)一個(gè)或多個(gè)擴(kuò)展點(diǎn)(ExtensionPoint),也就是說(shuō)一個(gè)業(yè)務(wù)身份加上一個(gè)擴(kuò)展點(diǎn),可以唯一地確定一個(gè)擴(kuò)展實(shí)現(xiàn)(Extension)。而這個(gè)業(yè)務(wù)身份和擴(kuò)展點(diǎn)的組合,我們將其稱之為擴(kuò)展坐標(biāo)(ExtensionCoordinate),如下圖所示。



          這樣,通過(guò)業(yè)務(wù)身份+擴(kuò)展點(diǎn),我們就可以從框架層面實(shí)現(xiàn)對(duì)不同租戶,不同業(yè)務(wù),不同場(chǎng)景的擴(kuò)展定制了。整個(gè)阿里業(yè)務(wù)中臺(tái)正是基于這個(gè)思想,實(shí)現(xiàn)的多業(yè)務(wù)支撐的。


          3. 規(guī)范設(shè)計(jì)


          任何事物都是規(guī)則性和隨機(jī)性的組合。規(guī)范的意義就在于我們可以將規(guī)則性的東西固化下來(lái),盡量減少隨心所欲帶來(lái)的復(fù)雜度,一致性可以降低系統(tǒng)復(fù)雜度。從命名到架構(gòu)皆是如此,而架構(gòu)本身就是一種規(guī)范和約束,破壞這個(gè)約束,也就破壞了架構(gòu)。


          COLA 制定了一些列的規(guī)范:包括組件(Module)結(jié)構(gòu)、包(Package)結(jié)構(gòu)、命名等。


          比如對(duì)于組件,我們要求使用 COLA 的應(yīng)用都應(yīng)該遵循如下圖所示的組件劃分:



          4. COLA 架構(gòu)總覽


          在架構(gòu)思想上,COLA 主張像六邊形架構(gòu)那樣,使用端口-適配器去解耦技術(shù)細(xì)節(jié);主張像洋蔥圈架構(gòu)那樣,以領(lǐng)域?yàn)楹诵模⑼ㄟ^(guò)依賴倒置反轉(zhuǎn)領(lǐng)域?qū)拥囊蕾嚪较?。最終形成如下圖所示的組件關(guān)系。



          換一個(gè)視角,從 COLA 應(yīng)用處理響應(yīng)一個(gè)請(qǐng)求的過(guò)程來(lái)看。COLA 使用了 CQRS 來(lái)分離命令和查詢的職責(zé),使用擴(kuò)展點(diǎn)和元數(shù)據(jù)來(lái)提升應(yīng)用的擴(kuò)展性。整個(gè)處理流程如下圖所示:




          應(yīng)用架構(gòu)的核心


          縱觀上面介紹的所有應(yīng)用架構(gòu),我們可以發(fā)現(xiàn)一個(gè)共同點(diǎn),就是“核心業(yè)務(wù)邏輯和技術(shù)細(xì)節(jié)分離”。



          是的,六邊形架構(gòu)、洋蔥圈架構(gòu)、以及 COLA 架構(gòu)的核心職責(zé)就是要做核心業(yè)務(wù)邏輯和技術(shù)細(xì)節(jié)的分離和解耦。


          試想一下,業(yè)務(wù)邏輯和技術(shù)細(xì)節(jié)糅雜在一起的情況,所有的代碼都寫(xiě)在 ServiceImpl 里面,前幾行代碼是做 validation 的事,接下來(lái)幾行是做 convert 的事,然后是幾行業(yè)務(wù)處理邏輯的代碼,穿插著,我們需要通過(guò) RPC 或者 DAO 獲取更多的數(shù)據(jù),拿到數(shù)據(jù)后,又是幾行 convert 的代碼,在接上一段業(yè)務(wù)邏輯代碼,然后還要落庫(kù),發(fā)消息.....等等。


          再簡(jiǎn)單的業(yè)務(wù),按照上面這種寫(xiě)代碼的方式,都會(huì)變得復(fù)雜,難維護(hù)。


          因此,我認(rèn)為應(yīng)用架構(gòu)的核心使命就是要分離業(yè)務(wù)邏輯和技術(shù)細(xì)節(jié)。讓核心業(yè)務(wù)邏輯可以反映領(lǐng)域模型和領(lǐng)域應(yīng)用,可以復(fù)用,可以很容易被看懂。讓技術(shù)細(xì)節(jié)在輔助實(shí)現(xiàn)業(yè)務(wù)功能的同時(shí),可以被替換。


          最后我們發(fā)現(xiàn),應(yīng)用架構(gòu)的道就是:讓上帝的歸上帝,凱撒的歸凱撒。


          作者:張建飛 ?阿里巴巴高級(jí)技術(shù)專家

          來(lái)源:阿里巴巴云原生




          轉(zhuǎn)載申明:轉(zhuǎn)載本號(hào)文章請(qǐng)注明作者來(lái)源,本號(hào)發(fā)布文章若存在版權(quán)等問(wèn)題,請(qǐng)留言聯(lián)系處理,謝謝。


          推薦閱讀

          更多架構(gòu)相關(guān)技術(shù)知識(shí)總結(jié)請(qǐng)參考“架構(gòu)師技術(shù)全聯(lián)盟書(shū)店”相關(guān)電子書(shū)(35本技術(shù)資料打包匯總詳情可通過(guò)“閱讀原文”獲取)。

          全店內(nèi)容持續(xù)更新,現(xiàn)下單“架構(gòu)師技術(shù)全店打包匯總(全)”,后續(xù)可享全店內(nèi)容更新“免費(fèi)”贈(zèng)閱,價(jià)格僅收188元(原總價(jià)290元)。



          溫馨提示:

          掃描二維碼關(guān)注公眾號(hào),點(diǎn)擊閱讀原文鏈接獲取架構(gòu)師技術(shù)全店資料打包匯總(全)電子書(shū)資料詳情


          瀏覽 42
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  无码精品人妻一区二区三蜜桃 | 透逼小视频| 天天操天天曰天天爱 | 77777精品成人免费A片 | 性少妇69|