gRPC是高性能的RPC框架, 有效地用于服务通信(不管是数据中心内部还是跨数据中心)。
由Google开源,目前是一个Cloud Native Computing Foundation(CNCF)孵化项目。
其功能包括:
双向流
强大的二进制序列化
可插拔的身份验证,负载平衡和运行状况检查
在gRPC中,客户端应用程序可以直接在A服务器上调用B服务器的方法,就好像它是本地对象一样,从而使您更轻松地创建分布式应用程序和微服务。
与许多RPC系统一样,gRPC也是围绕着定义服务的思想(定义可远程调用方法的入参和返回值类型)。
在服务器端,服务器实现此接口并运行gRPC服务器,以处理客户端调用。
在客户端,客户端具有一个存根(在某些语言中仅称为客户端),提供与服务器相同的方法。
在本文中,我将向您展示如何使用.NET5创建gRPC服务。我将分解gRPC的一些重要基础概念,并给出一个通信示例。
1.创建一个gRPC服务器我们将从使用gRPC服务模板创建一个新的dotnet项目。
如果使用Visual Studio,请创建一个新项目,然后选择gRPC Service模板,使用GrpcAuthor作为项目的名称。
1.1 The RPC Service Definition客户端与服务端使用protocol buffers交流/通信:
protocol buffers既用作服务的接口定义语言(IDL),又用作底层消息交换格式。
① 使用protocol buffers在.proto文件中定义服务接口。在其中,定义可远程调用的方法的入参和返回值类型。服务器实现此接口并运行gRPC服务器以处理客户端调用。
② 定义服务后,使用protocol buffers编译器protoc从.proto文件生成数据访问/传输类。该文件包含服务接口中消息和方法的实现。
关注VS脚手架项目Protos文件夹中的greet.proto。
syntax = "proto3"; option csharp_namespace = "GrpcAuthor"; package greet; // The greeting service definition. service Greeter { // Sends a greeting rpc SayHello (HelloRequest) returns (HelloReply); } // The request message containing the user's name. message HelloRequest { string name = 1; } // The response message containing the greetings. message HelloReply { string message = 1; }让我们分解一下.proto文件,了解protocol buffers的基本语法
从.proto文件上大致知道 定义的服务功能 (给某人一个回应), 这里提示一些语法:
syntax指示使用的protocol buffers的版本。在这种情况下,proto3是撰写本文时的最新版本。
csharp_namespace指示生成的文件所在的命名空间。package说明符也是这个作用,用于防止协议消息类型之间的名称冲突。
对于C#,如果提供选项csharp_namespace,csharp_namespace值将用作命名空间;
在Java中,如果提供选项java_package,java_package将用作包名称。
service Greeter定义服务基类名称, rpc SayHello (HelloRequest) returns (HelloReply); 是一个一元rpc调用
HelloRequest和HelloReply是在客户端和服务器之间交换信息的数据结构。它们被称为消息。
你在消息字段中定义的数字是不可重复的,当消息被序列化为Protobuf时,该数字用于标识字段,这是因为序列化一个数字比序列化整个字段名称要快。
更多语法,请查看https://developers.google.com/protocol-buffers/docs/overview
1.2 实现服务接口为了从.proto文件生成代码,可以使用protoc编译器和C#插件来生成服务器或客户端代码。
脚手架项目使用Grpc.AspNetCore NuGet包:所需的类由构建过程自动生成, 你只需要在项目.csproj文件中添加配置节:
生成的代码知道如何使用protocol buffers与其他服务/客户端进行通信。
C#工具生成GreeterBase类型,将用作实现gRPC服务的基类。
public class GreeterService : Greeter.GreeterBase { private readonly ILogger<GreeterService> _logger; public GreeterService(ILogger<GreeterService> logger) { _logger = logger; } public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context) { return Task.FromResult(new HelloReply { Message = "Hello " + request.Name }); } }最后注意注册Grpc端点endpoints.MapGrpcService<GreeterService >();
--- 启动服务---...
2. 创建gRPC .NET控制台客户端Visual Studio创建一个名为GrpcAuthorClient的新控制台项目。
安装如下nuget包:
Install-Package Grpc.Net.Client
Install-Package Google.Protobuf
Install-Package Grpc.Tools
Grpc.Net.Client包含.NET Core客户端;
Google.Protobuf包含protobuf消息API;
Grpc.Tools对Protobuf文件进行编译。
拷贝服务端项目中的..proto文件
将选项csharp_namespace值修改为GrpcAuthorClient。
更新.csproj文件的配置节
<ItemGroup> <Protobuf Include="Protos\author.proto" GrpcServices="Client" /> </ItemGroup>