1. 程式人生 > >【ASP.NET Core學習】遠端過程呼叫 - gRPC使用

【ASP.NET Core學習】遠端過程呼叫 - gRPC使用

 本文介紹在gRPC使用,將從下面幾個方面介紹

  1. 什麼是RPC
  2. 什麼時候需要RPC
  3. 如何使用gRPC

什麼是RPC

RPC是Remote Procedure Call簡稱,翻譯過來是遠端過程呼叫。它是一個程序間的通訊技術,基於Client-Server模式,讓程式像呼叫本地方法一樣使用,而無需去關係它細節如何實現。

上面是我的理解,怕理解有錯或者表達不準確,下面引用維基百科

維基百科 a remote procedure call (RPC) is when a computer program causes a procedure (subroutine) to execute in a different address space (commonly on another computer on a shared network), which is coded as if it were a normal (local) procedure call, without the programmer explicitly coding the details for the remote interaction

網上找到一個圖,比較形象描述RPC呼叫過程

 

什麼時候需要RPC

RPC是解決程序間通訊(可以是同一個伺服器,也可以是不同伺服器的程序間,但是通常是內網的不同伺服器之間程序通訊)。 

解決程序間通訊,Web Api也是可以解決,為什麼還需要RPC?我認為可以從下面幾點

1. Web Api是基於HTTP,RPC可以是HTTP,也可以是TCP,甚至基於Socket,RPC框架通常都是隱藏通訊細節,讓我們無感知使用

2. Web Api 通常基於JSON格式,XML格式,這種格式易讀性強,但是隨之帶來就是傳輸過程需要把資料的元資料也帶進去傳輸

3. Web Api更多應用場景是提供方定義好介面,由客戶端按需呼叫,RPC通常需要呼叫方和提供方溝通一起定義介面

所以PRC更多是使用以下場景

  1. 對通訊效能要求較高
  2. 微服務
  3. 點到點通訊

gRPC使用

 gRPC是Google開源的高效能RPC框架,有以下幾個特點

  1. 現代高效能輕量級 RPC 框架。
  2. 協定優先 API 開發,預設使用protobuf,允許與語言無關的實現。(這裡涉及兩點,1.面向介面開發,依賴抽象而不是具體,2. 可以不同語言實現協作)

  3. 使用 Protobuf 二進位制序列化減少對網路的使用。(減少網路傳輸)

  4. 可用於多種語言的工具,以生成強型別伺服器和客戶端。

  5. 支援客戶端、伺服器和雙向流式處理呼叫。

下面開始介紹如何在Net Core上使用gRPC

 

一、安裝dotnet-gRPC工具(用於引用protobuf檔案,生成客戶端/服務端程式碼)

dotnet tool install dotnet-grpc -g

二、新建一個protobuf檔案

syntax = "proto3";

option csharp_namespace = "gRPC.Services";

package sms;

// The greeting service definition.
service SmsSender {
  // Sends a greeting
  rpc SendSms (SmsRequest) returns (SmsResponse);
}

// The request message containing the user's name.
message SmsRequest {
  string tel = 1;
  string content = 2;
}

// The response message containing the greetings.
message SmsResponse {
  int32 code = 1;
  string message = 2;
}

三、新建一個服務端

1. 新建一個gRPC工程

dotnet new grpc -n gRPC.Services

2. 引入步驟二生成的protobuf檔案(可以使用萬用字元引入多個protobuf檔案)

dotnet-grpc add-file ..\gRPC.Protos\*.proto -s Serve

3. 新建服務類

public class SmsService : SmsSender.SmsSenderBase
{
    private readonly ILogger<SmsService> _logger;
    public SmsService(ILogger<SmsService> logger)
    {
        _logger = logger;
    }

    public override Task<SmsResponse> SendSms(SmsRequest request, ServerCallContext context)
    {
        return Task.FromResult(new SmsResponse
        {
            Code = 1,
            Message = "傳送成功"
        });
    }
}
SmsSender 是生成工具生成的服務端程式碼

4. 配置grpc服務類終結點

app.UseEndpoints(endpoints =>
{
    endpoints.MapGrpcService<SmsService>();
});

 

四、新建客戶端

 1. 新建控制檯程式

dotnet new console -n gRPC.Client

2. 新增包(Google.Protobuf)

dotnet add package Google.Protobuf

3. 引入步驟二生成的protobuf檔案(可以使用萬用字元引入多個protobuf檔案),注意:這裡需要生成是客戶端程式碼,當然也可以用Both引數生成

dotnet-grpc add-file ..\gRPC.Protos\*.proto -s Client

 

五、執行

1. 執行服務端

2. 啟動客戶端

客戶端輸出下面資訊

{"Code":1,"Message":"\u53D1\u9001\u6210\u529F"}

 

六、小結

gRPC的生命週期

Client(傳送請求) -> Client stub(壓縮/解壓) -> Client RPC Transfer(傳送/接收) -> Server RPC Transfer(接收/傳送) -> Server stub(解壓/壓縮) -> Server (處理響應)

gPRC幫我們隱藏中間的環節,只剩下兩頭的程式碼(俗稱業務邏輯程式碼)

protobuf它是一種可序列化的資料結構,但它更重要是定義介面,讓服務端和客戶端能分離出來

轉發請標明出處:https://www.cnblogs.com/WilsonPan/p/12000796.html

示例程式碼:https://github.com/WilsonPan/AspNetCoreExamples/tree/master/gRPC