1. 程式人生 > 實用技巧 >Go RPCX學習:快速入門

Go RPCX學習:快速入門

RPCX的產生

rpcx是一個類似阿里巴巴Dubbo和微博Motan的分散式的RPC服務框架,基於Golang net/rpc實現。

談起分散式的RPC框架,比較出名的是阿里巴巴的dubbo,包括由噹噹網維護的dubbox。
不知道dubbo在阿里的內部競爭中敗給了HSF,還是阿里有意將其閉源了,官方的程式碼使用的spring還停留在2.5.6.SEC03的版本,dubbox的spring也只升級到3.2.9.RELEASE。
不管怎樣,dubbo還是在電商企業得到廣泛的應用,京東也有部分在使用dubbo開發。

DUBBO是一個分散式服務框架,致力於提供高效能和透明化的RPC遠端服務呼叫方案,是阿里巴巴SOA服務化治理方案的核心框架,每天為2,000+個服務提供3,000,000,000+次訪問量支援,並被廣泛應用於阿里巴巴集團的各成員站點。微博的RPC框架 Motan 也正式開源了,如張雷所說:

2013 年微博 RPC 框架 Motan 在前輩大師們(福林、fishermen、小麥、王喆等)的精心設計和辛勤工作中誕生,向各位大師們致敬,也得到了微博各個技術團隊的鼎力支援及不斷完善,如今 Motan 在微博平臺中已經廣泛應用,每天為數百個服務完成近千億次的呼叫。

這兩個個優秀的框架都是使用Java開發的,國外的網際網路企業也有非常出名的的RPC框架如thrift、finagle。

本專案rpcx的目標就是實現一個Go生態圈的Dubbo,為Go生態圈提供一個分散式的、多外掛的、帶有服務治理功能的產品級的RPC框架。

Go生態圈已經有一些RPC庫,如官方的net/rpc、grpc-go、gorilla-rpc等,為什麼還要開發rpcx

呢?

原因在於儘管這些框架都是為Go實現的RPC庫,但是它們的功能比較單一,只是實現了點對點(End-to-End)的通訊框架。缺乏服務治理的功能,比如服務註冊和發現、負載均衡、容災、服務監控等功能。因此我基於Go net/rpc框架實現了一個類似Dubbo的分散式框架。

和rpcx比較類似的Go RPC框架是go-micro,但是rpcx提供了更豐富的功能,基於TCP的通訊協議效能更好。

那麼rpcx 和 grpc 出來的定位是什麼? rpcx支援protobuf3嗎?

grpc 不會在企業大規模使用,或者說不會直接在企業中規模很大的服務中的推廣。因為本身它的服務治理很弱。rpcx支援protobuf3, 而且預設提供了protobuf3的編碼器實現。

RPC是什麼

遠端過程呼叫(英語:Remote Procedure Call,縮寫為 RPC)是一個計算機通訊協議。該協議允許運行於一臺計算機的程式呼叫另一臺計算機的子程式,而程式設計師無需額外地為這個互動作用程式設計。如果涉及的軟體採用面向物件程式設計,那麼遠端過程呼叫亦可稱作遠端呼叫或遠端方法呼叫,例:Java RMI。簡單地說就是能使應用像呼叫本地方法一樣的呼叫遠端的過程或服務。很顯然,這是一種client-server的互動形式,呼叫者(caller)是client,執行者(executor)是server。典型的實現方式就是request–response通訊機制。

RPC 是程序之間的通訊方式(inter-process communication, IPC), 不同的程序有不同的地址空間。
如果client和server在同一臺機器上,儘管實體地址空間是相同的,但是虛擬地址空間不同。
如果它們在不同的主機上,實體地址空間也不同。

RPC的實現的技術各不相同,也不一定相容。

一個正常的RPC過程可以分成下面幾步:

  1. client呼叫client stub,這是一次本地過程呼叫
  2. client stub將引數打包成一個訊息,然後傳送這個訊息。打包過程也叫做 marshalling
  3. client所在的系統將訊息傳送給server
  4. server的的系統將收到的包傳給server stub
  5. server stub解包得到引數。 解包也被稱作 unmarshalling
  6. 最後server stub呼叫服務過程. 返回結果按照相反的步驟傳給client

