使用gRPC的.NET Core 3.0双向消息流
目录
介绍
软件描述
服务器基础结构(GrpcServerHelper)
客户基础设施(GrpcClientHelper)
GrpcServer和GrpcClient
运行示例
结论
- 下载源码 - 29.8 KB
介绍
.NET Core 3.0最重要的新功能之一(现已预发布,预计将于今年晚些时候发布)是对gRPC消息传递的支持。维基百科描述gRPC如下:
gRPC(gRPC远程过程调用)是最初在Google开发的开源远程过程调用(RPC)系统。它使用HTTP / 2进行传输,使用Protocol Buffers作为接口描述语言,并提供身份验证,双向流和流控制,阻塞或非阻塞绑定以及取消和超时等功能。它为许多语言生成跨平台的客户端和服务器绑定。最常见的使用场景包括连接微服务式架构中的服务以及将移动设备,浏览器客户端连接到后端服务。
据说gRPC的“杀手级功能”是对同步全双工流的支持。HTTP / 2协议用作传输协议。协议缓冲区用于有效的序列化。
如上所述,.NET Core 3.0框架支持基于gRPC的通信。Visual Studio 2019提供了gRPC服务的样板代码。但是,此代码仅提供没有消息流的单向通信。该项目是当前工作的出发点。在我的代码中,我尝试为服务器和客户端选择通用代码,并将其与支持使用gRPC的.NET Core 3.0双向消息流的便捷基础结构相结合。
软件描述
基础结构项目(DLL)GrpcServerHelper和GrpcClientHelper放在Helpers文件夹中。它们可以分别由具体服务器和客户端引用和使用。假设客户端和服务器之间进行全双工gRPC消息交换,开发了辅助DLL。但是对消息结构和处理没有限制。这些功能都取决于具体的服务器和客户端。
gRPC数据和处理在具体服务器和客户端共享的proto文件communication.proto中定义。该文件为客户端到服务器和服务器到客户端消息提供了不同的类型,适当的enum和启动消息交换的CreateStreaming()函数。Visual Studio 2019从proto文件生成C#类。
服务器基础结构(GrpcServerHelper)
类GeneralGrpcService<TRequest, TResponse>为服务器端的双向流提供基础架构。该类分别与请求和响应消息类型TRequest,TResponse参数化。它的方法CreateDuplexStreaming()处理主要的例程程序,如订阅者管理,请求消息处理,响应消息生成和发送回客户端。
public async Task CreateDuplexStreaming(IAsyncStreamReader<TRequest> requestStream,IServerStreamWriter<TResponse> responseStream,ServerCallContext context)
{var httpContext = context.GetHttpContext();Logger.LogInformation($"Connection id: {httpContext.Connection.Id}");if (!await requestStream.MoveNext())return;var clientId = _messageProcessor.GetClientId(requestStream.Current);Logger.LogInformation($"{clientId} connected");var subscriber = new SubscribersModel<TResponse>{Subscriber = responseStream,Id = $"{clientId}"};_serverGrpcSubscribers.AddSubscriber(subscriber);do{if (requestStream.Current == null)continue;var resultMessage = _messageProcessor.Process(requestStream.Current);if (resultMessage == null)continue;await _serverGrpcSubscribers.BroadcastMessageAsync(resultMessage);} while (await requestStream.MoveNext());_serverGrpcSubscribers.RemoveSubscriber(subscriber);Logger.LogInformation($"{clientId} disconnected");
}
类ServerGrpcSubscribersBase<TResponse>管理订阅者(客户端),而abstract class MessageProcessorBase<TRequest, TResponse>公开用于处理请求消息和生成响应的abstract方法abstract TResponse Process(TRequest message)。为了灵活性,假设这些方法的具体实现可以处理可能的异常(如果有的话)。最后,class SubscribersModel<TResponse>提供订阅者模型以将响应消息发送回客户端。
客户基础设施(GrpcClientHelper)
唯有abstract class GrpcClientBase<TRequest, TResponse>提供的Do()方法是确保来自客户端的消息流。
public async Task Do(Channel channel, Action onConnection = null, Action onShuttingDown = null)
{using (var duplex = CreateDuplexClient(channel)){onConnection?.Invoke();var responseTask = Task.Run(async () =>{while (await duplex.ResponseStream.MoveNext(CancellationToken.None))Console.WriteLine($"{duplex.ResponseStream.Current}");});string payload;while (!string.IsNullOrEmpty(payload = MessagePayload))await duplex.RequestStream.WriteAsync(CreateMessage(payload));await duplex.RequestStream.CompleteAsync();}onShuttingDown?.Invoke();await channel.ShutdownAsync();
}
GrpcServer和GrpcClient
具体服务器GrpcServer由Visual Studio 2019创建,ASP.MVC Core模板作为gRPC项目。它实现class MessageProcessor : MessageProcessorBase<RequestMessage, ResponseMessage>和class ServerGrpcSubscribers : ServerGrpcSubscribersBase<ResponseMessage>扩展了适当的存根类GrpcServerHelper。类MessageProcessor提供客户端请求消息的必需处理,并在需要时发送响应消息。类ServerGrpcSubscribers调整订阅者管理(在我们的具体案例中,它与其祖先没有任何区别,仅用于说明目的)。类ServerGrpcSubscribers和MessageProcessor都应作为singleton添加到Startup类的方法ConfigureServices(IServiceCollection services)中的services集合中:
services.AddSingleton<ServerGrpcSubscribers>();
services.AddSingleton<MessageProcessor>();
扩展生成Messaging.MessagingBase类型的服务类DuplexService应该映射到方法Startup.Configure()中的端点,如下所示:
app.UseEndpoints(endpoints =>
{// ...endpoints.MapGrpcService<DuplexService>();
});
服务器和客户端支持加密消息(HTTPS)的交换。就此而言,服务器在其Kestrel配置中使用grpcServer.pfx文件。和客户端使用证书文件certificate.crt。这两个文件都是根据此处提供的指南安装的OpenSSL应用程序创建的。
为了使用Proto Buffer序列化,服务器和客户端共享相同的proto文件communication.proto。该文件定义了流消息服务:
service Messaging
{rpc CreateStreaming (stream RequestMessage) returns (stream ResponseMessage);
}
请求和响应消息格式以及适当的枚举器。
我没能在Visual Studio中找到一种方法将proto文件包含到服务器和客户端项目中,以确保生成适当的C#代码。所以我在GrpcServer.csproj和GrpcClient.csproj项目文件中手动执行此操作。在这些文件中,我添加了标记为<!-- PROTO: The following section was added manually -->的注释部分。
运行示例
要运行该示例,请构建整个解决方案(这也将导致从proto文件生成类)。然后用...运行GrpcServer
dotnet GrpcServer.dll
......命令及其完全启动后,继续执行一个或多个......
dotnet GrpcClient.dll
...命令。
在客户端控制台中,键入一些以Enter结尾的消息。服务器将接收和处理该消息(处理代码的位置在方法MessageProcessor.Process()中保留,可以看到适当的注释)。如果您的消息包含问号?,则服务器会向其所有当前订户广播响应消息。客户端在其控制台中输出响应。
结论
这项工作为使用gRPC程序的.NET 3.0同步双向消息流提供了基础设施。使用此基础结构可将具体服务器和客户端的代码减少到几行代码。
原文地址:https://www.codeproject.com/Articles/5163307/Bidirectional-Messages-Streaming-with-NET-Core-3-0
使用gRPC的.NET Core 3.0双向消息流相关推荐
- ASP.NET Core 3.0 gRPC 双向流
目录 ASP.NET Core 3.0 使用gRPC ASP.NET Core 3.0 gRPC 双向流 ASP.NET Core 3.0 gRPC 认证授权 一.前言 在前一文 < 二. 什么 ...
- .NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端
.NET Core ❤ gRPC 千呼万唤的 .NET Core 3.0 终于在 9 月份正式发布,在它的众多新特性中,除了性能得到了大大提高,比较受关注的应该是 ASP.NET Core 3.0 对 ...
- ASP.NET Core 3.0 使用gRPC
一.简介 gRPC 是一个由Google开源的,跨语言的,高性能的远程过程调用(RPC)框架.gRPC使客户端和服务端应用程序可以透明地进行通信,并简化了连接系统的构建.它使用HTTP/2作为通信协议 ...
- asp.net core 3.0 gRPC框架小试
什么是gRPC gRPC是google开源的一个高性能.跨语言的RPC框架,基于HTTP2协议,采用ProtoBuf 定义的IDL. gRPC 的主要优点是: 现代高性能轻量级 RPC 框架. 协定优 ...
- ASP.NET Core 3.0 上的gRPC服务模板初体验(多图)
早就听说ASP.NET Core 3.0中引入了gRPC的服务模板,正好趁着家里电脑刚做了新系统,然后装了VS2019的功夫来体验一把.同时记录体验的过程.如果你也想按照本文的步骤体验的话,那你得先安 ...
- java grpc 服务路由_.NET Core 3.0 Preview 3中关于ASP.NET Core的更新内容
原标题:.NET Core 3.0 Preview 3中关于ASP.NET Core的更新内容 英文:devblogs.microsoft.com 来源:艾心 译文:cnblogs.com/ediso ...
- .Net Core 3.0 gRPC部署问题解决
.Net Core 3.0 gRPC部署问题解决 参考文章: (1).Net Core 3.0 gRPC部署问题解决 (2)https://www.cnblogs.com/hulizhong/p/11 ...
- ASP.NET Core 3.0 gRPC 身份认证和授权
一.开头聊骚 本文算是对于 ASP.NET Core 3.0 gRPC 研究性学习的最后一篇了,以后在实际使用中,可能会发一些经验之文.本文主要讲 ASP.NET Core 本身的认证授权和gRPC接 ...
- net core 3.0 之Grpc新特性小试牛刀
作者: 相信微服务大家伙都有听说和知道,好处弊端咱也不多说了,Grpc算是一个比较全面的微服务框架,也得到微软的支持 总结下来就是,跨平台,可靠,通信快,扩展性强,网络消耗小,模板多语言通用 光说好处 ...
最新文章
- LVS原理详解(3种工作方式8种调度算法)--老男孩
- 最新!中国内地大学ESI排名出炉:362所高校上榜,南方科技大学、深圳大学、暨南大学表现出色!...
- SAP PP COR3不能看工单后续的备料TO单号?
- leetcode 10 Regular Expression Matching
- vccode运行调试python_VSCODE安装以及使用Python运行调试代码的简单记录
- 第十二届蓝桥杯省赛A组砝码称重Java解题思路及代码
- 利用Xcode在Mac写第一个C++ project
- 栈帧与操作数栈剖析及符号引用与直接引用的转换
- Mtlab之图形标注
- 大数据:技术与应用实践指南(中国工程院院士倪光南倾情作序,雷万云、毛新生、段永朝、安晖联合力荐)
- Windows下搭建FTP服务,FileZilla Server
- 3Dmax哪个版本最好用?3dmax哪个版本稳定一点?
- 河套学院2018级计算机一级考试,河套学院2018-2019学年本科生就业率
- 洛谷P3966 [TJOI2013]单词 题解
- 读《费曼学习法》有感
- mysql错误1197,【MySQL故障处理】 Seconds_Behind_Master= NULL Error_code: 1197
- Java程序员跳槽之旅,离开京东,14面面试回顾和一点感想
- 微信小程序设置解锁密码
- jedis实现订阅发布-publish/subscribe
- 破解360doc个人图书馆网站的右键、复制方法