.NET gRPC核心功能初体验

    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  定义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 user's 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_namespace,csharp_namespace值将用作命名空间;
在Java中,如果提供选项java_package,java_package将用作包名称。

    ③service Greeter定义服务基类名称, rpc SayHello (HelloRequest) returns (HelloReply); 是一个一元rpc调用    ④HelloRequestHelloReply是在客户端和服务器之间交换信息的数据结构。它们被称为消息
你在消息字段中定义的数字是不可重复的,当消息被序列化为Protobuf时,该数字用于标识字段,这是因为序列化一个数字比序列化整个字段名称要快。

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\greet.proto" GrpcServices="Client" /></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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304486.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么我怎么也理解不了波粒二象性,是因为智商不够吗?

大家好&#xff0c;各位观众。如果你们之前不能完全理解波粒二象性&#xff08;现象本身&#xff0c;或者这个概念的内涵和外延&#xff09;。不用担心&#xff0c;我认为十有八九不是智商问题&#xff1a;量子物理的内容有太多“反常识”了。很多时候&#xff0c;是我们的脑袋…

设备间的连线图例

转载于:https://blog.51cto.com/51fashion/243017

化学版2048,你玩过吗?内含游戏链接

今天来给大家推荐一款游戏——Na&#xff08;钠&#xff09;&#xff0c;也可以叫它化学版2048。首先2048大家都不陌生&#xff0c;曾经火爆一时的小游戏&#xff0c;于14年由年仅19岁的意大利程序员加布里勒希鲁尼&#xff08;Gabriele Cirulli&#xff09;开发出来。2048游戏…

sqlsession.selectlist 会返回null么_StackOverflow经典问题:代码中如何去掉烦人的“!=nullquot;判空语句...

推荐阅读&#xff1a;程序员引路人&#xff1a;腾讯T4曰“面试不仅仅是技术过硬就可以了&#xff0c;你还需要懂得这些”​zhuanlan.zhihu.com问题为了避免空指针调用&#xff0c;我们经常会看到这样的语句if (someobject ! null) { someobject.doCalc();}最终&#xff0c;项…

如何在 ASP.Net Core 中使用 Configuration Provider

ASP.NET Core 是一个开源的&#xff0c;跨平台的&#xff0c;精简的模块化框架&#xff0c;可用于构建高性能&#xff0c;可扩展的web应用程序&#xff0c; ASP.NET Core 中的数据配置常用 k-v 的形式存储&#xff0c;值得注意的是&#xff0c;新的数据配置还支持 层级方式&…

GdiPlus[30]: IGPPen: 线帽

StartCap 和 EndCap 属性分别用来读写两段的线帽, 测试图:StartCap 和 EndCap 测试代码:uses GdiPlus;procedure TForm1.FormPaint(Sender: TObject); constCapArr: array[0..8] of Byte (0, 1, 2, 3, $10, $11, $12, $13, $14); varGraphics: IGPGraphics;Pen: IGPPen;Pt1,Pt…

你知道怎么样排序才能做到多快好省?

小智最近迷上了计算机算法&#xff0c;今天过来给大家讲讲排序算法。准备讲排序算法之前&#xff0c;我们还是要先回顾一下排序这个概念。排序是一门古老的科学。排序问题&#xff0c;用数学的方式可以表达如下问题输入&#xff1a;给定n个数&#xff0c;a1, a2, a3, ..., an…

C# 使用 Index 和 Range 简化集合操作

C# 使用 Index 和 Range 简化集合操作Intro有的语言数组的索引值是支持负数的&#xff0c;表示从后向前索引&#xff0c;比如&#xff1a;arr[-1]从 C# 8 开始&#xff0c;C# 支持了数组的反向 Index&#xff0c;和 Range 操作&#xff0c;反向 Index 类似于其他语言中的负索引…

我的小服务器

朋友做了一个工控机的板子&#xff0c;我要了一块来&#xff0c;自己加上了迅驰1.2G CPU&#xff0c;再从笔记本上拆了一个1G内存和老的移动硬盘 30G IDE&#xff0c;就算搭起了一个最简陋的服务器。此外我从破DVD光驱上拆了一块铁皮底板&#xff0c;打了几个洞&#xff0c;把主…

爱心助农|百万斤丑苹果紧急待售!谁能帮这些特困孩子熬过寒冷冬天?

题记&#xff1a;人们在猛兽横行的蛮荒年代&#xff0c;得以从树上回归地面&#xff0c;是人们守望相助的结果&#xff0c;也是人类能繁衍至今的原因在这个什么都讲究颜值的年代有这样一个东西却以“丑”、“但非常好吃”引起了我们的注意它便是山西临猗的冰糖心丑苹果还要一个…

