面試官靈魂三問:什麼是SOA?什麼是微服務?SOA和微服務有什麼區別?

2021-12-14 10:00:06

SOA

SOA(Service-Oriented Architecture,面向服務的架構)是一種高層級的架構設計理念,可通過在網路上使用基於通用通訊語言的服務介面,讓軟體元件可重複使用。

那麼什麼是服務呢?

所有業務功能都可以定義為一項服務,服務就意味著要對外提供開放的能力,當其他系統需要使用這項功能時,無須客製化化開發。

服務可大可小,可簡單也可複雜。例如,商品管理可以是一項服務,包括商品基本資訊管理、供應商管理、入庫管理等功能;而商品基本資訊管理也可以作為一項獨立的服務,供應商管理也可以作為一項獨立的服務。到底是劃分為粗粒度的服務,還是劃分為細粒度的服務,需要根據企業的實際情況進行判斷。

SOA 整合了獨立部署和維護的服務,並允許它們相互通訊和協同工作,以構建一個跨不同系統的軟體應用。

那麼它們是如何通訊和協同工作的呢?

ESB(Enterprise Service Bus,企業服務匯流排)把企業中各個不同的服務連線在一起。就像計算機匯流排一樣,把計算機的各個不同的裝置連線在一起。

因為不同的服務是使用不同的技術實現的,各個獨立的服務是異構的,如果沒有統一的標準,則各個異構系統對外提供的介面是各式各樣的。SOA 使用 ESB 來遮蔽異構系統對外提供各種不同的介面方式,以此來達到服務間高效的互聯互通。ESB通過使用標準網路協定(如 SOAP、XML、JSON、MQ )來開放服務以傳送請求或存取資料,實現與各種系統間的協定轉換、資料轉換、透明的動態路由等功能,消除了開發人員必須從頭開始進行整合的困擾。

採用 SOA 架構後,各個服務是相互獨立執行的,甚至都不清楚某個服務到底有多少對其他服務的依賴,減少各個服務間的依賴和互相影響,做到了鬆耦合。
如果做不到鬆耦合,某個服務一升級,依賴它的其他服務全部故障,這樣肯定是無法滿足業務需求的。

微服務

微服務(Microservices)是一種軟體架構風格,它是以專注於單一責任與功能的小型功能區塊 (Small Building Blocks) 為基礎,利用模組化的方式組合出複雜的大型應用程式,各功能區塊使用與語言無關 (Language-Independent/Language agnostic)的API集相互通訊。

微服務的起源是由 Peter Rodgers 博士於 2005 年度雲端計算博覽會提出的微 Web 服務(Micro-Web-Service)開始,Juval Löwy 則是與他有類似的前導想法,將類別變成細粒服務(granular services),以作為微軟下一階段的軟體架構,其核心想法是讓服務是由類似 Unix 管道的存取方式使用,而且複雜的服務背後是使用簡單 URI 來開放介面,任何服務,任何細粒都能被開放(exposed)。這個設計在 HP 的實驗室被實現,具有改變複雜軟體系統的強大力量。

2014年,Martin Fowler 與 James Lewis 共同提出了微服務的概念,定義了微服務是由以單一應用程式構成的小服務,自己擁有自己的程序與輕量化處理,服務依業務功能設計,以全自動的方式部署,與其他服務使用HTTP API通訊。同時服務會使用最小的規模的集中管理 (例如 Docker) 能力,服務可以用不同的程式語言與資料庫等元件實現。

SOA與微服務的對比

服務粒度

SOA 的服務粒度要粗一些,而微服務的服務粒度要細一些。例如,對一個電商企業來說,商品管理系統是一個 SOA 架構中的服務;而如果採用微服務架構,則商品管理系統會被拆分為更多的服務,比如商品基本資訊管理、供應商管理、入庫管理等更多服務。

服務通訊

SOA 採用了 ESB 作為服務間通訊的關鍵元件,負責服務定義、服務路由、訊息轉換、訊息傳遞,一般情況下都是重量級的實現。微服務則使用統一的協定和格式,例如:HTTP RESTful 協定、TCP RPC 協定,不需要 ESB 這樣的重量級實現。

服務交付

SOA 對服務的交付沒有特殊要求,因為 SOA 更多考慮的是相容已有的系統;微服務的架構理念則要求快速交付,相應地要求採取自動化測試、持續整合、自動化部署、自動化運維等的最佳實踐。

應用場景

SOA 更加適合於龐大、複雜、異構的企業級系統。這類系統的典型特徵就是很多系統已經發展多年,各個服務具有異構性,比如:採用不同的企業級技術、有的是內部開發的、有的是外部購買的,無法完全推倒重來或者進行大規模的優化和重構。因為成本和影響太大,只能採用相容的方式進行處理,而承擔相容任務的就是 ESB。

微服務更加適合於快速、輕量級、基於 Web 的網際網路系統,這類系統業務變化快,需要快速嘗試、快速交付;同時基本都是基於 Web,雖然開發技術可能差異很大(例如,Java、.NET、PHP 等),但對外介面基本都是提供 HTTP RESTful 風格的介面,無須考慮在介面層進行類似 SOA 的 ESB 那樣的處理。

還有一些不同,為了方便理解記憶,彙總成如下表格:

SOA微服務
服務粒度粗粒度細粒度
業務劃分方式水平多層縱向業務劃分
部署方式整體部署獨立部署
通訊方式使用重量級通訊方式,ESB充當服務之間通訊的角色使用輕量級通訊方式,如HTTP RESTful
服務交付交付慢交付塊
應用場景龐大、複雜、異構的企業級系統快速、輕量級、基於 Web 的網際網路系統