掃二維碼與項目經(jīng)理溝通
我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流
今天我們來學(xué)習(xí)一下微服務(wù)的通信設(shè)計模式,通信是保證服務(wù)請求核心要素,選擇合適的一個通信協(xié)議對系統(tǒng)來說可以達(dá)到事半功倍。

創(chuàng)新互聯(lián)專注于合山網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗。 熱誠為您提供合山營銷型網(wǎng)站建設(shè),合山網(wǎng)站制作、合山網(wǎng)頁設(shè)計、合山網(wǎng)站官網(wǎng)定制、重慶小程序開發(fā)公司服務(wù),打造合山網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供合山網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。
目前各種微服務(wù)通信社區(qū)上,很多種支持RPC模式。有同步請求/響應(yīng)通信機制,例如基于 HTTP 的 REST 或 GraphQL,或 gRPC。或者可以使用異步的、基于消息的通信機制,例如 AMQP(高級消息隊列協(xié)議)或 STOMP(簡單/流式面向文本的消息傳遞協(xié)議)。此外,還有許多不同的消息格式。這些格式可以是可讀的,例如 JSON 和 XML。他們還可以使用更高效的二進制格式,例如 Avro 或 Protobuf。
在選擇 RPC 機制之前,考慮一下服務(wù)與其客戶端之間的交互方式是很有必要的。客戶服務(wù)交互有兩個維度。
RPC 本質(zhì)上是一種消息交換。其中一個重要的設(shè)計是消息包含數(shù)據(jù)的格式。消息格式的選擇會影響 RPC 的效率、API 的可用性及其可演化性。
消息格式有兩種主要類型:文本和二進制。
JSON 和 XML 是最流行的基于文本的格式。
Thrift、Protocol Buffers (Protobuf) 和 Avro 是最流行的二進制格式。
當(dāng)客戶端請求服務(wù)時,服務(wù)會處理請求并發(fā)回響應(yīng)。雖然一些客戶端可能會在等待響應(yīng)時阻塞,但其他客戶端可能具有反應(yīng)性、非阻塞架構(gòu)。
代理接口通常封裝底層通信協(xié)議。
有多種通信協(xié)議可供選擇,例如 REST、gRPC 和 GraphQL 等。
REST 基于資源的概念,它表示單個業(yè)務(wù)對象。HTTP(超文本傳輸協(xié)議)用于實現(xiàn) REST。REST 使用 HTTP 來操作由 URL 引用的資源。
API 必須使用 IDL(接口定義語言)定義。最流行的 REST IDL 之一是開放 API 規(guī)范,它是從Swagger開源項目演變而來的。
由于 REST API 通?;跇I(yè)務(wù)對象,因此在一個請求中請求多個相關(guān)對象是設(shè)計 REST API 時的常見難題之一??蛻舳吮仨氈辽賹ο嚓P(guān)對象發(fā)出多次請求。
使用查詢參數(shù),API 可以使客戶端在獲取資源時檢索相關(guān)資源。由于這種方法缺乏可擴展性,GraphQL和Netflix Falcor等替代 API 技術(shù)變得越來越受歡迎。
另一個常見的 REST API 設(shè)計問題是將要對業(yè)務(wù)對象執(zhí)行的操作映射到 HTTP 請求上。REST API 使用 PUT 來更新,但是有多種方法可以操作訂單,包括取消訂單、修改訂單等。一種解決方案是定義一個子資源,如 /orders/{orderId}/cancel 或 /orders/{orderId}/revise 以更新資源的特定方面或在 URL 查詢參數(shù)中指定動詞。但這些解決方案并不是真正的 RESTful。
由于這個問題,REST 的替代品(例如gRPC)越來越受歡迎。
由于 HTTP 僅提供一組有限的請求方式,因此設(shè)計支持多個更新操作的 REST API 可能具有挑戰(zhàn)性。
谷歌推出的跨語言客戶端和服務(wù)器的框架 gRPC 可以解決這個問題。使用基于協(xié)議緩沖區(qū)的 IDL 定義 gRPC API,這是 Google 用于序列化結(jié)構(gòu)化數(shù)據(jù)的語言設(shè)計機制。是一種同步通信機制。使用 HTTP/2,客戶端和服務(wù)器以協(xié)議緩沖區(qū)格式交換二進制消息。
GraphQL 解決了使用單個請求獲取多個資源的問題。GraphQL 主要用于從客戶端應(yīng)用程序查詢數(shù)據(jù)庫。在后端,GraphQL 向 API 指定如何將數(shù)據(jù)呈現(xiàn)給客戶端。GraphQL 重新定義了開發(fā)人員使用 API 的方式,提供更大的靈活性和更快的上線速度;改進了客戶端-服務(wù)器交互,使前者能夠進行精確的數(shù)據(jù)請求,并只獲得他們需要的數(shù)據(jù)。
GraphQL 服務(wù)器為客戶端提供模式:可以請求的數(shù)據(jù)模型。
使用消息傳遞時,服務(wù)會異步交換消息?;谙⒌膽?yīng)用程序通常使用像 RabbitMQ 這樣的消息代理,充當(dāng)服務(wù)之間的中介。服務(wù)客戶端通過向服務(wù)發(fā)送消息來向服務(wù)發(fā)出請求。如果期望響應(yīng),服務(wù)實例將向客戶端發(fā)送單獨的消息。由于通信是異步的,客戶端不會等待響應(yīng)。相反,客戶端是假設(shè)不會立即收到響應(yīng)的。
異步消息傳遞使實現(xiàn)單向通知變得容易。通常,客戶端向服務(wù)擁有的點對點通道發(fā)送消息。服務(wù)訂閱頻道處理消息。沒有響應(yīng)被發(fā)回。
發(fā)布/訂閱交互樣式內(nèi)置于消息傳遞中??蛻舳藢⑾l(fā)布到由多個訂閱者讀取的發(fā)布-訂閱通道。
結(jié)合了發(fā)布/訂閱和請求/響應(yīng)的元素,形成了更高層次的交互風(fēng)格??蛻舳藢⒅付ɑ貜?fù)通道頭的消息發(fā)布到發(fā)布-訂閱通道。消費者將包含相關(guān) id 的回復(fù)消息寫入回復(fù)通道??蛻舳死孟嚓P(guān) id 將回復(fù)消息與收集響應(yīng)的請求進行匹配。

我們在微信上24小時期待你的聲音
解答本文疑問/技術(shù)咨詢/運營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流