微服務(wù)與SOA架構(gòu)
微服務(wù)維基上對(duì)其定義為:一種軟件開(kāi)發(fā)技術(shù)-面向服務(wù)的體系結(jié)構(gòu)(SOA)架構(gòu)樣式的一種變體,它提倡將單一應(yīng)用程序劃分成一組小的服務(wù),服務(wù)之間互相協(xié)調(diào)、互相配合,為用戶(hù)提供最終價(jià)值。每個(gè)服務(wù)運(yùn)行在其獨(dú)立的進(jìn)程中,服務(wù)與服務(wù)間采用輕量級(jí)的通信機(jī)制互相溝通(通常是基于HTTP的RESTfulAPI)。每個(gè)服務(wù)都圍繞著具體業(yè)務(wù)進(jìn)行構(gòu)建,并且能夠獨(dú)立地部署到生產(chǎn)環(huán)境、類(lèi)生產(chǎn)環(huán)境等。另外,應(yīng)盡量避免統(tǒng)一的、集中式的服務(wù)管理機(jī)制,對(duì)具體的一個(gè)服務(wù)而言,應(yīng)根據(jù)上下文,選擇合適的語(yǔ)言、工具對(duì)其進(jìn)行構(gòu)建。微服務(wù)概念的由來(lái)是怎么樣的呢,參考維基百科英文版,簡(jiǎn)單梳理后的微服務(wù)出現(xiàn)的歷史:- 2005年:Dr.PeterRodgers在WebServicesEdge大會(huì)上提出了“Micro-Web-Services”的概念。
- 2011年:一個(gè)軟件架構(gòu)工作組使用了“microservice”一詞來(lái)描述一種架構(gòu)模式。
- 2012年:同樣是這個(gè)架構(gòu)工作組,正式確定用“microservice”來(lái)代表這種架構(gòu)。
- 2012年:ThoughtWorks的JamesLewis針對(duì)微服務(wù)概念在QConSanFrancisco2012發(fā)表了演講。
- 2014年:JamesLewis和MartinFlower合寫(xiě)了關(guān)于微服務(wù)的一篇學(xué)術(shù)性的文章,詳細(xì)闡述了微服務(wù)。
順便說(shuō)一句,這幾個(gè)人都是大名鼎鼎的,名字可能陌生,但是擺出他們的作品,相信多少是有些了解的。MartinFlower是《重構(gòu)》、《UML精粹》的作者;RobertMartin,人稱(chēng)Bob大叔,敏捷專(zhuān)家,《代碼整潔之道》、《架構(gòu)整潔之道》的作者。既然微服務(wù)是SOA架構(gòu)的一種變體,那么,談微服務(wù),SOA就是一個(gè)跨不過(guò)去的一個(gè)話(huà)題。SOASOA的全稱(chēng)是“ServiceOrientedArchitecture”,中文翻譯是“面向服務(wù)架構(gòu)”,1996年,由Gartner公司最早提出SOA概念。它的誕生是有其歷史背景的。- 公司內(nèi)部所有部門(mén)都有自己獨(dú)立的IT系統(tǒng)
- 隨著每個(gè)部門(mén)的業(yè)務(wù)發(fā)展,獨(dú)立的IT系統(tǒng)的復(fù)雜度越來(lái)越高
同時(shí),基于這樣的背景,Gartner公司提出了SOA的概念,并且還給了一個(gè)預(yù)言,它預(yù)言在2008年,SOA會(huì)成為一種最流行的、且占有絕對(duì)優(yōu)勢(shì)的軟件工程實(shí)踐辦法。基于你對(duì)軟件行業(yè)發(fā)展的關(guān)注和理解,Gartner公司關(guān)于SOA的預(yù)言是否靠譜呢?很顯然,Gartner的預(yù)言并不是很準(zhǔn)確,雖然在一段時(shí)間內(nèi)SOA的概念、設(shè)計(jì)思路有占據(jù)過(guò)一段熱點(diǎn)排行,但最終它也將成為架構(gòu)歷史長(zhǎng)河中的一個(gè)匆匆過(guò)客。這也正是驗(yàn)證了那句話(huà):“沒(méi)有最好的架構(gòu),只有最合適的架構(gòu)”SOA架構(gòu)
圖:SOA架構(gòu)示意圖很多時(shí)候,我們認(rèn)為SOA已經(jīng)消失在江湖,實(shí)際上并非如此,許多傳統(tǒng)行業(yè),比如物流、倉(cāng)儲(chǔ)行業(yè)的系統(tǒng)都是采用SOA架構(gòu)來(lái)構(gòu)建的。對(duì)于SOA,從圖中可以看到,它的每一項(xiàng)業(yè)務(wù)功能都是一個(gè)服務(wù),都需要對(duì)外提供服務(wù)的能力,來(lái)完成企業(yè)所需的各項(xiàng)業(yè)務(wù)功能,也就意味著它具有對(duì)外提供開(kāi)放的能力,這些能力無(wú)需定制化就可以實(shí)現(xiàn)。為什么無(wú)需定制化呢,核心就在于ESB。ESB(EnterpriseServiceBus)即,企業(yè)級(jí)服務(wù)總線(xiàn),ESB是SOA架構(gòu)中的核心,起著將企業(yè)中不同異構(gòu)系統(tǒng)的連接在一起的作用。它本身提供了消息路由、協(xié)議轉(zhuǎn)換等等能力。通過(guò)ESB,SOA架構(gòu)實(shí)現(xiàn)了服務(wù)與服務(wù)之間的松耦合,減少了各個(gè)服務(wù)間的依賴(lài)和相互影響。每項(xiàng)服務(wù)只需要關(guān)注自身對(duì)外提供的能力即可,無(wú)需關(guān)注其他服務(wù)是怎么實(shí)現(xiàn)的。看到ESB的功能,是不是覺(jué)得它的功能有點(diǎn)似曾相識(shí)?是的,它就是微服務(wù)所需要的基礎(chǔ)服務(wù)。微服務(wù)架構(gòu)
簡(jiǎn)而言之,微服務(wù)架構(gòu)風(fēng)格,是一種將單個(gè)應(yīng)用程序開(kāi)發(fā)為一組小服務(wù)的方法,每個(gè)小服務(wù)都在自己的進(jìn)程中運(yùn)行并與輕量級(jí)機(jī)制(通常是HTTP資源API)進(jìn)行通信。這些服務(wù)是圍繞業(yè)務(wù)能力構(gòu)建的,并且可以通過(guò)全自動(dòng)部署機(jī)制獨(dú)立部署。這些服務(wù)的集中管理最少,可以用不同的編程語(yǔ)言編寫(xiě)并使用不同的數(shù)據(jù)存儲(chǔ)技術(shù)。圖:微服務(wù)架構(gòu)示意圖
上面一段話(huà)是MartinFowler關(guān)于微服務(wù)架構(gòu)論文中的核心片段,從上述片段中,我們提煉出微服務(wù)架構(gòu)的核心有三點(diǎn):其一是“小服務(wù)”,將應(yīng)用拆分為一組小服務(wù);其二是“在自己的進(jìn)程中運(yùn)行并與輕量級(jí)機(jī)制(通常是HTTP資源API)進(jìn)行通信”,微服務(wù)是由獨(dú)立進(jìn)程且進(jìn)程之間通過(guò)輕量級(jí)機(jī)制進(jìn)行通信;其三是“可以通過(guò)全自動(dòng)部署機(jī)制獨(dú)立部署”,也就是說(shuō)每個(gè)微服務(wù)可以快速獨(dú)立部署。其實(shí)這已經(jīng)非常精確、精準(zhǔn)的描述出了微服務(wù)的基本特征。完全可以作為在微服務(wù)架構(gòu)實(shí)踐中落地的三個(gè)參考依據(jù)與檢驗(yàn)標(biāo)準(zhǔn)。微服務(wù)與SOA對(duì)比
對(duì)比維度微服務(wù)SOA舉例技術(shù)本質(zhì)SmartendpointsanddumbpipesSmartpipesanddumbendpoints
應(yīng)用場(chǎng)景互聯(lián)網(wǎng)行業(yè)傳統(tǒng)行業(yè)或企業(yè)內(nèi)部SOA,企業(yè)OA;微服務(wù),電商平臺(tái)服務(wù)粒度細(xì)較粗
服務(wù)通信標(biāo)準(zhǔn)化,輕量級(jí)重量級(jí)SOA,ESB;微服務(wù),HTTP,RCP服務(wù)交付快速較慢微服務(wù),服務(wù)小容易升級(jí);SOA功能集中,較難升級(jí)
應(yīng)用架構(gòu)的演化
圖:應(yīng)用架構(gòu)的變遷最初的應(yīng)用都是單體架構(gòu),所謂單體架構(gòu)就是將一系列功能全部集中在一個(gè)大的應(yīng)用中,比如傳統(tǒng)行業(yè)一般整個(gè)財(cái)務(wù)就做一個(gè)系統(tǒng),將費(fèi)用管理、賬務(wù)管理、薪資結(jié)算等等都集中在一起,這種架構(gòu)的局限性非常明顯,不適合大規(guī)模項(xiàng)目的建設(shè)。- 當(dāng)項(xiàng)目逐漸變大后,代碼量逐漸增多,會(huì)出現(xiàn)編譯、打包費(fèi)時(shí),嚴(yán)重影響效率。
- 當(dāng)業(yè)務(wù)逐漸增多后,不同的業(yè)務(wù)創(chuàng)建不同的項(xiàng)目,不同的項(xiàng)目的功能模塊可能會(huì)出現(xiàn)重復(fù)建設(shè)的情況,造成浪費(fèi)。
隨著軟件架構(gòu)的發(fā)展,出現(xiàn)SOA架構(gòu),SOA將單體架構(gòu)做了拆分,拆分成粗粒度的服務(wù),同時(shí)將部分公共功能獨(dú)立出來(lái)形成ESB,它的優(yōu)點(diǎn)是- 把模塊拆分,使用接口通信,降低模塊之間的耦合度
- 把項(xiàng)目拆分成若干個(gè)子項(xiàng)目,不同的團(tuán)隊(duì)負(fù)責(zé)不同的子項(xiàng)目
- 增加功能時(shí)只需要在增加一個(gè)子項(xiàng)目,調(diào)用其它系統(tǒng)的接口就可以
- 可以靈活的進(jìn)行分布式部署
但是由于SOA架構(gòu)需要一個(gè)統(tǒng)一的通信交互(ESB),導(dǎo)致了接口開(kāi)發(fā)增加工作量。更進(jìn)一步發(fā)展,微服務(wù)架構(gòu)出現(xiàn),對(duì)服務(wù)進(jìn)一步的拆分,拆分成更細(xì)粒度的服務(wù);進(jìn)一步提供了架構(gòu)選擇的多樣性,微服務(wù)架構(gòu)主要優(yōu)點(diǎn)是- 開(kāi)發(fā)簡(jiǎn)單,每個(gè)服務(wù)都盡可能的小。獨(dú)立提供更小的業(yè)務(wù)能力。
- 技術(shù)棧靈活,不需要在乎使用什么語(yǔ)言、數(shù)據(jù)存儲(chǔ)方式等
- 服務(wù)獨(dú)立無(wú)依賴(lài),每個(gè)服務(wù)都能獨(dú)立部署、獨(dú)立運(yùn)行
- 獨(dú)立按需擴(kuò)展,更少的依賴(lài),更高的擴(kuò)展性
- 高可用性,獨(dú)立模塊,即使一個(gè)進(jìn)程宕機(jī)也不影響整體服務(wù)能力。
正是因?yàn)槲⒎?wù)將服務(wù)拆分的更小,它同樣也帶來(lái)了一些挑戰(zhàn),比如多服務(wù)運(yùn)維難度增大、服務(wù)通信成本變高、數(shù)據(jù)一致性保持更難、性能監(jiān)控要求提升等等。所以業(yè)務(wù)在選擇架構(gòu)的時(shí)候,應(yīng)從多方面考量選擇更合適的架構(gòu)。順便說(shuō)一句,這里的架構(gòu)演化是指整個(gè)架構(gòu)的發(fā)展歷史,并不是說(shuō)你的服務(wù)就一定要經(jīng)過(guò)這個(gè)演化過(guò)程,只是更多的架構(gòu)模式提供更多的選擇。我們?cè)谧黾軜?gòu)演進(jìn)的時(shí)候,更多的是將單體應(yīng)用演進(jìn)到SOA架構(gòu)或者演進(jìn)到微服務(wù)架構(gòu)。