gRPC 是一個由Google開源的,跨語言的,高性能的遠程過程調用(RPC)框架。 gRPC使客戶端和服務端應用程序能夠透明地進行通訊,並簡化了鏈接系統的構建。它使用HTTP/2做爲通訊協議,使用 Protocol Buffers 做爲序列化協議。html
它的主要優勢:git
這些優勢使gRPC很是適合:github
不建議使用gRPC的場景:json
摘自微軟官方文檔瀏覽器
支持的語言以下:安全
gRPC 如今能夠很是簡單的在 .NET Core 和 ASP.NET Core 中使用,在 .NET Core 上的實現的開源地址:https://github.com/grpc/grpc-dotnet ,它目前由微軟官方 ASP.NET 項目的人員進行維護,良好的接入 .NET Core 生態。服務器
.NET Core 的 gRPC 功能以下:網絡
HttpClientFactory
,容許對gRPC客戶端進行集中配置,並使用DI注入到應用程序中來扒拉一下默認源碼包含了什麼東東。app
① 配置文件 appsettings.json
,多了Kestrel 啓用 HTTP/2 的配置,由於 gRPC 是基於 HTTP/2 來通訊的框架
② PB協議文件 greet.proto
用於自動生成服務、客戶端和消息(表示傳遞的數據)的C# Class
③ 服務類 GreeterService
,服務類集成的 Greeter.GreeterBase
來自於根據proto文件自動生成的,生成的類在 obj\Debug\netcoreapp3.0
目錄下
自動生成的類:
④ Startup.cs
類,將 gRPC服務添加到了終結點路由中
⑤ csproj 項目文件,包含了 proto 文件引用
2.運行
第一次運行會提示是否信任證書,點擊「是」
這是由於HTTP/2須要HTTPS,儘管HTTP/2協議沒有明確規定須要HTTPS,可是爲了安全在瀏覽器實現上都要求了HTTPS,因此如今的HTTP/2和HTTPS基本都是一對。
1.添加一個.NET Core 控制檯應用程序
2.經過nuget添加包:Grpc.Net.Client、Google.Protobuf、Grpc.Tools
3.將服務的 proto 文件複製到客戶端
4.編輯客戶端項目文件,添加關於proto文件的描述
<ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Client" /> </ItemGroup>
注意 GrpcServices="Client"
這裏是Client和服務是不同的
5.生成客戶端項目能夠經過proto文件生成類
6.添加客戶端調用代碼
static async Task Main(string[] args) { var channel = GrpcChannel.ForAddress("https://localhost:5001"); var client = new Greeter.GreeterClient(channel); var reply = await client.SayHelloAsync( new HelloRequest { Name = "曉晨" }); Console.WriteLine("Greeter 服務返回數據: " + reply.Message); Console.ReadKey(); }
7.先啓動服務,而後運行客戶端
這裏能夠看到,客戶端成功調用了服務,收到了返回的消息。
前面咱們使用的 Greeter 服務是由模板自動給咱們建立的,如今咱們來本身動手寫一個服務。
編寫一個「擼貓服務」
1.定義 proto 文件 LuCat.proto
,並在csproj項目文件中添加描述
syntax = "proto3"; option csharp_namespace = "AspNetCoregRpcService"; import "google/protobuf/empty.proto"; package LuCat; //定義包名 //定義服務 service LuCat{ //定義吸貓方法 rpc SuckingCat(google.protobuf.Empty) returns(SuckingCatResult); } message SuckingCatResult{ string message=1; }
2.實現服務 LuCatService.cs
public class LuCatService:LuCat.LuCatBase { private static readonly List<string> Cats=new List<string>(){"英短銀漸層","英短金漸層","美短","藍貓","狸花貓","橘貓"}; private static readonly Random Rand=new Random(DateTime.Now.Millisecond); public override Task<SuckingCatResult> SuckingCat(Empty request, ServerCallContext context) { return Task.FromResult(new SuckingCatResult() { Message = $"您吸了一隻{Cats[Rand.Next(0, Cats.Count)]}" }); } }
3.在 Startup
終結點路由中註冊
endpoints.MapGrpcService<LuCatService>();
4.添加客戶端調用
var catClient = new LuCat.LuCatClient(channel); var catReply = await catClient.SuckingCatAsync(new Empty()); Console.WriteLine("調用擼貓服務:"+ catReply.Message);
5.運行測試
上面章節的操做步驟中,咱們須要在服務和客戶端之間複製proto,這是一個能夠省略掉的步驟。
1.複製 Protos 文件夾到解決方案根目錄(sln文件所在目錄)
2.刪除客戶端和服務項目中的 Protos 文件夾
3.在客戶端項目文件csproj中添加關於proto文件的描述
<ItemGroup> <Protobuf Include="..\..\Protos\greet.proto" GrpcServices="Client" Link="Protos\greet.proto" /> </ItemGroup>
4.在服務項目文件csproj中添加關於proto文件的描述
<ItemGroup> <Protobuf Include="..\..\Protos\greet.proto" GrpcServices="Server" Link="Protos\greet.proto" /> </ItemGroup>
在實際項目中,請本身計算相對路徑
5.這樣兩個項目都是使用的一個proto文件,只用維護這一個文件便可
咱們在實際項目中使用,確定有多個 proto 文件,難道咱們每添加一個 proto 文件都要去更新 csproj文件?
咱們可使用MSBuild變量來幫咱們完成,咱們將 csproj 項目文件中引入proto文件信息進行修改。
服務端:
<ItemGroup> <Protobuf Include="..\..\Protos\*.proto" GrpcServices="Server" Link="Protos\%(RecursiveDir)%(Filename)%(Extension)" /> </ItemGroup>
客戶端:
<ItemGroup> <Protobuf Include="..\..\Protos\*.proto" GrpcServices="Client" Link="Protos\%(RecursiveDir)%(Filename)%(Extension)" /> </ItemGroup>
示例:
gRPC 現目前是一款很是成熟的高性能RPC框架,當前的生態是很是好的,不少公司的產品或者開源項目都有在使用gRPC,有了它,相信可讓咱們更容易的構建.NET Core 微服務,可讓 .NET Core 更好的接入 gRPC 生態。不得不說這是 .NET Core 3.0 帶來的最使人振奮的特性之一。
參考資料:
若是你們沒法訪問proto3說明文檔,這裏提供一個離線網頁版(請另存爲下載後用Chrome打開)
原文出處:https://www.cnblogs.com/stulzq/p/11581967.html