
本文目標(biāo):搞清楚什么是SOA架構(gòu)、微服務(wù)架構(gòu),兩者區(qū)別是什么?Service Mesh是什么,跟微服務(wù)有什么關(guān)系?
SOA架構(gòu)
提到SOA架構(gòu)(Service-Oriented Architecture,面向服務(wù)架構(gòu)),就一定會(huì)講到ESB(Enterprise Service Bus,企業(yè)服務(wù)總線)。ESB作為SOA中的核心概念,首先我們就來(lái)看看ESB是什么,以及它在SOA架構(gòu)中扮演的角色。
在企業(yè)計(jì)算領(lǐng)域,企業(yè)服務(wù)總線是指由中間件基礎(chǔ)設(shè)施產(chǎn)品技術(shù)實(shí)現(xiàn)的、 通過(guò)事件驅(qū)動(dòng)和基于XML消息引擎,為更復(fù)雜的面向服務(wù)的架構(gòu)提供的軟件架構(gòu)的構(gòu)造物。企業(yè)服務(wù)總線通常在企業(yè)消息系統(tǒng)上提供一個(gè)抽象層,使得集成架構(gòu)師能夠不用編碼而是利用消息的價(jià)值完成集成工作。
上面是WIKI中對(duì)ESB的定義,加上《企業(yè)服務(wù)總線》文章中對(duì)ESB的描述,畫(huà)了一個(gè)ESB使用的場(chǎng)景。

在圖中,Service A是企業(yè)內(nèi)部的請(qǐng)假服務(wù),當(dāng)員工請(qǐng)假申請(qǐng)審批通過(guò)之后,Service A會(huì)發(fā)送請(qǐng)假審批的結(jié)果以及相關(guān)數(shù)據(jù)到ESB(通過(guò)消息)。在ESB內(nèi)部,Router會(huì)根據(jù)消息中攜帶的數(shù)據(jù)做路由,如果屬于B子公司的員工,會(huì)被分發(fā)到SQL Transform進(jìn)行轉(zhuǎn)換,最終被寫(xiě)入到DB;如果屬于C子公司,會(huì)被分發(fā)到CSV Transform進(jìn)行轉(zhuǎn)換,最終變成csv文件上傳到FTP上。Service B和Service C都是員工出勤統(tǒng)計(jì)報(bào)表服務(wù),分別屬于子公司B和子公司C,數(shù)據(jù)輸入的格式不同(DB/CSV文件)。
在上面的場(chǎng)景中,ESB提供了3個(gè)功能:
- 協(xié)議轉(zhuǎn)換。
- 數(shù)據(jù)路由。
- 數(shù)據(jù)格式轉(zhuǎn)換。
以上3個(gè)功能組合,實(shí)現(xiàn)了三個(gè)不那么“一致”的Service A B C服務(wù)的集成,同時(shí)服務(wù)與服務(wù)之間是松耦合的。這里先記住兩個(gè)關(guān)鍵詞:服務(wù)集成和松耦合。后面可以與微服務(wù)架構(gòu)對(duì)比著看。
微服務(wù)架構(gòu)
微服務(wù)架構(gòu)在名字中也有服務(wù)兩個(gè)字,SOA是面向服務(wù)架構(gòu)。這兩個(gè)服務(wù)是一個(gè)意思嗎?先拋一個(gè)個(gè)人觀點(diǎn):微服務(wù)中的服務(wù)與面向服務(wù)架構(gòu)中的服務(wù)本質(zhì)上是同一種東西,都是對(duì)外開(kāi)放的、供他人使用的能力,區(qū)別在于服務(wù)的粒度大小,劃分服務(wù)的維度有所不同。那微服務(wù)架構(gòu)與SOA架構(gòu)是否是同一個(gè)概念?我覺(jué)得不是,下面以我待過(guò)的某電商網(wǎng)站舉個(gè)例子。
之前在某電商網(wǎng)站工作過(guò)一年多,入職時(shí)整個(gè)網(wǎng)站所有功能都在一個(gè)工程中,工程代碼差不多有10G,即使在公司內(nèi)網(wǎng)想要clone到本地也要不少時(shí)間。所有業(yè)務(wù)線都在上面做開(kāi)發(fā),因?yàn)槭峭粋€(gè)工程,每個(gè)業(yè)務(wù)線沒(méi)有自主發(fā)布權(quán),只能每天定時(shí)線上發(fā)布一次。每次發(fā)布都是災(zāi)難:代碼沖突、代碼合并導(dǎo)致的BUG,經(jīng)常因?yàn)槠渲幸粋€(gè)功能有bug,導(dǎo)致整個(gè)發(fā)布流程阻塞,所有新功能無(wú)法上線。隨著業(yè)務(wù)發(fā)展,公司領(lǐng)導(dǎo)自然也意識(shí)到問(wèn)題的影響越來(lái)越嚴(yán)重,于是拍了解決方案,就一個(gè)字:拆。按代碼分層(web層、服務(wù)層)、業(yè)務(wù)線(交易、促銷(xiāo)、會(huì)員等)把代碼拆成獨(dú)立的工程。于是就有了下面的微服務(wù)架構(gòu)。

