微服務(wù)是一種流行的體系結(jié)構(gòu)類(lèi)型,用于構(gòu)建可復(fù)原、高度可縮放、可獨(dú)立部署且能快速演變的應(yīng)用程序。但是,成功的微服務(wù)體系結(jié)構(gòu)需要利用不同的方法來(lái)設(shè)計(jì)和生成應(yīng)用程序。
微服務(wù)體系結(jié)構(gòu)由一系列小型的自治服務(wù)組成。每個(gè)服務(wù)都是自包含服務(wù),并且應(yīng)實(shí)現(xiàn)單個(gè)業(yè)務(wù)功能。
什么是微服務(wù)?
微服務(wù)具有規(guī)模小、獨(dú)立和松散耦合的特點(diǎn)。一個(gè)小規(guī)模的開(kāi)發(fā)人員團(tuán)隊(duì)就能編寫(xiě)和維護(hù)一個(gè)服務(wù)。
每個(gè)服務(wù)都是一個(gè)單獨(dú)的基本代碼,可由小型開(kāi)發(fā)團(tuán)隊(duì)管理。
服務(wù)可獨(dú)立部署。團(tuán)隊(duì)可以更新現(xiàn)有服務(wù),而無(wú)需重新生成和重新部署整個(gè)應(yīng)用程序。
服務(wù)負(fù)責(zé)暫留自己的數(shù)據(jù)或外部狀態(tài)。這一點(diǎn)與傳統(tǒng)模型不同,后者由單獨(dú)的數(shù)據(jù)層處理數(shù)據(jù)暫留。
服務(wù)通過(guò)定義完善的API相互通信。每個(gè)服務(wù)的內(nèi)部實(shí)現(xiàn)細(xì)節(jié)均對(duì)其他服務(wù)隱藏。
服務(wù)無(wú)需共享相同的技術(shù)堆棧、庫(kù)或框架。
除了服務(wù)本身,典型微服務(wù)體系結(jié)構(gòu)中還會(huì)出現(xiàn)其他組件:
管理/業(yè)務(wù)流程.該組件負(fù)責(zé)將服務(wù)放置在節(jié)點(diǎn)上、確定故障,以及跨節(jié)點(diǎn)重新均衡服務(wù)等等。該組件通常是一種現(xiàn)成的技術(shù)(例如Kubernetes),而不是自定義構(gòu)建的內(nèi)容。
API網(wǎng)關(guān)。API網(wǎng)關(guān)是客戶(hù)端的入口點(diǎn)。客戶(hù)端會(huì)調(diào)用API網(wǎng)關(guān),網(wǎng)關(guān)再將調(diào)用轉(zhuǎn)發(fā)到后端上的相應(yīng)服務(wù),而不是由客戶(hù)端直接調(diào)用服務(wù)。
使用API網(wǎng)關(guān)的優(yōu)點(diǎn)如下:
它分離了客戶(hù)端與服務(wù)。無(wú)需更新所有客戶(hù)端,便可對(duì)服務(wù)進(jìn)行版本控制或重構(gòu)。
服務(wù)可以使用對(duì)Web不友好的消息傳遞協(xié)議,比如AMQP。
API網(wǎng)關(guān)可執(zhí)行身份驗(yàn)證、日志記錄、SSL終止和負(fù)載均衡等其他跨領(lǐng)域功能。
優(yōu)點(diǎn)
敏捷性。由于微服務(wù)是獨(dú)立部署的,因此我們可以更輕松地管理bug修復(fù)和功能發(fā)布。無(wú)需重新部署整個(gè)應(yīng)用程序即可更新服務(wù),出現(xiàn)問(wèn)題時(shí)可回滾更新。在很多傳統(tǒng)應(yīng)用程序中,如果在應(yīng)用程序的一個(gè)部件中發(fā)現(xiàn)bug,它會(huì)阻止整個(gè)發(fā)布流程。新功能可能會(huì)被擱置,要等到bug修補(bǔ)程序后才能進(jìn)行集成、測(cè)試和發(fā)布。
小型專(zhuān)屬團(tuán)隊(duì)。微服務(wù)應(yīng)該足夠小,單個(gè)功能團(tuán)隊(duì)就能構(gòu)建、測(cè)試和部署。即使團(tuán)隊(duì)規(guī)模不大,也能大幅提升敏捷性。而由于溝通效率更慢、管理開(kāi)銷(xiāo)更高且敏捷性更低,大型團(tuán)隊(duì)的工作效率往往更低。
小型代碼庫(kù)。在整體式應(yīng)用程序,代碼依賴(lài)項(xiàng)往往會(huì)隨著時(shí)間的推移而變得混雜。因此,要在多個(gè)位置更改代碼才能添加新功能。如果不共享代碼或數(shù)據(jù)存儲(chǔ),則微服務(wù)體系結(jié)構(gòu)可將依賴(lài)項(xiàng)減到最少,使新功能的添加變得更容易。
混合技術(shù)。團(tuán)隊(duì)可以選擇最適合其服務(wù)的技術(shù),并適當(dāng)?shù)厥褂没旌霞夹g(shù)棧。
錯(cuò)誤隔離。單個(gè)微服務(wù)在不可用的情況下不會(huì)中斷整個(gè)應(yīng)用程序,但前提是所有上游微服務(wù)能夠正確處理故障(例如,通過(guò)實(shí)施熔斷機(jī)制)。
可伸縮性。服務(wù)可獨(dú)立擴(kuò)展,這樣你就能橫向擴(kuò)展需要更多資源的子系統(tǒng),而不橫向擴(kuò)展整個(gè)應(yīng)用程序。借助Kubernetes或Service Fabric等業(yè)務(wù)流程協(xié)調(diào)程序,你可將更高密度的服務(wù)打包到一臺(tái)主機(jī)中,從而提高資源的利用效率。
數(shù)據(jù)隔離。執(zhí)行架構(gòu)更新要容易得多,因?yàn)橹粫?huì)影響單個(gè)微服務(wù)。在整體應(yīng)用程序中,更新架構(gòu)可能極具挑戰(zhàn)性,因?yàn)閼?yīng)用程序的不同部分可能都要獲取相同的數(shù)據(jù),對(duì)架構(gòu)進(jìn)行任何更改都會(huì)帶來(lái)風(fēng)險(xiǎn)。
挑戰(zhàn)
微服務(wù)的優(yōu)勢(shì)并非沒(méi)有代價(jià)。下面是在開(kāi)始使用微服務(wù)體系結(jié)構(gòu)之前需要考慮的一些挑戰(zhàn)。
復(fù)雜性。與同等的單一式應(yīng)用程序相比,微服務(wù)應(yīng)用程序具有更多移動(dòng)部件。每個(gè)服務(wù)更簡(jiǎn)單,但整個(gè)系統(tǒng)作為整體來(lái)說(shuō)更復(fù)雜。
開(kāi)發(fā)和測(cè)試。編寫(xiě)依賴(lài)于其他獨(dú)立服務(wù)的小型服務(wù)時(shí)需要的方法與編寫(xiě)傳統(tǒng)的整體式或分層式應(yīng)用程序時(shí)的方法不同?,F(xiàn)有工具并非總是能夠處理服務(wù)依賴(lài)關(guān)系??绶?wù)邊界進(jìn)行重構(gòu)可能很困難。測(cè)試服務(wù)依賴(lài)關(guān)系也有一定難度,尤其是在應(yīng)用程序快速發(fā)展之時(shí)。
缺乏監(jiān)管。用于生成微服務(wù)的分散式方法具有一定優(yōu)勢(shì),但也可能導(dǎo)致許多問(wèn)題。用戶(hù)在生成過(guò)程中可能采用了許多不同的語(yǔ)言和框架,從而使應(yīng)用程序變得難以維護(hù)。這種情況下可以實(shí)施一些項(xiàng)目范圍內(nèi)的標(biāo)準(zhǔn),不過(guò)分限制團(tuán)隊(duì)的靈活性。這尤其適用于日志記錄等跨領(lǐng)域功能。
網(wǎng)絡(luò)擁塞和延遲。使用大量小型的精細(xì)服務(wù)可能會(huì)增加服務(wù)間的通信量。此外,如果服務(wù)依賴(lài)關(guān)系鏈變得太長(zhǎng)(服務(wù)A調(diào)用B,B調(diào)用C...),額外延遲可能會(huì)成為一個(gè)問(wèn)題。用戶(hù)需要精心設(shè)計(jì)API。應(yīng)避免過(guò)于繁瑣的API,考慮使用序列化格式,并找到可以使用異步通信模式的地方。
數(shù)據(jù)完整性。每個(gè)微服務(wù)負(fù)責(zé)自己的數(shù)據(jù)暫留。因此,數(shù)據(jù)一致性可能是個(gè)挑戰(zhàn)。如果可能,請(qǐng)采用最終一致性。
管理。成功使用微服務(wù)需要有成熟的DevOps區(qū)域性??绶?wù)的關(guān)聯(lián)日志記錄可能很難。通常情況下,日志記錄必須為單個(gè)用戶(hù)操作關(guān)聯(lián)多個(gè)服務(wù)調(diào)用。
版本控制。對(duì)某個(gè)服務(wù)的更新不應(yīng)中斷依賴(lài)于它的其他服務(wù)。多個(gè)服務(wù)可在任意給定時(shí)間更新,因此,若不精心設(shè)計(jì),可能會(huì)遇到向后或向前兼容性問(wèn)題。
技能集。微服務(wù)是一種高度分布式系統(tǒng)。請(qǐng)仔細(xì)評(píng)估團(tuán)隊(duì)是否具有成功使用微服務(wù)所需的技能和經(jīng)驗(yàn)。
微服務(wù)體系結(jié)構(gòu)的構(gòu)建流程
此處所列文章介紹了用于設(shè)計(jì)、構(gòu)建和操作微服務(wù)體系結(jié)構(gòu)的結(jié)構(gòu)化方法。
域分析。為了避免設(shè)計(jì)微服務(wù)時(shí)會(huì)出現(xiàn)的某些常見(jiàn)錯(cuò)誤,請(qǐng)使用域分析來(lái)定義微服務(wù)邊界。執(zhí)行以下步驟:
使用域分析為微服務(wù)建模。
使用戰(zhàn)術(shù)性DDD來(lái)設(shè)計(jì)微服務(wù)。
確定微服務(wù)邊界。
設(shè)計(jì)服務(wù)。微服務(wù)需要利用不同的方法來(lái)設(shè)計(jì)和生成應(yīng)用程序。有關(guān)詳細(xì)信息,請(qǐng)參閱設(shè)計(jì)微服務(wù)體系結(jié)構(gòu)。
在生產(chǎn)環(huán)境中操作。由于微服務(wù)體系結(jié)構(gòu)是分布式的,因此你必須對(duì)部署和監(jiān)視提供可靠的操作。
適用于微服務(wù)體系結(jié)構(gòu)的CI/CD
在Kubernetes上為微服務(wù)構(gòu)建CI/CD管道
監(jiān)視在Azure Kubernetes服務(wù)(AKS)上運(yùn)行的微服務(wù)
Azure的微服務(wù)參考體系結(jié)構(gòu)
Azure Kubernetes服務(wù)(AKS)上的微服務(wù)體系結(jié)構(gòu)
Azure Service Fabric上的微服務(wù)體系結(jié)構(gòu)