微服務(wù)體系結(jié)構(gòu)將軟件構(gòu)建為協(xié)作服務(wù)的套件 。
微服務(wù)體系結(jié)構(gòu)是在體系結(jié)構(gòu)級別應(yīng)用單一責(zé)任原則的自然結(jié)果 。與傳統(tǒng)的單片體系結(jié)構(gòu)相比,這帶來了許多好處,例如不同組件的獨(dú)立可部署性、語言、平臺和技術(shù)獨(dú)立性、不同的可伸縮性軸以及增加的體系結(jié)構(gòu)靈活性 。
就規(guī)模而言,沒有硬性規(guī)定 。通常,微服務(wù)的數(shù)量級為數(shù)百行,但根據(jù)它們所封裝的職責(zé),也可以達(dá)到數(shù)十行或數(shù)千行 。一個好的,盡管不具體的經(jīng)驗(yàn)法則是盡可能?。?但盡可能大 , 以表示他們擁有的領(lǐng)域概念 。“微服務(wù)應(yīng)該有多大?”有更多細(xì)節(jié) 。
微服務(wù)通常使用HTTP上的REST進(jìn)行集成 。通過這種方式,業(yè)務(wù)域概念被建模為由每個服務(wù)管理的一個或多個資源 。在最成熟的RESTful系統(tǒng)中,資源是使用超媒體控件鏈接的,這樣每個資源的位置對服務(wù)的使用者是不透明的 。參見Richardson成熟度模型了解更多細(xì)節(jié) 。
有時會使用其他集成機(jī)制,如輕量級消息傳遞協(xié)議、發(fā)布-訂閱模型或替代傳輸,如Protobuf或Thrift 。
每個微服務(wù)可能提供,也可能不提供某種形式的用戶界面 。
微服務(wù)通常可以分成類似的模塊

通常 , 微服務(wù)顯示由部分或所有顯示層組成的類似內(nèi)部結(jié)構(gòu) 。
所采用的任何測試策略都應(yīng)該旨在為服務(wù)的每一層以及層與層之間提供覆蓋,同時保持輕量級 。
資源充當(dāng)服務(wù)公開的應(yīng)用程序協(xié)議和消息到表示域的對象之間的映射器 。通常,它們是瘦的 , 負(fù)責(zé)檢查請求的完整性,并根據(jù)業(yè)務(wù)事務(wù)的結(jié)果提供特定于協(xié)議的響應(yīng) 。
幾乎所有的服務(wù)邏輯都駐留在表示業(yè)務(wù)域的域模型中 。在這些對象中 , 服務(wù)跨多個域活動進(jìn)行協(xié)調(diào),而存儲庫作用于域?qū)嶓w的集合,并且通常支持持久性 。
如果一個服務(wù)有另一個服務(wù)作為協(xié)作者,則需要一些邏輯來與外部服務(wù)通信 。網(wǎng)關(guān)用遠(yuǎn)程服務(wù)封裝消息傳遞,對來自域?qū)ο蟮恼埱蠛晚憫?yīng)進(jìn)行編組 。它很可能使用理解底層協(xié)議的客戶機(jī)來處理請求-響應(yīng)周期 。
除非在最瑣碎的情況下,或者當(dāng)服務(wù)充當(dāng)跨其他服務(wù)擁有的資源的聚合器時 , 微服務(wù)將需要能夠在請求之間持久保存來自域的對象 。這通常是通過使用對象關(guān)系映射或更輕量級的數(shù)據(jù)映射器來實(shí)現(xiàn)的,具體取決于持久性需求的復(fù)雜性 。
微服務(wù)通過網(wǎng)絡(luò)相互連接,并利用“外部”數(shù)據(jù)存儲

微服務(wù)通過在每個相關(guān)模塊之間傳遞消息以形成響應(yīng)來處理請求 。一個特定的請求可能需要與服務(wù)、網(wǎng)關(guān)或存儲庫交互 , 因此模塊之間的連接是松散定義的 。
自動化測試應(yīng)該以盡可能精細(xì)的粒度為每一個通信提供覆蓋 。因此,每個測試都提供了一個集中且快速的反饋循環(huán) 。
資源接收到請求,一旦驗(yàn)證 , 就調(diào)用域開始處理請求 。
如果必須協(xié)調(diào)許多模塊來完成業(yè)務(wù)事務(wù),則資源將委托給服務(wù) 。否則,它直接與相關(guān)模塊通信 。
到外部服務(wù)的連接需要特別注意,因?yàn)樗鼈兛缭搅司W(wǎng)絡(luò)邊界 。系統(tǒng)應(yīng)該對遠(yuǎn)程組件的中斷具有彈性 。網(wǎng)關(guān)包含處理此類錯誤情況的邏輯 。
通常,與外部服務(wù)的通信比進(jìn)程通信中的等效通信更粗粒度 , 以防止API的閑聊和延遲 。
類似地,與外部數(shù)據(jù)存儲的通信具有不同的設(shè)計考慮因素 。雖然服務(wù)與數(shù)據(jù)存儲的邏輯耦合比與外部服務(wù)的邏輯耦合更緊密,但數(shù)據(jù)存儲仍然存在于網(wǎng)絡(luò)邊界之上,這會導(dǎo)致延遲和中斷的風(fēng)險 。
網(wǎng)絡(luò)分區(qū)的存在會影響所采用的測試風(fēng)格 。這些模塊的測試可能需要較長的執(zhí)行時間 , 并且可能會因?yàn)閳F(tuán)隊控制之外的原因而失敗 。
多個服務(wù)作為一個系統(tǒng)一起工作,以提供有業(yè)務(wù)價值的功能

通常 , 一個團(tuán)隊將充當(dāng)一個或多個微服務(wù)的監(jiān)護(hù)人 。這些服務(wù)交換消息以處理更大的業(yè)務(wù)請求 。就交換格式而言,JSON目前是最流行的,盡管有許多替代方案,其中XML是最常見的 。
在某些情況下,異步發(fā)布-訂閱通信機(jī)制比同步點(diǎn)對點(diǎn)機(jī)制更適合用例 。作為實(shí)現(xiàn)微服務(wù)之間發(fā)布-訂閱的輕量級方法,Atom聯(lián)合格式正變得越來越流行 。
由于業(yè)務(wù)請求跨越由網(wǎng)絡(luò)分區(qū)分隔的多個組件,因此必須考慮系統(tǒng)中可能的故障模式 。諸如超時、斷路器和隔墻等技術(shù)可以幫助保持整個系統(tǒng)的正常運(yùn)行時間,盡管組件中斷 。
【微服務(wù)是什么】在較大的系統(tǒng)中,通常有多個團(tuán)隊,每個團(tuán)隊負(fù)責(zé)不同的邊界上下文 。
外部服務(wù)的測試關(guān)注點(diǎn)可能與您團(tuán)隊控制下的服務(wù)的測試關(guān)注點(diǎn)不同,因?yàn)閷τ谕獠繄F(tuán)隊服務(wù)的接口和可用性的保證更少 。
