.NET gRPC 核心功能初体验,附Demo源码

gRPC是高性能的RPC框架, 有效地用于服务通信(不管是数据中心内部还是跨数据中心)。

由Google开源,目前是一个Cloud Native Computing Foundation(CNCF)孵化项目。

其功能包括:

双向流

强大的二进制序列化

可插拔的身份验证,负载平衡和运行状况检查

.NET gRPC 核心功能初体验,附Demo源码

在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文件中添加配置节:

<ItemGroup> <Protobuf Include="Protos\greet.proto" GrpcServices="Server" /> </ItemGroup>

生成的代码知道如何使用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>

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpzgxp.html