.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,一经查实,立即删除!

相关文章

这,像极了爱情!

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

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

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

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…

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

全世界只有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…

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

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

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

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

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

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

女生:???

1 快速打个漂亮的领带&#xff0c;男生快来get√2 站住&#xff01;把小鱼干留下再走&#xff01;3 被狗子秀了一脸4 女生&#xff1a;&#xff1f;&#xff1f;&#xff1f;5 夏天的你vs冬天的你6 地球最濒危的兔种&#xff1a;Columbia Basin Pygmy Rabbit 7 你看 我们女孩子…

JAVA类思维_面向对象思维 Java中的类和对象及其应用

一、面向过程与面向对象面向过程: 从事务执行者的角度思考问题,我该干什么 重点在过程----事务流程面向对象: 从事务的指挥者角度思考问题,我应该找谁干什么 重点在对象面向对象的优点:1.将复杂问题简单化2.从事务的执行者转化为事物的指挥者3.更贴近人的思维(懒人思想)二、类…

这部纪录片央视发力了,每一帧都可以当壁纸,BBC也无法超越

全世界只有3.14 % 的人关注了爆炸吧知识地球上已知的植物有三十多万种&#xff0c;其中十分之一生长在中国。这些植物不仅为中国带来福祉&#xff0c;还不断迁徙到世界各地。在人类的不懈努力下&#xff0c;它们又获得了新的姿态&#xff0c;为不同的文明带来不一样的色彩。《影…

解答网友提问 | 使用VS2022快速生成React/Angular/Vue.js + Web API前后端集成项目

前言上次发表了《一键生成Vue.js Web API前后端集成项目》后&#xff0c;有多位网友来问&#xff0c;有不有其他的前后端集成模板&#xff1a;实际上&#xff0c;VS2022没有提供前后端集成项目模板。但是&#xff0c;使用VS2022&#xff0c;同样可以轻松实现React/Angular/Vue…

地球上最快的速度......

1 新手司机的车能多不靠谱&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 &#xff1f;&#xff1f;&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 哈哈哈哈&#xff0c;实在是太像了▼4 狗子&#xff1a;飞来横祸&#xff08;素材来源网…

Android之二维码扫描的总结

第一步:导入zxing.jar包 第二步:项目中导入相关的类 关键代码: package com.example.qr_codescan; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; import android.view.View; impor…

豆瓣评分9.4分!这部大片你不应该错过,每一秒都是不敢看的残忍!

全世界只有3.14 % 的人关注了爆炸吧知识人类占据了地球上绝大多数宜居的地方&#xff0c;我们面对着温柔的地球母亲&#xff0c;但对野生动物们来说&#xff0c;地球却是一个水深火热的星球。你觉得你已经一无所有了&#xff0c;你觉得生活的负荷已经让你难以前进了&#xff1b…

Dapr云原生应用开发系列7:工作流集成

题记&#xff1a;这篇介绍一个很有意思的东西&#xff0c;Dapr和Logic Apps这样的工作流引擎集成。Dapr工作流在1年多前&#xff0c;Dapr的孵化团队搞了一个很有意思的东西&#xff1a;把Dapr和Logic Apps集成起来&#xff0c;实现Dapr内置的工作流引擎。官方文档&#xff1a;h…

项目如何从 SVN 迁移到 Git

为什么80%的码农都做不了架构师&#xff1f;>>> #0 系列目录# 版本管理SVN版本管理&#xff1a;场景命令实战SVN版本管理&#xff1a;两种开发模式GIT版本管理&#xff1a;场景命令实战GIT版本管理&#xff1a;Git Flow模型项目如何从 SVN 迁移到 Git很多有点历史的…

这7个数学问题,10个人里面竟然只有3人能答对!看完发现大神竟是我自己......

全世界只有3.14 % 的人关注了爆炸吧知识今天超模君要问模友们几个问题看看谁才是真正的数学粉丝接受挑战吧1他喜欢抬杠、烫发、搞物理但他是个好数学家他是&#xff1f;点击图片查看答案2他说牛顿抄他的作业两个人因为微积分吵了一辈子他是&#xff1f;点击图片查看答案3传说他…

Android之不需要自定义View(ViewfindView.java)最简单的二维码扫描

不废话,先爆照 第一步: 看下我项目里面的类结构 第二步: 给项目添加zxing.jar包 add as library

python多进程间通信_python多进程间通信代码实例

python多进程间通信代码实例这篇文章主要介绍了python多进程间通信代码实例,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下这里使用pipe代码如下&#xff1a;import timefrom multiprocessing import Processim…