微软开源AI诊断工具Error Analysis

喜欢就关注我们吧&#xff01;Error Analysis 使用机器学习技术&#xff0c;助数据科学家更好地了解模型错误模式。在 2020 年 5 月的微软 Build 大会上&#xff0c;微软推出了三个响应式的 AI&#xff08;Responsible AI&#xff0c;RAI&#xff09;工具包&#xff0c;这三个工…

【SDL的编程】VC环境搭建

SDL&#xff08;simple DirectMedia Layer&#xff09;是一个可跨平台的开源库&#xff0c;最近由于自己的兴趣&#xff0c;就把它windosXP下的环境搭建了下。PC&#xff1a;Mircrosoft Windows XP Service Pack3Platform&#xff1a;Mircrosoft Visual C 6.0SourceCode&#x…

# 保持最外层获取焦点_大事件!沈阳爱尔白内障焕晶诊疗中心正式启用,两位PanOptix三焦点人工晶体植入患者清晰见证!...

近日&#xff0c;沈阳爱尔眼科医院大东院区白内障焕晶诊疗中心正式投入使用&#xff01;由沈阳爱尔眼科医院大东院区业务院长朱建勋领衔的白内障手术团队始终与国内外一流水准保持同步&#xff0c;开创性引进了爱尔康AcrySof IQ PanOptix 新一代三焦点人工晶状体。中心最先入住…

使用 Tye 辅助开发 k8s 应用竟如此简单(六)

续上篇&#xff0c;这篇我们来进一步探索 Tye 更多的使用方法。本篇我们将进一步研究 Tye 与分布式应用程序运行时 Dapr 如何碰撞出更精彩的火花。巧了&#xff0c;巧了&#xff0c;真是巧了 今天正值 dapr 1.0 发布的日子。如果你暂时还不了解什么是 dapr。那不如通过以下简短…

BeetleX.WebFamily针对Web SPA应用的改进

BeetleX.WebFamily1.0在集成vueelementaxios的基础上添加应用页、窗体布局和登陆验证等功能。通过以上功能开发Web SPA应用时只需要编写vue控件和配置菜单即可实现应用开发。使用创建一个.net控制台项目&#xff0c;然后通过Nuget引入BeetleX.WebFamily1.0组件&#xff0c;并在…

php acl rbac,建站常用的用户权限管理模型ACL和RBAC的区别

常用的权限管理模型ACL和RBAC的区别1.ACLACL是最早也是最基本的一种访问控制机制&#xff0c;它的原理非常简单&#xff1a;每一项资源&#xff0c;都配有一个列表&#xff0c;这个列表记录的就是哪些用户可以对这项资源执行CRUD中的那些操作。当系统试图访问这项资源时&#x…

华为年终奖,小员工分百万!任正非:钱给多了,不是人才也变成了人才!

华为今年又提前发了巨额年终奖&#xff0c;并公布了新的奖金方案&#xff0c;23级奖金额有近百万&#xff0c;并且宣称“上不封顶、绝不拖欠”&#xff0c;一时间引起热议。任正非签发的内部文件&#xff1a;华为不搞按资排辈&#xff0c;只要做出突出贡献&#xff0c;在新方案…

Redis缓存穿透、缓存雪崩、缓存击穿好好说说

前言 Redis是目前非常流行的缓存数据库啦&#xff0c;其中一个主要作用就是为了避免大量请求直接打到数据库&#xff0c;以此来缓解数据库服务器压力&#xff1b;用上缓存难道就高枕无忧了吗&#xff1f;no,no,no&#xff0c;没有这么完美的技术&#xff0c; 缓存穿透、缓存雪崩…

这是“我”的故事 —— 董彬

点击蓝字 关注我们作者&#xff1a;董彬校对/文章优化&#xff1a;刘轶民排版&#xff1a;Rani视频地址&#xff1a;https://www.bilibili.com/video/BV1NK4y1p7Ys与世界周旋的程序员大家好&#xff0c;我叫董彬 &#xff0c;现就职于野村信息&#xff0c; Title 是 Senior …

我用Python玩小游戏“跳一跳”,瞬间称霸了朋友圈!

“从前几天微信最新版本 6.6.1 的更新开始&#xff0c;微信小程序游戏“跳一跳”似乎在一夜之间风靡了朋友圈。它甚至比五六年前的飞机大战游戏都火爆&#xff0c;这种小游戏的火爆不仅仅是因为有魔性、有意思&#xff0c;更重要的是可以进行好友 PK&#xff01;“跳一跳”的小…