微服務(wù)體系結(jié)構(gòu)(有時(shí)也稱微服務(wù))是一種架構(gòu)風(fēng)格冯吓,它將應(yīng)用根據(jù)業(yè)務(wù)邏輯拆分成一系列功能不同并且相互協(xié)同合作的一系列服務(wù),這些服務(wù)共同組成一個(gè)完成的應(yīng)用令漂。這使持續(xù)交付/部署一個(gè)大而復(fù)雜的應(yīng)用成為可能膝昆。微服務(wù)具有更好的伸縮性、容錯(cuò)性叠必,實(shí)驗(yàn)新技術(shù)和迭代新的技術(shù)棧也更加方便荚孵。
在使用微服務(wù)時(shí),最關(guān)鍵的體系結(jié)構(gòu)決策是識(shí)別和設(shè)計(jì)服務(wù)纬朝,并確定這些服務(wù)之間如何協(xié)作收叶,相比之下,技術(shù)相關(guān)的問(wèn)題共苛,例如docker判没、k8s等就顯得無(wú)足輕重了。
服務(wù)的關(guān)鍵屬性
一個(gè)服務(wù)具有以下關(guān)鍵屬性:
高可維護(hù)性和高可測(cè)試性-支持快速頻繁地開發(fā)和部署
與其他服務(wù)輕耦合-服務(wù)的ower在大部分時(shí)間應(yīng)該能獨(dú)立工作在自己的服務(wù)上俄讹,不受其他服務(wù)的影響,也不影響其他服務(wù)
可獨(dú)立部署-團(tuán)隊(duì)能夠獨(dú)立部署自己的服務(wù)绕德,無(wú)需和其他團(tuán)隊(duì)進(jìn)行協(xié)調(diào)
小團(tuán)隊(duì)開發(fā)-通過(guò)避免大團(tuán)隊(duì)的高交流成本來(lái)獲得高生產(chǎn)力
服務(wù)的結(jié)構(gòu)
下圖展示了一個(gè)六邊形的服務(wù)結(jié)構(gòu)患膛,服務(wù)的核心是業(yè)務(wù)邏輯,業(yè)務(wù)邏輯被與之相關(guān)聯(lián)的服務(wù)和應(yīng)用所包圍耻蛇。
具體來(lái)看一下每個(gè)結(jié)構(gòu):
服務(wù)具有API
從使用者的角度來(lái)看踪蹬,服務(wù)唯一重要的是它的API。服務(wù)API由操作和發(fā)布的事件組成臣咖。
操作
有兩種類型的操作:命令和查詢跃捣。命令是一種改變數(shù)據(jù)的操作。查詢是檢索數(shù)據(jù)的命令
使用同步協(xié)議(如REST或gRPC)和異步消息傳遞的組合來(lái)調(diào)用服務(wù)操作夺蛇。在為外部客戶端(如移動(dòng)應(yīng)用程序和單頁(yè)面應(yīng)用程序)實(shí)現(xiàn)api時(shí)疚漆,同步協(xié)議(尤其是REST)特別有用。
事件
服務(wù)通常發(fā)布事件。事件通常是DDD域事件娶聘,由聚合在創(chuàng)建闻镶、更新或刪除時(shí)發(fā)出。服務(wù)將事件發(fā)布到消息代理實(shí)現(xiàn)的消息通道丸升。例如铆农,Eventuate Tram框架支持發(fā)布事件到Apache Kafka, ActiveMQ和RabbitMQ。
業(yè)務(wù)邏輯
服務(wù)的核心和存在的原因狡耻。它實(shí)現(xiàn)API的操作和發(fā)布事件墩剖。業(yè)務(wù)邏輯調(diào)用其他服務(wù)的操作并訂閱它們的事件。它將數(shù)據(jù)保存在服務(wù)的數(shù)據(jù)庫(kù)中夷狰。
服務(wù)可能和其他服務(wù)協(xié)作
當(dāng)服務(wù)協(xié)作時(shí)岭皂,是通過(guò)api而不是數(shù)據(jù)庫(kù)。一個(gè)服務(wù)可以調(diào)用另一個(gè)服務(wù)的操作孵淘,服務(wù)還可以訂閱另一個(gè)服務(wù)發(fā)布的事件蒲障。
服務(wù)的數(shù)據(jù)庫(kù)是私有的
一個(gè)服務(wù)通常有一個(gè)數(shù)據(jù)庫(kù),用于存儲(chǔ)它的數(shù)據(jù)瘫证,有時(shí)也存儲(chǔ)從其他服務(wù)復(fù)制的數(shù)據(jù)揉阎,為了確保松耦合,服務(wù)共享數(shù)據(jù)庫(kù)表通常不是一個(gè)好主意背捌。相反毙籽,服務(wù)只能通過(guò)它們的api進(jìn)行通信。