內(nèi)部和外部溝通
正如Lagom設(shè)計(jì)理念中所討論的,服務(wù)應(yīng)該是隔離的和自治的。這樣的服務(wù)通過在網(wǎng)絡(luò)上發(fā)送消息來相互通信(服務(wù)間)。為了獲得性能和彈性,通常會在同一節(jié)點(diǎn)上運(yùn)行同一服務(wù)的多個實(shí)例,并且此類服務(wù)內(nèi)通信也將通過網(wǎng)絡(luò)進(jìn)行。此外,第三方和/或舊式系統(tǒng)也可能會消耗或?yàn)槟奈⒎?wù)系統(tǒng)提供信息。
以下主題更詳細(xì)地討論了這些通信路徑:
微服務(wù)系統(tǒng)內(nèi)的通信
盡管原則上相似,但是服務(wù)間和服務(wù)內(nèi)通信具有非常不同的需求,并且Lagom提供了多種實(shí)現(xiàn)選項(xiàng)。服務(wù)間通信必須使用松耦合的協(xié)議和消息格式來保持隔離和自治。協(xié)調(diào)不同服務(wù)之間的變更可能既困難又昂貴。您可以利用以下優(yōu)勢在系統(tǒng)中實(shí)現(xiàn)此目的:
服務(wù)調(diào)用(同步或異步(流))允許服務(wù)使用已發(fā)布的API和標(biāo)準(zhǔn)協(xié)議(HTTP和WebSockets)相互通信。
將消息發(fā)布到代理(例如Apache Kafka)會進(jìn)一步使通信脫鉤。Lagom的Message Broker API提供了至少一次的語義。如果新實(shí)例開始發(fā)布信息,則其消息將添加到先前發(fā)出的事件中。如果新實(shí)例訂閱了主題,則它們將接收過去,現(xiàn)在和將來的所有事件(只要已訂閱)。
單個服務(wù)(統(tǒng)稱為群集)的節(jié)點(diǎn)需要較少的去耦。它們共享相同的代碼,并且由一個團(tuán)隊(duì)或個人作為一個集合一起進(jìn)行管理。因此,服務(wù)內(nèi)通信可以利用開銷較小,性能更好的機(jī)制。例如:
許多Lagom組件在內(nèi)部使用Akka遠(yuǎn)程處理,您可以在服務(wù)中直接使用它。
-
分布式發(fā)布-訂閱可用于節(jié)點(diǎn)之間的低延遲,最多一次消息傳遞。限制包括:
網(wǎng)絡(luò)中斷可能導(dǎo)致消息丟失。
當(dāng)新實(shí)例啟動,加入集群并進(jìn)行預(yù)訂時,它將不會接收在預(yù)訂之前發(fā)送的消息。
數(shù)據(jù)庫和其他持久性存儲可以看作是服務(wù)節(jié)點(diǎn)通信的另一種方式。對于使用持久實(shí)體的微服務(wù),Lagom鼓勵事件流式傳輸,它還利用異步通信的優(yōu)勢并通過事件日志提供保證。
該圖說明了分布在三個服務(wù)器上的Lagom系統(tǒng)中服務(wù)間和服務(wù)內(nèi)通信中的每種類型。在該示例中,訂購服務(wù)發(fā)布到一個或多個Kafka主題,而用戶服務(wù)訂閱以消費(fèi)信息。用戶服務(wù)使用Akka遠(yuǎn)程處理與其他用戶服務(wù)實(shí)例(集群成員)進(jìn)行通信。運(yùn)送服務(wù)和用戶服務(wù)通過在服務(wù)呼叫中流式傳輸信息來交換信息。

與微服務(wù)系統(tǒng)外部的各方進(jìn)行通信
Lagom提倡使用異步通信,而不必在必要時阻止使用同步通信。第三方可以從發(fā)布到Broker API的Lagom服務(wù)異步獲取數(shù)據(jù),并享有至少一次保證。Lagom服務(wù)還公開了一個API,供第三方同步交換數(shù)據(jù)。通常將其映射到HTTP。Lagom服務(wù)API還通過websocket支持將數(shù)據(jù)流傳輸?shù)酵獠靠蛻舳?。有關(guān)更多信息,請參見ServiceDescriptors。
與外界的交互可能意味著通過互聯(lián)網(wǎng)使用服務(wù)的客戶,例如瀏覽器,移動應(yīng)用或物聯(lián)網(wǎng)設(shè)備。在使用標(biāo)準(zhǔn)HTTP或WebSocket時,通常此類客戶端不會直接與單個服務(wù)進(jìn)行通信。通常,網(wǎng)絡(luò)邊界充當(dāng)外圍,而控制良好的通信點(diǎn)充當(dāng)外部世界與內(nèi)部世界之間的中介。在Lagom中,此通信點(diǎn)是服務(wù)網(wǎng)關(guān)。將您的微服務(wù)系統(tǒng)構(gòu)想成中世紀(jì)的城鎮(zhèn),四周環(huán)繞一堵墻,一扇門是進(jìn)出的唯一途徑。圍墻內(nèi)部的通信是免費(fèi)和直接的,但與外部世界的通信必須通過服務(wù)網(wǎng)關(guān)進(jìn)行,如下圖所示。
