SOA和微服務(wù)關(guān)系
SOA團(tuán)隊(duì) 2020-03-16
關(guān)于SOA和微服務(wù)架構(gòu),網(wǎng)上有一篇文章談到微服務(wù)和SOA之間只差了一個(gè)ESB,可以把微服務(wù)當(dāng)做去除了ESB的SOA。ESB是SOA架構(gòu)中的中心總線,設(shè)計(jì)圖形應(yīng)該是星形的,而微服務(wù)是去中心化的分布式軟件架構(gòu)。
對于以上觀點(diǎn)筆者不是很認(rèn)同,首先要看到SOA和微服務(wù)架構(gòu)是一個(gè)層面的東西,而對于ESB和微服務(wù)網(wǎng)關(guān)又是一個(gè)層面的東西,一個(gè)談到是架構(gòu)風(fēng)格和方法,一個(gè)談的是實(shí)現(xiàn)工具或組件。因此把兩個(gè)層面的內(nèi)容放到一起談不太對,下面通過對這兩個(gè)層面的對比分析來談一下SOA和微服務(wù)架構(gòu)的聯(lián)系和區(qū)別:
■ 架構(gòu)風(fēng)格對比
SOA定義:SOA是一種架構(gòu)方法,將傳統(tǒng)的單片式應(yīng)用打破,分解為離散的、自治的業(yè)務(wù)服務(wù),利用標(biāo)準(zhǔn)提升他們的互操作性,從而可以更好地共享、重用和組裝,快速構(gòu)建復(fù)合的應(yīng)用從而滿足業(yè)務(wù)需求的變化。
微服務(wù)架構(gòu)定義:微服務(wù)是一種架構(gòu)風(fēng)格,一個(gè)大型復(fù)雜軟件應(yīng)用由一個(gè)或多個(gè)松耦合微服務(wù)組成。微服務(wù)完全獨(dú)立自治,可以獨(dú)立部署,并通過輕量的HTTP型API進(jìn)行交互。
從定義上看,對于SOA強(qiáng)調(diào)了兩個(gè)重點(diǎn),一個(gè)是找到離散,自治,粗粒度和可重用的服務(wù)能力,其次是服務(wù)本身可以靈活的組合和編排適應(yīng)業(yè)務(wù)變化。而微服務(wù)架構(gòu)更多的是各個(gè)微服務(wù)模塊能夠獨(dú)立自治并在獨(dú)立的進(jìn)程中運(yùn)行,同時(shí)微服務(wù)之間能夠通過輕量的服務(wù)接口進(jìn)行交互和協(xié)同。再展開來看如下:
● 對于服務(wù)本身的自治,離散,無狀態(tài)特征兩種架構(gòu)模式都需要。
● SOA強(qiáng)調(diào)粗粒度,而微服務(wù)架構(gòu)不會(huì)過分強(qiáng)調(diào),由于模塊劃分細(xì)了,本身想粗粒度更加難。
● SOA強(qiáng)調(diào)可復(fù)用,而微服務(wù)架構(gòu)不太強(qiáng)調(diào),要考慮到在分層架構(gòu)模型中UI到服務(wù)層也需要全部走服務(wù)接口
對于SOA找到服務(wù)只是第一步,強(qiáng)調(diào)服務(wù)復(fù)用性和粗粒度的原因也是后續(xù)這些服務(wù)要用到服務(wù)組合和編排里面去,而對于微服務(wù)架構(gòu)沒有過分強(qiáng)調(diào)這點(diǎn),服務(wù)是否涉及到能夠完全靈活編排并不是微服務(wù)架構(gòu)考慮的重點(diǎn),一考慮這個(gè)問題往往使這個(gè)微服務(wù)架構(gòu)變重。
再回來看,微服務(wù)架構(gòu)強(qiáng)調(diào)單體應(yīng)用要打散為多個(gè)獨(dú)立自治,可以在獨(dú)立進(jìn)程中運(yùn)行和管理的微服務(wù)模塊,這個(gè)內(nèi)容本身是屬于SOA思想在系統(tǒng)內(nèi)的徹底內(nèi)化以及組件化架構(gòu)思想的推進(jìn),而傳統(tǒng)SOA更多的關(guān)注的是系統(tǒng)間的協(xié)同和服務(wù)重用 ,因此并沒有過分強(qiáng)調(diào)這點(diǎn)。
由于在微服務(wù)架構(gòu)中沒有了服務(wù)組合編排這層的太多考慮,但是本身這個(gè)事情是要做的,因此很多是單獨(dú)定義了上層的業(yè)務(wù)協(xié)同或應(yīng)用類的微服務(wù)模塊來完成。即在代碼中完成了服務(wù)組合的編排的事情,但是仍然可以看到要更好的完成這個(gè)工作,在底層微服務(wù)模塊基礎(chǔ)上最好能夠有提供領(lǐng)域服務(wù)能力的模塊來實(shí)現(xiàn)服務(wù)的組合和組裝。正式由于這個(gè)原因,個(gè)人認(rèn)為領(lǐng)域服務(wù)設(shè)計(jì)思想在微服務(wù)架構(gòu)中有重要的地位。
基于以上思考,從SOA和微服務(wù)架構(gòu)的對比可以理解為:
微服務(wù)架構(gòu) = 80%的SOA服務(wù)架構(gòu)思想 + 100%的組件化架構(gòu)思想 + 80%的領(lǐng)域建模思想
正是由于這個(gè)原因絕對不能簡單的將微服務(wù)架構(gòu)理解為簡單的做到組件化和數(shù)據(jù)庫拆分,使用了Http Rest接口,或者說使用了類似Spring Cloud等微服務(wù)框架就是微服務(wù)架構(gòu)。
另外,SOA還有一個(gè)核心思想就是強(qiáng)調(diào)了縱向的豎井式建設(shè)模式變化為了分層構(gòu)建模式,而分層的構(gòu)建重點(diǎn)就是下面的組件層,再到服務(wù)層,再到上面的應(yīng)用層。這也是在談SOA的時(shí)候講的平臺(tái)+應(yīng)用構(gòu)建模式,和在談微服務(wù)架構(gòu)的時(shí)候講的中臺(tái)+前臺(tái)是一個(gè)道理,都在強(qiáng)調(diào)分層構(gòu)建思路。
■ ESB和微服務(wù)網(wǎng)關(guān)對比
ESB服務(wù)總線定義:ESB總線從SOA架構(gòu)風(fēng)格發(fā)展而來,是傳統(tǒng)中間件技術(shù)與XML、Web服務(wù)等技術(shù)結(jié)合的產(chǎn)物。它是一種總線方式的連接中樞,以管理和簡化應(yīng)用之間的集成拓?fù)浣Y(jié)構(gòu),以廣為接受的開放標(biāo)準(zhǔn)為基礎(chǔ)來支持應(yīng)用之間在消息、事件和服務(wù)級別上動(dòng)態(tài)的互連互通,是一種在松散耦合的服務(wù)和應(yīng)用之間標(biāo)準(zhǔn)的集成方式。
微服務(wù)網(wǎng)關(guān)定義:微服務(wù)網(wǎng)關(guān)或API網(wǎng)關(guān)本身是將微服務(wù)域中所有微服務(wù)需要對外暴露的API接口統(tǒng)一接口并對外開放,在外部進(jìn)行接口訪問的時(shí)候?qū)崿F(xiàn)路由轉(zhuǎn)發(fā)(服務(wù)代理),過濾(日志,安全,流控)等核心能力。
ESB服務(wù)總線可以理解為將傳統(tǒng)的單點(diǎn)集成轉(zhuǎn)化為總線式集成的核心部件,它是企業(yè)內(nèi)部業(yè)務(wù)系統(tǒng)間業(yè)務(wù)協(xié)同和數(shù)據(jù)集成的高速公路,通過將所有的服務(wù)注冊和接入,來實(shí)現(xiàn)對所有服務(wù)運(yùn)行的管理和監(jiān)控,在這個(gè)過程中提供了服務(wù)注冊,適配器,協(xié)議轉(zhuǎn)換,消息格式轉(zhuǎn)換,消息集成,數(shù)據(jù)映射,簡單服務(wù)編排,安全認(rèn)證,日志,流控等多種能力。
而對于微服務(wù)架構(gòu)下一樣,仍然需要對微服務(wù)架構(gòu)進(jìn)行統(tǒng)一管理,只是在微服務(wù)架構(gòu)下都是標(biāo)準(zhǔn)的Http Rest接口和AMQP消息接口了,對于傳統(tǒng)的服務(wù)適配和協(xié)議轉(zhuǎn)換等沒有了,同時(shí)對于服務(wù)的編排這種重的能力也不再需要。那么更多的將體現(xiàn)在對服務(wù)的管理能力上。這種管理能力包括了服務(wù)的統(tǒng)一注冊和發(fā)現(xiàn),服務(wù)安全,服務(wù)集群和路由,服務(wù)限流,日志等能力上。
在談微服務(wù)架構(gòu)的核心組件的時(shí)候,有文章會(huì)把服務(wù)注冊和發(fā)現(xiàn),微服務(wù)網(wǎng)關(guān),服務(wù)限流和容錯(cuò)能力并列,而實(shí)際上我們完全可以將上述能力全部做為微服務(wù)網(wǎng)關(guān)應(yīng)該具備的能力。這些能力有些是在引擎層面的,有些是在管控層面的,都必須要具備。
基于以上分析,我們可以這樣理解ESB和微服務(wù)網(wǎng)關(guān):
微服務(wù)網(wǎng)關(guān) = 傳統(tǒng)ESB + 去掉了復(fù)雜服務(wù)適配和協(xié)議轉(zhuǎn)換 +去掉了服務(wù)編排 + 提升了限流容錯(cuò)能力
關(guān)于微服務(wù)架構(gòu)是否就一定是去中心化的?一個(gè)重要的判斷依據(jù)就是看我們是否使用了微服務(wù)網(wǎng)關(guān)。從微服務(wù)網(wǎng)關(guān)的定義上可以看到微服務(wù)網(wǎng)關(guān)本身也是一種中心化,總線式的集成方式,這點(diǎn)和ESB是完全相同。
如果微服務(wù)間的接口僅僅局限在微服務(wù)域內(nèi)部,那么完全可以只采用注冊中心即可,而沒有用到微服務(wù)網(wǎng)關(guān),此時(shí)我們說這個(gè)微服務(wù)架構(gòu)是去中心化的。但如果微服務(wù)域需要對外對外發(fā)布接口服務(wù)能力,此時(shí)就可能需要使用到微服務(wù)或API網(wǎng)關(guān),這里又有兩種不同的情況:
1. 如果微服務(wù)網(wǎng)關(guān)只提供了類似服務(wù)注冊和發(fā)現(xiàn)能力,實(shí)際訪問仍然是點(diǎn)對點(diǎn)的服務(wù)調(diào)用,這種模式下還是可以理解為整個(gè)微服務(wù)架構(gòu)是去中心化的。
2. 如果微服務(wù)網(wǎng)關(guān)提供了完全的對被調(diào)用系統(tǒng)的安全隔離,包括提供了對每次消息調(diào)用的日志追溯能力,那么這個(gè)微服務(wù)網(wǎng)關(guān)就是一個(gè)不可繞過的中心節(jié)點(diǎn),此時(shí)整個(gè)微服務(wù)架構(gòu)也就不再是去中心化的架構(gòu)了。
可以看到,在傳統(tǒng)架構(gòu)里面只有ESB服務(wù)總線,而在微服務(wù)架構(gòu)里面除了中心化的微服務(wù)網(wǎng)關(guān),還有去中心化的服務(wù)注冊中心,這個(gè)本身也是和傳統(tǒng)架構(gòu)的一個(gè)重要區(qū)別。即:對于ESB總線的能力,在微服務(wù)架構(gòu)里面可以選擇微服務(wù)網(wǎng)關(guān)和微服務(wù)注冊中心兩種替代方式。
一句話總結(jié)SOA和微服務(wù)架構(gòu)的關(guān)系:微服務(wù)不再強(qiáng)調(diào)傳統(tǒng)SOA架構(gòu)里面比較重的ESB企業(yè)服務(wù)總線,同時(shí)SOA的思想進(jìn)入到單個(gè)業(yè)務(wù)系統(tǒng)內(nèi)部實(shí)現(xiàn)真正的組件化。