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); } }}
启动服务端和客户端看看效果,成功发送消息和获取消息。