Asp.Net Core Grpc使用C#对象取代Proto定义
2021-01-14 14:11
标签:config 需求 etc 建立连接 ann bytes 传输 发送 完美 Asp.Net Core 3.0之后,对Grpc提供了高集成度的支持,对于需要连续传输大批量对象数据的应用场景而言,等于多了一条高铁线路。如果没有Grpc,连续传输大批量对象数据是一个很纠结的问题。用TCP的话,可以达到最高速度,但是传输过程的断线续传,对象数据的序列化和反序列化都要自己处理,开发效率低效。用HTTP的话,要频繁调用POST,反复建立连接,传输性能差。Grpc能够一次建立传输通道,多次传输对象数据,自动序列化和反序列化,并且采用ProtoBuf协议序列化对象数据,压缩率接近二进制byte数组,实现了TCP的性能优势和HTTP POST的使用方便性的完美结合。 但是Asp.Net Core使用proto文件定义传输对象比较费事,对于已经存在的Asp.Net Core Web项目,已经定义了很多DTO类,服务端和客户端还有其他数据传输方式,例如MQTT,HTTP等等,为了Grpc重新写一大堆代码,非常麻烦。所以决定寻找能够复用C#对象的Grpc解决方案。最终找到了这篇文章,使用protobuf-net.Grpc.AspNetCore解决了我的需求,非常感谢作者ElderJames。 https://www.cnblogs.com/ElderJames/p/code-first-generate-gRPC-services-and-clients-in-dotnet-core-3_0.html 《_NET Core 3.0中用 Code-First 方式创建 gRPC 服务与客户端 - Elder_James - 博客园.html》 决定写了一个Demo做练习。实现的需求是,客户端连续发送带有byte数组的对象到服务端,服务端保存对象,服务端会返回保存成功标志,客户端可以根据服务器的响应动态改变发送内容。 新建Net Standar类库GrpcShare,NuGet安装库 定义DTO对象,服务类接口 新建Asp.net Core Web Api项目GrpcDemo,NuGet安装库 Program定义Grpc服务端口 Startup添加Grpc服务和路由 实现服务类UploadService 新建Net Core控制台项目UploadClient,NuGet安装库 简单测试很容易 在实现双向流式,交互式传输时,遇到一个问题,客户端如果需要根据服务端的响应,动态调整发送内容,该怎么办呢?客户端发送的参数是一个IAsyncEnumerable函数,它怎么把服务端响应作为参数再输入进入? await foreach (var reply in client.Upload(SendPackage())) 我没有找到现成的例子,从ElderJames的例子受到启发,把服务端响应放到一个Queue中,客户端定期读取队列,算是勉强解决了这个问题。当然还有其他很多办法,例如收到服务端响应发布一个消息事件,在事件处理函数中修改客户端发送内容等。但是总觉得不够简便。 这个DEMO的代码地址: https://github.com/woodsun2018/AspNetCoreGrpcDemo Asp.Net Core Grpc使用C#对象取代Proto定义 标签:config 需求 etc 建立连接 ann bytes 传输 发送 完美 原文地址:https://www.cnblogs.com/sunnytrudeau/p/12260568.html ///
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder
.ConfigureKestrel(options =>
{
options.ListenLocalhost(9988, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http2;
});
})
.UseStartup
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
//添加Grpc服务
services.AddCodeFirstGrpc();
}
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
//添加Grpc路由
endpoints.MapGrpcService
///
//如果服务端没有加密传输,客户端必须设置
GrpcClientFactory.AllowUnencryptedHttp2 = true;
using var http = GrpcChannel.ForAddress("http://localhost:9988");
var client = http.CreateGrpcService
//流式上传数据包
await foreach (var reply in client.Upload(SendPackage()))
{
//收到服务端回应后,丢到FIFO
replyQueue.Enqueue(reply);
}
private static async IAsyncEnumerable
下一篇:C# 正则表达式大全
文章标题:Asp.Net Core Grpc使用C#对象取代Proto定义
文章链接:http://soscw.com/index.php/essay/41807.html