gRPC應用實戰:(一)簡介

CodeFish-xiao發表於2021-08-18

我們將介紹 Go 語言中最流行的 RPC 框架:gRPC,並帶你探索其相對應的技術棧。

首先我們需要對RPC有所瞭解,然後再對他們的傳輸協議進行了解並且建立對應的demo,然後一步步深入並且完成較為完善的搭建體系。

1.1 RPC

1.1.1 什麼是RPC?

RPC 代指遠端過程呼叫(Remote Procedure Call)就是允許程式呼叫另一個地址空間(通常是共享網路的另一臺機器上)的過程或函式,且不需要顯式編碼這個遠端呼叫的細節。

通俗來說就是呼叫其他程式內的方法,並且獲得對應的返回值。

1.1.2 RPC包括什麼?

整個RPC呼叫基本上會包括以下3點:

  1. 通訊協議
  2. 定址
  3. 資料序列化

RPC 框架的目標就是讓遠端服務呼叫更加簡單、透明。一個較為成熟的RPC 框架負責遮蔽底層的傳輸方式(TCP 或者 UDP)、序列化方式(XML/Json/ 二進位制)和通訊細節。服務呼叫者可以像呼叫本地介面一樣呼叫遠端的服務提供者,而不需要關心底層通訊細節和呼叫過程。

1.1.3 業界主流的 RPC 框架

業界主流的 RPC 框架整體上分為三類:

  1. 支援多語言的 RPC 框架,比較成熟的有 Google 的 gRPC、Apache(Facebook)的 Thrift;
  2. 只支援特定語言的 RPC 框架,例如新浪微博的 Motan;
  3. 支援服務治理等服務化特性的分散式服務框架,其底層核心仍然是 RPC 框架, 例如阿里的 Dubbo。

1.2 序列化協議

常見的序列化協議有XML,jSON,Protobuf,一般來說用於RPC呼叫時基本就是json跟Protobuf兩種協議的事情,所以這裡只談這兩種協議:

1.2.1 Protobuf

1.2.1.1 什麼是Protobuf

Protocol Buffers(Protobuf)是一種與語言、平臺無關,可擴充套件的序列化結構化資料的資料描述語言,我們常常稱其為 IDL,常用於通訊協議,資料儲存等等,相較於 JSON、XML,它更小、更快,因此也更受開發人員的青眯。在gRPC中就是使用的Protobuf作為傳輸協議。

1.2.1.2 Protobuf的基本語法

syntax = "proto3";

package helloworld;

service Hello {
    rpc SayHello (HelloRequest) returns (Resp) {}
}

message HelloRequest {
    string name = 1;
}

message HelloResp {
    string message = 1;
}
  1. 第一行(非空的非註釋行)宣告使用 proto3 語法。如果不宣告,將預設使用 proto2 語法。
  2. 定義名為 Hello 的 RPC 服務(Service),中有SayHello的方法,以及有入參HelloRequest,和返回值HelloResp
  3. 定義 HelloRequest、HelloResp 訊息體。

在編寫完.proto 檔案後,我們一般會進行編譯和生成對應語言的 proto 檔案操作,這個時候 Protobuf 的編譯器會根據選擇的語言不同、呼叫的外掛情況,生成相應語言的 Service Interface Code 和 Stubs

1.2.2 Json跟Protobuf對比

Json比較常見就不詳細介紹了,直接兩者進行對比即可:

Json Protobuf
傳輸形式 字串 二進位制
可讀性 不好
解析速度 較慢 較快
約定性 較強 很強

1.3 gRPC

1.3.1 什麼是 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 的呼叫示例如下所示:
image.png

一個Ruby客戶端和安卓客戶端都可以通過gRPC呼叫C++服務端

1.3.2 gRPC 特點

  1. 語言中立,支援多種語言;
  2. 基於 IDL 檔案定義服務,通過 proto3 工具生成指定語言的資料結構、服務端介面以及客戶端 Stub;
  3. 通訊協議基於標準的 HTTP/2 設計,支援雙向流、訊息頭壓縮、單 TCP 的多路複用、服務端推送等特性,這些特性使得 gRPC 在移動端裝置上更加省電和節省網路流量;
  4. 序列化支援 PB(Protocol Buffer)和 JSON,PB 是一種語言無關的高效能序列化框架,基於 HTTP/2 + PB, 保障了 RPC 呼叫的高效能。

1.4 小結

簡單介紹了一下RPC以及序列化協議還有gprc,下次就是開始簡單搭建demo了。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章