一起玩轉微服務(6)——通信協議如何統一

一起玩轉微服務(6)——通信協議如何統一

一、接口調用

接口調用如果是遠程調用,那麼就構成了簡單的分佈式。最簡單的遠程接口實現方式是web service或rest。當然一個合理的分佈式應用不僅僅是遠程接口調用這麼簡單。還需要有負載均衡、緩存等功能。最簡單實現分佈式的技術是Rest接口,因為Rest接口可以使用現存的各種服務器,比如負載均衡服務器和緩存服務器來實現負載均衡和緩存功能。

二、統一通信協議

關於通信協議,不同的公司有不同的選擇,但是建議同一公司內部使用統一的通信協議,比較典型的有grpc和brpc。

1. gRPC簡介

gRPC是Google發布的基於HTTP 2.0傳輸層協議承載的高性能開源軟件框架,提供了支持多種編程語言的、對網絡設備進行配置和納管的方法。由於是開源框架,通信的雙方可以進行二次開發,所以客戶端和服務器端之間的通信會更加專註於業務層面的內容,減少了對由gRPC框架實現的底層通信的關注。如下圖,DATA部分即業務層面內容,下面所有的信息都由gRPC進行封裝。

 

 

grpc是一個高性能、開源和通用的 RPC 框架,面向移動和 HTTP/2 設計。目前提供 C、Java 和 Go 語言版本,分別是:grpc, grpc-java, grpc-go. 其中 C 版本支持 C, C++, Node.js, Python, Ruby, Objective-C, PHP 和 C# 支持.
grpc基於 HTTP/2 標準設計,帶來諸如雙向流、流控、頭部壓縮、單 TCP 連接上的多復用請求等特。這些特性使得其在移動設備上表現更好,更省電和節省空間佔用。
關於具體gRPC報文的結構,可以參考下圖:

 

 

下面展示一下gRPC的交互過程

 

 

  1. 交換機在開啟gRPC功能后充當gRPC客戶端的角色,採集服務器充當gRPC服務器角色;
  2. 交換機會根據訂閱的事件構建對應數據的格式(GPB/JSON),通過Protocol Buffers進行編寫proto文件,交換機與服務器建立gRPC通道,通過gRPC協議向服務器發送請求消息;
  3. 服務器收到請求消息后,服務器會通過Protocol Buffers解譯proto文件,還原出最先定義好格式的數據結構,進行業務處理;
  4. 數據梳理完后,服務器需要使用Protocol Buffers重編譯應答數據,通過gRPC協議向交換機發送應答消息;
  5. 交換機收到應答消息后,結束本次的gRPC交互。

上圖展示的是gRPC交互過程的具體流程,這也是Telemetry觸發方式其中之一,稱為Dial-out模式。簡單地說,gRPC就是在客戶端和服務器端開啟gRPC功能后建立連接,將設備上配置的訂閱數據推送給服務器端。

2. brpc

與grpc類似,brpc源自百度,目前支撐百度內部大約 75 萬個同時在線的實例。
其實基於以上的幾種選擇都能夠完成高效的開發,團隊內部使用統一的標準,這樣更有利於模塊化和統一標準。
服務間的通信是通過輕量級的web服務,使用同步的REST API進行通信。在實際的項目應用中,一般推薦在查詢的時候使用同步機制,在增刪改使用異步的方式,結合消息隊列來實現數據的操作,以保證最終的數據一致性。
具體可以使用BRPC做如下

  1. 搭建能在一個端口支持多協議的服務, 或訪問各種服務
  2. Server能同步或異步處理請求
  3. Client支持同步、異步、半同步,或使用組合channels簡化複雜的分庫或併發訪問
  4. 通過http界面調試服務, 使用cpu, heap, contention profilers
  5. 獲得更好的延時和吞吐
  6. 把你組織中使用的協議快速地加入brpc,或定製各類組件, 包括命名服務 (dns, zk, etcd), 負載均衡 (rr, random, consistent hashing)

三、rest API

 

 

REST API 應為創建、檢索、更新和刪除操作使用標準 HTTP 動詞,而且應特別注意操作是否冪等。
POST 操作可用於創建資源。POST 操作的明顯特徵是它不是冪等的。舉例而言,如果使用 POST 請求創建資源,而且啟動該請求多次,那麼每次調用后都會創建一個新的唯一資源。
GET 操作必須是冪等的且不會產生意外結果。具體來講,帶有查詢參數的 GET 請求不應用於更改或更新信息(而應使用 POST、PUT 或 PATCH)。
PUT 操作可用於更新資源。PUT 操作通常包含要更新的資源的完整副本,使該操作具有冪等性。
PATCH 操作允許對資源執行部分更新。它們不一定是冪等的,具體取決於如何指定增量並應用到資源上。例如,如果一個 PATCH 操作表明一個值應從 A 改為 B,那麼它就是冪等的。如果它已啟動多次而且值已是 B,則沒有任何效果。對 PATCH 操作的支持仍不一致。例如,Java EE7 中的 JAX-RS 中沒有 @PATCH 註釋。
DELETE 操作用於刪除資源。刪除操作是冪等的,因為資源只能刪除一次。但是,返回代碼不同,因為第一次操作將成功 (200),而後續調用不會找到資源 (204)。

 

四、你們怎麼解決

不同項目組之間使用的語言有可能不同,框架有可能不同,同樣的,通信協議有可能不同,你們怎麼解決的呢?

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※別再煩惱如何寫文案,掌握八大原則!

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※超省錢租車方案

※教你寫出一流的銷售文案?

網頁設計最專業,超強功能平台可客製化