.NET Core 下使用 gRPC

gRPC 是一種與語言無關(guān)的高性能遠(yuǎn)程過程調(diào)用 (RPC) 框架。
- https://grpc.io/docs/guides/
- https://github.com/grpc/grpc-dotnet
- https://docs.microsoft.com/zh-cn/aspnet/core/grpc
“gRPC 的主要優(yōu)點(diǎn)
- 現(xiàn)代高性能輕量級 RPC 框架。
- 協(xié)定優(yōu)先 API 開發(fā),默認(rèn)使用協(xié)議緩沖區(qū),允許與語言無關(guān)的實(shí)現(xiàn)。
- 可用于多種語言的工具,以生成強(qiáng)類型服務(wù)器和客戶端。
- 支持客戶端、服務(wù)器和雙向流式處理調(diào)用。
- 使用 Protobuf 二進(jìn)制序列化減少對網(wǎng)絡(luò)的使用。
“這些優(yōu)點(diǎn)使 gRPC 適用于
- 效率至關(guān)重要的輕量級微服務(wù)。
- 需要多種語言用于開發(fā)的 Polyglot 系統(tǒng)。
- 需要處理流式處理請求或響應(yīng)的點(diǎn)對點(diǎn)實(shí)時服務(wù)。
gRPC 現(xiàn)在可以非常簡單的在 .NET Core 和 ASP.NET Core 中使用,并且已經(jīng)開源,它目前由微軟官方 ASP.NET 項(xiàng)目的人員進(jìn)行維護(hù),良好的接入 .NET Core 生態(tài)。
接下來演示如何使用 gRPC,要想使用 gRPC 需要 .NET Core 3.1或者以上的SDK支持。gRPC分服務(wù)端和客戶端,所以新建兩個項(xiàng)目,一個控制臺當(dāng)作客戶端gRPC_ClientDemo,一個ASP.NET Core 項(xiàng)目當(dāng)作服務(wù)端gRPC_ServerDemo。
先將服務(wù)端搞定,添加Grpc.AspNetCore組件
Install-Package Grpc.AspNetCore
然后Startup.cs中添加services.AddGrpc()。
public?void?ConfigureServices(IServiceCollection?services)
{
????services.AddGrpc();
}
因?yàn)?gRPC 是基于 HTTP/2 來通信的,所以需要在配置文件中添加Kestrel 啟用 HTTP/2 的配置。
{
??"Kestrel":?{
????"EndpointDefaults":?{
??????"Protocols":?"Http2"
????}
??}
}
gRPC 與傳統(tǒng)的api是不同的,需要我們自己定義proto文件,gRPC 使用協(xié)定優(yōu)先方法進(jìn)行 API 開發(fā)。默認(rèn)情況下,協(xié)議緩沖區(qū) (protobuf) 用作接口設(shè)計(jì)語言 (IDL)。*.proto 文件包含:
- gRPC 服務(wù)的定義。
- 在客戶端與服務(wù)器之間發(fā)送的消息。
有關(guān) protobuf 文件的語法的詳細(xì)信息,可以查看官方文檔 (protobuf)。
proto文件在實(shí)際開發(fā)中肯定會有多個存在,這里有一個技巧就是將proto文件放在一個文件夾內(nèi),然后利用Protobuf的Link關(guān)聯(lián)即可,這樣就只用維護(hù)一份proto文件即可。
同時微軟還幫我們提供了dotnet-grpc,.NET Core 全局工具,請運(yùn)行以下命令:
dotnet?tool?install?-g?dotnet-grpc
dotnet-grpc?可以用于將?Protobuf?引用作為??項(xiàng)添加到 .csproj 文件:
<Protobuf?Include="Protos\greet.proto"?GrpcServices="Server"?/>
具體用法可以查看文檔:https://docs.microsoft.com/zh-cn/aspnet/core/grpc/dotnet-grpc
在解決訪問文件夾根目錄添加 Proto 文件夾,新建一個hello.protoproto文件,將其分別連接到兩個項(xiàng)目中。

