.NET 6 中 gRPC 的新功能

de1c11f1aa61df24e739c8e4b220008f.png

gRPC是一个现代的、跨平台的、高性能的 RPC 框架。gRPC for .NET 构建在 ASP.NET Core 之上,是我们推荐的在 .NET 中构建 RPC 服务的方法。

.NET 6 进一步提高了 gRPC 已经非常出色的性能,并添加了一系列新功能,使 gRPC 在现代云原生应用程序中比以往任何时候都更好。在这篇文章中,我将描述这些新功能, 以及我们如何通过第一个支持端到端 HTTP/3 的 gRPC 实现引领行业。

gRPC 客户端负载均衡

客户端负载均衡功能允许 gRPC 客户端以最佳方式在可用服务器之间分配负载, 这样就不需要使用专门的负载均衡代理服务器, 这有几个好处:

•性能改进, 无代理可以减少网络延迟, 因为 RPC 直接发送到 gRPC 服务器, 无需中转。
•节省服务器资源,负载平衡代理必须解析然后重新发送每个 HTTP 请求, 本身也会占用 CPU 和内存, 所以移除代理可以节省服务器资源。
•更简单的程序架构, gRPC 负载均衡代理需要安装, 配置才能正常工作, 而使用客户端负载均衡, 客户端直接发送到服务端, 程序的架构也很简单。

如果要使用客户端负载均衡, 需要在创建 channel 的时候进行配置, 另外使用负载均衡时要考虑两个组件

•resolver 解析器, 它可以从创建的 channel 中返回服务地址, 并且支持从外部源获取地址, 其实这就是我们熟悉的服务发现。
•load balancer 负载均衡器, 当调用 gRPC 的时候, 它会根据配置的负载均衡的策略, 返回响应的服务地址, 并创建连接。

下面的代码中, 给 GrpcChannel 配置了 DNS 服务发现和轮询的负载均衡策略。

var channel = GrpcChannel.ForAddress(    "dns:///my-example-host",    new GrpcChannelOptions    {        Credentials = ChannelCredentials.Insecure,        ServiceConfig = new ServiceConfig { LoadBalancingConfigs = { new RoundRobinConfig() } }    });var client = new Greet.GreeterClient(channel);var response = await client.SayHelloAsync(new HelloRequest { Name = "world" });
9f5491a0936eace4f24b86422a7b673d.gif

有关更多信息,请参考 gRPC 客户端负载平衡[1]

瞬时故障的处理和重试

gRPC 调用过程中可能会遇到瞬时故障而中断,瞬时故障包括:

•网络连接暂时中断。•服务暂时不可用。•服务器响应超时。

当 gRPC 调用中断时,客户端会抛出 RpcException 有关错误的详细信息,客户端应用程序需要捕获异常并选择如何处理错误,如下