原本統(tǒng)一的工程被拆成了多個(gè)服務(wù)(圖中只是服務(wù)依賴(lài)關(guān)系舉例,沒(méi)畫(huà)出微服務(wù)基礎(chǔ)組件)。業(yè)務(wù)代碼變得可擴(kuò)展、易維護(hù),提高了開(kāi)發(fā)效率。所以微服務(wù)的本質(zhì)是拆,采用微服務(wù)架構(gòu)目的是通過(guò)拆分實(shí)現(xiàn)業(yè)務(wù)的可擴(kuò)展和易維護(hù)。
SOA架構(gòu)與微服務(wù)架構(gòu)的對(duì)比
架構(gòu)要解決的問(wèn)題不同
SOA架構(gòu)的目標(biāo)是把企業(yè)內(nèi)部的基于不同協(xié)議、數(shù)據(jù)結(jié)構(gòu)的服務(wù)集成起來(lái)。而微服務(wù)架構(gòu)的目的是提高系統(tǒng)的可擴(kuò)展性、降低維護(hù)成本、提高研發(fā)效率。
技術(shù)理念不同
Martin Fowler在描述微服務(wù)之間通訊時(shí)提到過(guò)"Smart endpoints and dumb pipes"(Microservices)。
Applications built from microservices aim to be as decoupled and as cohesive as possible - they own their own domain logic and act more as filters in the classical Unix sense - receiving a request, applying logic as appropriate and producing a response. These are choreographed using simple RESTish protocols rather than complex protocols such as WS-Choreography or BPEL or orchestration by a central tool.
而SOA中的ESB就是一個(gè)典型的Smart pipes,知道協(xié)議類(lèi)型、知道數(shù)據(jù)結(jié)構(gòu)、知道如何路由、知道如何轉(zhuǎn)換。
都需基礎(chǔ)技術(shù)組件支持
在SOA架構(gòu)中,基礎(chǔ)技術(shù)組件主要是ESB。在微服務(wù)架構(gòu)中是服務(wù)發(fā)現(xiàn)、注冊(cè)、監(jiān)控等等(其中一部分是跟ESB有重合的,例如服務(wù)注冊(cè))。
Service Mesh
Service Mesh(服務(wù)網(wǎng)格)是2018年真正火起來(lái)的一個(gè)名詞。上面提到微服務(wù)需要一套基礎(chǔ)技術(shù)組件來(lái)支撐,Service Mesh就是其中一種組件的實(shí)現(xiàn)方式,更廣為人知的可能是Dubbo等框架。先來(lái)看一下istio(Service Mesh的一種實(shí)現(xiàn))給出的架構(gòu)圖。

下面是傳統(tǒng)Dubbo的架構(gòu)圖。

兩者使用方式上的對(duì)比。

Service Mesh對(duì)比Dubbo等傳統(tǒng)RPC框架,主要的變化是:從直接依賴(lài)SDK,變?yōu)閟idecar模式。業(yè)務(wù)與Service Mesh是兩個(gè)獨(dú)立的進(jìn)程,業(yè)務(wù)不感知Service Mesh的存在。當(dāng)產(chǎn)生服務(wù)調(diào)用時(shí)(以restful協(xié)議為例),消費(fèi)端只會(huì)感知到http://xxx.com/api/orders。Service Mesh會(huì)攔截請(qǐng)求并轉(zhuǎn)發(fā)到Proxy,之后Proxy根據(jù)Pilot中獲取的服務(wù)配置將請(qǐng)求轉(zhuǎn)發(fā)到真正的服務(wù)提供端。
《Dubbo在Service Mesh下的思考和方案》一文中詳細(xì)講解Dubbo在Service Mesh化中的一些思考,看完收獲滿滿。
小結(jié)
以上是元旦期間一些關(guān)于SOA架構(gòu)、微服務(wù)架構(gòu)的學(xué)習(xí)與思考,希望能給有需要的朋友一些幫助,也歡迎各位同行一起探討。