外贸一站式推广服务,上海最新状况,商务网站建设公,建网站的方法gRPC是高性能的RPC框架#xff0c; 有效地用于服务通信(不管是数据中心内部还是跨数据中心)。由Google开源#xff0c;目前是一个Cloud Native Computing Foundation#xff08;CNCF#xff09;孵化项目。其功能包括#xff1a;•双向流•强大的二进制序列化•可插拔的身份… gRPC是高性能的RPC框架 有效地用于服务通信(不管是数据中心内部还是跨数据中心)。由Google开源目前是一个Cloud Native Computing FoundationCNCF孵化项目。其功能包括•双向流•强大的二进制序列化•可插拔的身份验证负载平衡和运行状况检查在gRPC中客户端应用程序可以直接在A服务器上调用B服务器的方法就好像它是本地对象一样从而使您更轻松地创建分布式应用程序和微服务。与许多RPC系统一样gRPC也是围绕着定义服务的思想(定义可远程调用方法的入参和返回值类型)。在服务端服务端实现此接口并运行gRPC服务器以处理客户端调用。在客户端客户端有一个存根提供与服务器相同的方法。在本文中我将向您展示如何使用.NET5创建gRPC服务。我将分解gRPC的一些重要基础概念并给出一个有意思的包罗核心功能的实例。1.创建一个gRPC服务器我们从gRPC服务模板创建一个新的dotnet项目。如果使用Visual Studio请创建一个新项目然后选择gRPC Service模板使用GrpcAuthor作为项目的名称。1.1 定义Rpc 服务客户端与服务端使用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 greetingrpc SayHello (HelloRequest) returns (HelloReply);
}
// The request message containing the users name.
message HelloRequest {string name 1;
}
// The response message containing the greetings.
message HelloReply {string message 1;
}
从.proto文件内容上大致知道服务功能 (给某人一个回应) 这里提示一些语法①syntax指示使用的protocol buffers的版本。在这种情况下proto3是撰写本文时的最新版本。②csharp_namespace指示生成的文件所在的命名空间。package说明符也是这个作用用于防止协议消息类型之间的名称冲突。对于C如果提供选项csharp_namespacecsharp_namespace值将用作命名空间在Java中如果提供选项java_packagejava_package将用作包名称。 ③service Greeter定义服务基类名称, rpc SayHello (HelloRequest) returns (HelloReply); 是一个一元rpc调用 ④HelloRequest和HelloReply是在客户端和服务器之间交换信息的数据结构。它们被称为消息。你在消息字段中定义的数字是不可重复的当消息被序列化为Protobuf时该数字用于标识字段这是因为序列化一个数字比序列化整个字段名称要快。1.2 实现服务接口 为了从.proto文件生成代码可以使用protoc编译器和C插件来生成服务器或客户端代码。脚手架项目使用Grpc.AspNetCore NuGet包所需的类由构建过程自动生成, 你只需要在项目.csproj文件中添加配置节ItemGroupProtobuf IncludeProtos\greet.proto GrpcServicesServer /
/ItemGroup
生成的代码知道如何使用protocol buffers与其他服务/客户端进行通信。C工具生成GreeterBase类型将用作实现gRPC服务的基类。public class GreeterService : Greeter.GreeterBase
{private readonly ILoggerGreeterService _logger;public GreeterService(ILoggerGreeterService logger){_logger logger;}public override TaskHelloReply SayHello(HelloRequest request, ServerCallContext context){return Task.FromResult(new HelloReply{Message Hello request.Name});}
}
最后注册Grpc端点endpoints.MapGrpcServiceGreeterService ();--- 启动服务---...2. 创建gRPC .NET控制台客户端Visual Studio创建一个名为GrpcAuthorClient的新控制台项目。安装如下nuget包:Install-Package Grpc.Net.ClientInstall-Package Google.ProtobufInstall-Package Grpc.ToolsGrpc.Net.Client包含.NET Core客户端;Google.Protobuf包含protobuf消息API;Grpc.Tools对Protobuf文件进行编译。①拷贝服务端项目中的.proto文件②将选项csharp_namespace值修改为GrpcAuthorClient。③更新.csproj文件的配置节ItemGroupProtobuf IncludeProtos\greet.proto GrpcServicesClient //ItemGroup④Client主文件:static void Main(string[] args)
{var serverAddress https://localhost:5001;using var channel GrpcChannel.ForAddress(serverAddress);var client new Greeter.GreeterClient(channel);var reply client.SayHello(new HelloRequest { Name 宋小宝 });Console.WriteLine(reply.Message.ToString());Console.WriteLine(Press any key to exit...);Console.ReadKey();
}
使用服务器地址创建GrpcChannel使用GrpcChannel对象实例化GreeterClient然后使用SayHello同步方法; 打印服务器响应结果。3. 其他核心功能3.1 通信方式Unary RPC(一元Rpc调用): 上面的例子Server streaming RPC 服务器流式RPC客户端在其中向服务器发送请求并读取消息流。客户端从返回的流中读取直到没有更多消息为止。gRPC保证单个RPC调用中的消息顺序。Client streaming RPC客户端流式RPC客户端使用流写入一系列消息并发送到服务器。客户端写完消息后它将等待服务器读取消息并返回响应。同样gRPC保证了单个RPC调用中的消息顺序。Bidirectional streaming RPC双向流式通信由于两个流是独立的因此客户端和服务器可以按任何顺序读取和写入消息。例如服务器可以等到收到客户端的所有消息后再写消息或者服务器和客户端可以打“乒乓” (服务器收到请求然后响应消息然后客户端基于响应发送另一个消息依此往返)3.2 Metadata 元数据是以键值对列表的形式提供的有关特定RPC调用的信息例如身份验证详细信息其中键是字符串值通常是字符串但可以是二进制数据。元数据对于gRPC本身是不透明的它允许客户端向服务器提供与调用相关的信息反之亦然。3.3 Channels gRPC通道提供到指定主机和端口上的gRPC服务器的连接。创建客户端存根时用到它可以指定通道参数来修改gRPC的默认行为例如打开或关闭消息压缩。通道具有状态包括已连接和空闲。4. gRpc打乒乓球针对脚手架项目稍作修改---乒乓球局(考察gRpc双向流式通信、Timeout机制、异常处理): 客户端发送gridsum, 服务端回发musdirg; 客户端再发送gridsum 往复......① 添加接口rpc PingPongHello(stream HelloRequest) returns (stream HelloReply);
② 实现服务契约try
{while (!context.CancellationToken.IsCancellationRequested){var asyncRequests requestStream.ReadAllAsync();// 客户端与服务端打乒乓await foreach (var req in asyncRequests){var send Reverse(req.Name);await responseStream.WriteAsync(new HelloReply{Message send,Id req.Id 1});Debug.WriteLine($第{req.Id}回合服务端收到 {req.Name}开始第{req.Id 1}回合,服务端回发 {send});}}
}
catch(RpcException ex)
{System.Diagnostics.Debug.WriteLine(${ex.Message});
}③ 客户端代码控制乒乓球局在5s后终止using (var cancellationTokenSource new CancellationTokenSource( 5* 1000))
{try{var duplexMessage client.PingPongHello(null, null, cancellationTokenSource.Token);await duplexMessage.RequestStream.WriteAsync(new HelloRequest { Id 1, Name gridsum }) ;var asyncResp duplexMessage.ResponseStream.ReadAllAsync();await foreach (var resp in asyncResp){var send Reverse(resp.Message);await duplexMessage.RequestStream.WriteAsync(new HelloRequest {Id resp.Id, Name send });Console.WriteLine($第{resp.Id}回合客户端收到 {resp.Message}, 客户端发送{send});}}catch (RpcException ex){Console.WriteLine(打乒乓球时间到了客户端5s后终断gRpc连接);}}
https://github.com/zaozaoniao/GrpcAuthor总结 gRPC是具有可插拔身份验证和负载平衡功能的高性能RPC框架。使用protocol buffers定义结构化数据使用不同语言自动产生的源代码在各种数据流中写入和读取结构化数据。在本文中您学习了如何使用protocol buffers 定义服务接口以及如何使用C实现服务。最后您使用gRPC双向流式通信创建了 打乒乓球Demo。Additional Resources• https://developers.google.com/protocol-buffers/docs/csharptutorial• https://www.grpc.io/docs/what-is-grpc/core-concepts/• https://docs.microsoft.com/en-us/dotnet/architecture/grpc-for-wcf-developers/why-grpc