gRPC 是一種與語言無關的高性能遠程過程調用 (RPC) 框架。html
gRPC 的主要優勢git
這些優勢使 gRPC 適用於github
gRPC 如今能夠很是簡單的在 .NET Core 和 ASP.NET Core 中使用,而且已經開源,它目前由微軟官方 ASP.NET 項目的人員進行維護,良好的接入 .NET Core 生態。api
接下來演示如何使用 gRPC,要想使用 gRPC 須要 .NET Core 3.1或者以上的SDK支持。gRPC分服務端和客戶端,因此新建兩個項目,一個控制檯看成客戶端gRPC_ClientDemo
,一個ASP.NET Core 項目看成服務端gRPC_ServerDemo
。服務器
先將服務端搞定,添加Grpc.AspNetCore
組件網絡
Install-Package Grpc.AspNetCore
而後Startup.cs
中添加services.AddGrpc()
。app
public void ConfigureServices(IServiceCollection services){ services.AddGrpc();}
由於 gRPC 是基於 HTTP/2 來通訊的,因此須要在配置文件中添加Kestrel 啓用 HTTP/2 的配置。框架
{ "Kestrel": { "EndpointDefaults": { "Protocols": "Http2" } }}
gRPC 與傳統的api是不一樣的,須要咱們本身定義proto
文件,gRPC 使用協定優先方法進行 API 開發。 默認狀況下,協議緩衝區 (protobuf) 用做接口設計語言 (IDL)。 *.proto 文件包含:async
有關 protobuf 文件的語法的詳細信息,能夠查看官方文檔 (protobuf)。ide
proto
文件在實際開發中確定會有多個存在,這裏有一個技巧就是將proto
文件放在一個文件夾內,而後利用Protobuf
的Link
關聯便可,這樣就只用維護一份proto
文件便可。
同時微軟還幫咱們提供了dotnet-grpc
,.NET Core 全局工具,請運行如下命令:
dotnet tool install -g dotnet-grpc
dotnet-grpc
能夠用於將 Protobuf
引用做爲 <Protobuf />
項添加到 .csproj 文件:
<Protobuf Include="Protos\greet.proto" GrpcServices="Server" />
具體用法能夠查看文檔:https://docs.microsoft.com/zh-cn/aspnet/core/grpc/dotnet-grpc
在解決訪問文件夾根目錄添加 Proto 文件夾,新建一個hello.proto
proto文件,將其分別鏈接到兩個項目中。
如今來開始編寫hello.proto
,添加一個SayHello
方法。
syntax = "proto3";package hello; //定義包名// 定義服務service HelloService { // 定義一個 SayHello 方法 rpc SayHello (HelloRequest) returns (HelloReply);}message HelloRequest { string name = 1;}message HelloReply { string message = 1;}
而後來實現這個服務,在服務端添加一個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<GreeterService>(); } public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context) { _logger.LogInformation($"Sending hello to {request.Name}"); return Task.FromResult(new HelloReply { Message = "Hello " + request.Name }); } }}
HelloService.HelloServiceBase
是proto
文件爲咱們自動生成的類。
調用重載方法SayHello()
,記錄了一條日誌而後返回客戶端傳進來的字段name。
在配置文件中將GreeterService
服務添加到路由管道中
app.UseEndpoints(endpoints =>{ endpoints.MapGet("/", async context => { await context.Response.WriteAsync("Hello World!"); }); endpoints.MapGrpcService<GreeterService>();});
支持咱們服務端完成,啓動服務端拿到啓動地址,https://localhost:5001。
如今去客戶端配置地址調用咱們寫的服務,在開始以前須要在客戶端解決方案先引用下面幾個nuget包。
Install-Package Grpc.Net.ClientInstall-Package Google.ProtobufInstall-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); } }}
啓動服務端和客戶端看看效果,成功發送消息和獲取消息。
.NET Core 下使用 gRPC 文章轉載:http://www.shaoqun.com/a/472295.html