RPC只是描繪了 Client 與 Server 之間的點對點呼叫流程,包括 stub、通訊、RPC 訊息解析等部分,在實際應用中,還需要考慮服務的高可用、負載均衡等問題,所以產品級的 RPC 框架除了點對點的 RPC 協議的具體實現外,還應包括服務的發現與登出、提供服務的多臺 Server 的負載均衡、服務的高可用等更多的功能。目前的 RPC 框架大致有兩種不同的側重方向,一種偏重於服務治理,另一種偏重於跨語言呼叫。

服務治理型的 RPC 框架有 Dubbo、DubboX、Motan 等,這類的 RPC 框架的特點是功能豐富,提供高效能的遠端呼叫以及服務發現及治理功能,適用於大型服務的微服務化拆分以及管理,對於特定語言(Java)的專案可以十分友好的透明化接入。但缺點是語言耦合度較高,跨語言支援難度較大。

跨語言呼叫型的 RPC 框架有 Thrift、gRPC、Hessian、Hprose 等,這一類的 RPC 框架重點關注於服務的跨語言呼叫,能夠支援大部分的語言進行語言無關的呼叫,非常適合於為不同語言提供通用遠端服務的場景。但這類框架沒有服務發現相關機制,實際使用時一般需要代理層進行請求轉發和負載均衡策略控制。

本專案 rpcx 屬於服務治理型別,是一個基於 Go 開發的高效能的輕量級 RPC 框架,Motan 提供了實用的服務治理功能和基於外掛的擴充套件能力。

RPCX的特點

rpcx使用Go實現,適合使用Go語言實現RPC的功能。

  • 基於net/rpc,可以將net/rpc實現的RPC專案輕鬆的轉換為分散式的RPC
  • 外掛式設計,可以配置所需的外掛,比如服務發現、日誌、統計分析等
  • 基於TCP長連線,只需很小的額外的訊息頭,當然也支援Http
  • 支援多種編解碼協議,如Gob、Json、MessagePack、gencode、ProtoBuf等
  • 服務發現:服務釋出、訂閱、通知等,支援多種發現方式如ZooKeeper、Etcd等
  • 高可用策略:失敗重試(Failover)、快速失敗(Failfast)
  • 負載均衡:支援隨機請求、輪詢、低併發優先、一致性 Hash等
  • 規模可擴充套件,可以根據效能的需求增減伺服器
  • 雙向呼叫:支援客戶端與服務端雙向通訊
  • 跨語言呼叫:支援Java、Python、C#、Node.js、Php、C\C++、Rust等等來呼叫 rpcx 服務,通過Gateway和Agent
  • 安全:支援白名單,限流、訊息大小、身份認證等
  • 呼叫機制:支援超時與熔斷機制
  • 其他:呼叫統計、訪問日誌、ui管理介面等
  • 支援壓縮
  • 支援擴充套件資訊傳遞(元資料)

rpcx目標是輕量級的,小而簡單,但是期望所有的功能都可以通過外掛的方式搭積木的方式完成。

RPCX架構

rpcx中有服務提供者 RPC Server,服務呼叫者 RPC Client 和服務註冊中心 Registry 三個角色。

  • Server 向 Registry 註冊服務,並向註冊中心傳送心跳彙報狀態(基於不同的registry有不同的實現)。
  • Client 需要向註冊中心查詢 RPC 服務者列表,Client 根據 Registry 返回的服務者列表,選取其中一個 Sever 進行 RPC 呼叫。
  • 當 Server 發生宕機時,Registry 會監測到服務者不可用(zookeeper session機制或者手工心跳),Client 感知後會對本地的服務列表作相應調整。client可能被動感知(zookeeper)或者主動定時拉取。
  • 可選地,Server可以定期向Registry彙報呼叫統計資訊,Client可以根據呼叫次數選擇壓力最小的Server

當前rpcx支援zookeeper, etcd、Consul等註冊中心。

rpcx基於Go net/rpc的底層實現, Client和Server之間通訊是通過TCP進行通訊的,它們之間通過Client傳送Request,Server返回Response實現。
Request和Response訊息的格式都是Header+Body的格式。Header和Body具體的格式根據編碼方式的不同而不同,可以是二進位制,也可以是結構化資料如JSON。

grpc中文文件:https://books.studygolang.com/go-rpc-programming-guide/

refer:

https://blog.csdn.net/RA681t58CJxsgCkJ31/article/details/82455716

https://www.tuicool.com/articles/vYB3euv