var client = new Greeter.GreeterClient(channel);try{    var response = await client.SayHelloAsync(        new HelloRequest { Name = ".NET" });    Console.WriteLine("From server: " + response.Message);}catch (RpcException ex){    // 这里记录错误并重试}

在您的程序中, 你可能需要在很多地方写这样的处理代码, 幸运的是,.NET gRPC 客户端现在内置了对自动重试的支持, 只需要在 channel 上统一配置即可, 并且支持几种不同的重试策略。

var defaultMethodConfig = new MethodConfig{    Names = { MethodName.Default },    RetryPolicy = new RetryPolicy    {        MaxAttempts = 5,        InitialBackoff = TimeSpan.FromSeconds(1),        MaxBackoff = TimeSpan.FromSeconds(5),        BackoffMultiplier = 1.5,        RetryableStatusCodes = { StatusCode.Unavailable }    }};// 发生错误时可以自动重试var channel = GrpcChannel.ForAddress("https://localhost:5001", new GrpcChannelOptions{    ServiceConfig = new ServiceConfig { MethodConfigs = { defaultMethodConfig } }});

有关更多信息,请参阅使用 gRPC 重试进行瞬态故障处理[2]

Protobuf 性能

gRPC for .NET 使用 Google.Protobuf 库作为消息的默认序列化程序。Protobuf 是一种高效的二进制序列化格式。Google.Protobuf 旨在提高性能,使用代码生成而不是反射来序列化 .NET 对象。在.NET 5,我们和 Protobuf 团队合作并支持了内存API的序列化, 包括 Span<T>, ReadOnlySequence<T>, IBufferWriter<T> , 在.NET 6, 序列化的性能得到进一步的优化和提升。

protocolbuffers/protobuf#8147[3] 支持了矢量化字符串的序列化。SIMD 指令允许并行处理多个字符,从而在序列化某些字符串值时显著提高性能。

private string _value = new string(' ', 10080);private byte[] _outputBuffer = new byte[10080];[Benchmark]public void WriteString(){    var span = new Span<byte>(_outputBuffer);    WriteContext.Initialize(ref span, out WriteContext ctx);    ctx.WriteString(_value);    ctx.Flush();}
MethodGoogle.ProtobufMeanRatioAllocated
WriteString3.148.838 us1.000 B
WriteString3.182.919 ns0.330 B

protocolbuffers/protobuf#7645[4] 添加了一个用于创建 ByteString 实例的新 API, UnsafeByteOperations.UnsafeWrapByteString, 如果您知道底层数据不会发生改变, 那么可以使用它创建, 这样如果应用程序处理大字节数据时并且您想降低垃圾收集的频率,这将非常有用。

var data = await File.ReadAllBytesAsync(@"c:large_file.json");// Safe but slow.var copied = ByteString.CopyFrom(data);// Unsafe but fast. Useful if you know data won't change.var wrapped = UnsafeByteOperations.UnsafeWrap(data);

gRPC 下载速度

gRPC 用户反映有时下载速度会变慢, 特别时较大的文件, 我们的调查发现,当内容大于初始的接收窗口大小时,并且客户端和服务器之间存在高延迟, 会导致网络阻塞和整体吞吐量降低。

这已在 dotnet/runtime#54755[5] 中修复。HttpClient 现在动态缩放接收缓冲区窗口。建立 HTTP/2 连接后,客户端将向服务器发送 ping 以测量延迟。如果存在高延迟,客户端会自动增加接收缓冲区窗口,从而实现快速、连续的下载。

private GrpcChannel _channel = GrpcChannel.ForAddress(...);private DownloadClient _client = new DownloadClient(_channel);[Benchmark]public Task GrpcLargeDownload() =>    _client.DownloadLargeMessageAsync(new EmptyMessage());
MethodRuntimeMeanRatio
GrpcLargeDownload.NET 5.06.33 s1.00
GrpcLargeDownload.NET 6.01.65 s0.26

HTTP/3 支持

.NET 上的 gRPC 现在支持 HTTP/3, 其中在 .NET 6 的 ASP.NET Core 和 HttpClient, 有关更多信息,请参阅 .NET 6 中的 HTTP/3 支持[6]

.NET 是第一个支持端到端 HTTP/3 的 gRPC 实现,我们已经为其他平台提交了 gRFC[7],以便将来支持 HTTP/3。带有 HTTP/3 的 gRPC 是开发人员社区高度要求的功能[8],很高兴看到 .NET 在该领域处于领先地位。

6ba181e34735660ee5926e9d1f8f3b9c.png

总结

性能是 .NET 和 gRPC 的一个重要特性,而 .NET 6 比以往任何时候都快。客户端负载均衡和 HTTP/3 等以性能为导向的新功能意味着更低的延迟、更高的吞吐量和更少的服务器。这是一个节省资金、减少能耗和构建更环保的云原生应用程序的机会。

要试用新功能并开始在 .NET 中使用 gRPC,最好的起点是在 ASP.NET Core教程中 创建 gRPC 客户端和服务器[9]

我们期待听到有关使用 gRPC 和 .NET 构建的应用程序以及您未来在dotnet和grpc 存储库中的贡献!

作者: James Newton-King 
原文: https://devblogs.microsoft.com/dotnet/grpc-in-dotnet-6/


3ce8d6372538db5a2d94ec0c23ca509c.png


相关链接

[1] gRPC 客户端负载平衡: https://docs.microsoft.com/zh-cn/aspnet/core/grpc/loadbalancing?view=aspnetcore-6.0
[2] gRPC 重试进行瞬态故障处理: https://docs.microsoft.com/zh-cn/aspnet/core/grpc/retries?view=aspnetcore-6.0
[3] protocolbuffers/protobuf#8147: https://github.com/protocolbuffers/protobuf/pull/8147
[4] protocolbuffers/protobuf#7645: https://github.com/protocolbuffers/protobuf/pull/7645
[5] dotnet/runtime#54755: https://github.com/protocolbuffers/protobuf/pull/7645
[6] .NET 6 中的 HTTP/3 支持: https://devblogs.microsoft.com/dotnet/http-3-support-in-dotnet-6/
[7] gRFC: https://github.com/grpc/proposal/pull/256
[8] 开发人员社区高度要求的功能: https://github.com/grpc/grpc/issues/19126
[9] 创建 gRPC 客户端和服务器: https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/grpc/grpc-start?view=aspnetcore-6.0&tabs=visual-studio

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

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

相关文章

视频编码H.264的应用

近日&#xff0c;数字音视频编解码技术标准&#xff08;AVS&#xff09;工作组在12月21日结束的第47次会议上公布并于明年4月份会正式推出最新的AVS2视频编码标准&#xff0c;新的编码效率比上一代标准翻了一番&#xff0c;并且在无失真音频编码上取得了突破性的进展。AVS编码标…

java捕捉音频,如何捕获在Java中的音频数据

I want to access the audio data that my microphone is recording with Java. How would I do that?My goal is to save the audio data that is recorded and simultaneously play it to the user.解决方案If you dont need any of the additional functionality in JMF, I…

saltstack的安装(转载连接)

see the link转载于:https://blog.51cto.com/358778493/1767256

java-developer 性能是怎么样的?

在项目中&#xff0c;我们都经常面临所开发的产品性能问题。然而这些问题都不是很容易解决。大多性能问题追根究底都是系统架构或者说是设计问题。推翻了重做是不可能的&#xff0c;怎么从这些问题中吸取经验教训才是正道。来看看我遇到的设计问题。 案例&#xff1a; 企业…

链表之单链表约瑟夫问题(二)

约瑟夫环(约瑟夫问题)是一个数学的应用问题:已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。通常解决这类问题时我…

这,像极了爱情!

全世界只有3.14 % 的人关注了爆炸吧知识特别的爱给特别的你古希腊数学家普罗克洛斯说过&#xff1a;“数学就是这样一种东西&#xff1a;她提醒你有无形的灵魂&#xff0c;她赋予她所发现的真理以生命&#xff1b;她唤起心神&#xff0c;澄净智慧&#xff1b;她给我们的内心思想…

使用C#为MSTest测试项目实现自定义断言

前言MSTest测试项目为我们实现了断言类Assert&#xff0c;用于报告代码行为的正确性&#xff0c;比如&#xff1a;var result Calculator.Add(1,2); Assert.AreEqual(3, result);虽然常用的断言方法已经可以工作。但是&#xff0c;我们更希望使用自定义断言&#xff0c;这样可…

mysql 调用未定义函数_php – Wierd和Annoying错误:调用未定义的函数mysql_query()[复制]...

参见英文答案 > Why shouldn’t I use mysql_* functions in PHP? 15个我已经在这一个超过一个小时了,我可以连接到我的数据库和所有(不会给出任何错误)但是当我尝试使用时我收到以下错误“的mysql_query($查询);”Call to undefined f…

window.onscroll

http://www.w3help.org/zh-cn/causes/SD9013 1.各浏览器对 document、document.body、document.documentElement 对象的 onscroll 事件支持情况 依次为 window、HTMLDivElement、document、document.body、document.documentElement 对象绑定 scroll 事件监听器&#xff0c;在触…

ZABBIX2.4.8监控 Windows Mysql数据库

2019独角兽企业重金招聘Python工程师标准>>> 系统环境&#xff1a; 操作系统&#xff1a;Windows Server 2012 ZABBIX Server&#xff1a;2.4.8 IP地址&#xff1a;192.168.0.77 模板脚本地址&#xff1a;http://pan.baidu.com/s/1eSDaiS6 ZABBIX客户端操作 1、在za…

B2B电子商务网站杂谈

B2B电子商务网站作为网络营销的交易平台, 一方面要保证功能完善, 买卖双方可以快捷、方便地进行交易。另一方面网站的宣传是挖掘潜在客户的 重要手段, 只有2 个方面都足够强大, 才能使相应B2B 电子商务网站在激烈的竞争中处于不败之地。 那么在企业网站缺乏足够资金进行宣传推广…

美国知名华人学者陈刚被捕,他出身贫寒,是一个不折不扣的工作狂

全世界只有3.14 % 的人关注了爆炸吧知识陈刚教授&#xff08;图片来源&#xff1a;MIT网站&#xff09;本文转自赛先生当地时间1月14日&#xff0c;美国司法部官网消息显示&#xff0c;美国工程院院士、麻省理工学院&#xff08;MIT&#xff09;教授陈刚因未能向美国能源部披露…

使用 CliWrap 让C#中的命令行交互举重若轻

在代码中进行命令行交互是一个很常见的场景, 特别是在一些CI CD 自动化流程中, 在这之前我们会使用 System.Diagnostics.Process API, 现在有一个更灵活的工具 CliWarp, 这是一个在 .NET 平台使用的命令行交互工具库, 通过在C# 中使用 Fluent 的API, 让命令行交互举重若轻。htt…

Java设置edittext光标,如何改变的EditText光标高度?

I want to change the EditText cursor height, does anyone know how?解决方案I had to dig far into the Android source to find the answer to this, but you essentially have to use padding on a custom shape drawable.note: only works on API 12 and greater due to…

Android之应用程序如何调用支付宝接口

http://blog.csdn.net/lilidejing/article/details/19483717 最近在做一个关于购物商城的项目&#xff0c;项目里面付款这块我选的是调用支付宝的接口&#xff0c;因为用的人比较多。 在网上搜索了以下&#xff0c;有很多这方面的教程&#xff0c;但大部分教程过于陈旧&#xf…

andriod之应用内置浏览器 webview

参考&#xff1a;http://my.eoe.cn/694183/archive/10476.html http://blog.csdn.net/it_ladeng/article/details/8136534 一.webView获取html页面中标签的方法&#xff1a; 1.在WebViewClient里的onPageFinished回调方法中执行js代码&#xff1a; view.loadUrl("javascri…

权威解读 | 人类社会正进入DT时代 如何激活生产力?

导语当前&#xff0c;DT产业正在转入“快速发育”及“应用拉动”的发展阶段。 DT时代的新范式雏形初现。从工业时代到信息时代&#xff0c;从IT时代再到DT时代&#xff0c;不只是单个点上的技术突破、模式创新&#xff0c;而是已经发生了数轮包括“基础设施生产要素支柱产业分工…

分析纯文本外链在SEO优化方面的作用

在传统的SEO优化的角度上来看&#xff0c;超文本&#xff0c;锚文本以及纯文本的外链权重是依次递减的&#xff0c;所以很多人不愿意做纯文本外链&#xff0c;认为做纯文本外链无效的&#xff0c;笔者曾经一度也是这么认为&#xff0c;但是经过笔者优化网站一段时间之后&#x…

整整26本!由单墫教授主编、葛军等人操刀的高中数学教材都在这里!

全世界只有3.14 % 的人关注了爆炸吧知识我国从20世纪50年代以来&#xff0c;中学数学教学大纲虽经历多次修订&#xff0c;但都有一个共同的指导思想&#xff0c;就是搞好三基&#xff0c;同时强调指出&#xff0c;正确理解数学概念是掌握数学基础知识的前提。而当前我国数学教学…

如何通过 C# 将桌面截屏为图片?

咨询区 Omar Abid我想通过代码获取当前的电脑屏幕并保存为一张图片&#xff0c;就好像键盘的 截屏 按钮功能&#xff0c;请问这该如何实现&#xff1f;我没有好思路。回答区 Gary Willoughby&#xff1a;如果你的程序是 framework >2.0 的话&#xff0c;完全可以使用 CopyFr…