本文介紹在gRPC使用,將從下面幾個方面介紹
- 什么是RPC
- 什么時候需要RPC
- 如何使用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更多是使用以下場景
- 對通訊性能要求較高
- 微服務
- 點到點通訊
gRPC使用
gRPC是Google開源的高性能RPC框架,有以下幾個特點
- 現代高性能輕量級 RPC 框架,
-
協定優先 API 開發,默認使用protobuf,允許與語言無關的實作,(這里涉及兩點,1.面向介面開發,依賴抽象而不是具體,2. 可以不同語言實作協作)
-
使用 Protobuf 二進制序列化減少對網路的使用,(減少網路傳輸)
-
可用于多種語言的工具,以生成強型別服務器和客戶端,
-
支持客戶端、服務器和雙向流式處理呼叫,
下面開始介紹如何在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
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/79143.html
標籤:.NET Core