現(xiàn)在來開始編寫hello.proto,添加一個SayHello方法。
syntax?=?"proto3";
package?hello;?//定義包名
//?定義服務(wù)
service?HelloService?{
????//?定義一個?SayHello?方法
????rpc?SayHello?(HelloRequest)?returns?(HelloReply);
}
message?HelloRequest?{
????string?name?=?1;
}
message?HelloReply?{
????string?message?=?1;
}
然后來實(shí)現(xiàn)這個服務(wù),在服務(wù)端添加一個GreeterService.cs。
using?Grpc.Core;
using?Hello;
using?Microsoft.Extensions.Logging;
using?System.Threading.Tasks;
namespace?gRPC_ServerDemo.Services
{
????public?class?GreeterService?:?HelloService.HelloServiceBase
????{
????????private?readonly?ILogger?_logger;
????????public?GreeterService(ILoggerFactory?loggerFactory)
????????{
????????????_logger?=?loggerFactory.CreateLogger();
????????}
????????public?override?Task?SayHello(HelloRequest?request,?ServerCallContext?context)
????????{
????????????_logger.LogInformation($"Sending?hello?to?{request.Name}");
????????????return?Task.FromResult(new?HelloReply?{?Message?=?"Hello?"?+?request.Name?});
????????}
????}
}
HelloService.HelloServiceBase是proto文件為我們自動生成的類。

調(diào)用重載方法SayHello(),記錄了一條日志然后返回客戶端傳進(jìn)來的字段name。
在配置文件中將GreeterService服務(wù)添加到路由管道中
app.UseEndpoints(endpoints?=>
{
????endpoints.MapGet("/",?async?context?=>
????{
????????await?context.Response.WriteAsync("Hello?World!");
????});
????endpoints.MapGrpcService();
});
支持我們服務(wù)端完成,啟動服務(wù)端拿到啟動地址,https://localhost:5001。
現(xiàn)在去客戶端配置地址調(diào)用我們寫的服務(wù),在開始之前需要在客戶端解決方案先引用下面幾個nuget包。
Install-Package Grpc.Net.Client
Install-Package Google.Protobuf
Install-Package Grpc.Tools
using?Grpc.Net.Client;
using?Hello;
using?System;
using?System.Threading.Tasks;
namespace?gRPC_ClientDemo
{
????class?Program
????{
????????static?async?Task?Main(string[]?args)
????????{
????????????using?var?channel?=?GrpcChannel.ForAddress("https://localhost:5001");
????????????var?client?=?new?HelloService.HelloServiceClient(channel);
????????????await?UnaryCallExample(client);
????????}
????????private?static?async?Task?UnaryCallExample(HelloService.HelloServiceClient?client)
????????{
????????????var?reply?=?await?client.SayHelloAsync(new?HelloRequest?{?Name?=?"阿星Plus"?});
????????????Console.WriteLine("Greeting:?"?+?reply.Message);
????????}
????}
}
啟動服務(wù)端和客戶端看看效果,成功發(fā)送消息和獲取消息。

往期精彩回顧
【推薦】.NET Core開發(fā)實(shí)戰(zhàn)視頻課程?★★★
.NET Core實(shí)戰(zhàn)項(xiàng)目之CMS 第一章 入門篇-開篇及總體規(guī)劃
【.NET Core微服務(wù)實(shí)戰(zhàn)-統(tǒng)一身份認(rèn)證】開篇及目錄索引
Redis基本使用及百億數(shù)據(jù)量中的使用技巧分享(附視頻地址及觀看指南)
.NET Core中的一個接口多種實(shí)現(xiàn)的依賴注入與動態(tài)選擇看這篇就夠了
用abp vNext快速開發(fā)Quartz.NET定時任務(wù)管理界面
在ASP.NET Core中創(chuàng)建基于Quartz.NET托管服務(wù)輕松實(shí)現(xiàn)作業(yè)調(diào)度
現(xiàn)身說法:實(shí)際業(yè)務(wù)出發(fā)分析百億數(shù)據(jù)量下的多表查詢優(yōu)化
關(guān)于C#異步編程你應(yīng)該了解的幾點(diǎn)建議
給我好看
您看此文用
?
?
·
?
秒,轉(zhuǎn)發(fā)只需1秒呦~

好看你就
點(diǎn)點(diǎn)
我

