浅谈.NET 6 中 gRPC 的最新功能

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

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

8f75eb2bb9680a0300cfc1cb064a3589.png

gPRC 客户端负载均衡

acc405cdd9a324ca4def9f7c0929ed0f.png

客户端负载平衡是一项允许 gRPC 客户端在可用服务器之间优化分配负载的功能。客户端负载平衡可以消除对负载平衡代理的需要。这有几个好处:

  • 改进的性能。无代理意味着消除额外的网络跃点并减少延迟,因为 RPC 直接发送到 gRPC 服务器。

  • 有效利用服务器资源。负载平衡代理必须解析然后重新发送通过它发送的每个 HTTP 请求。删除代理可以节省 CPU 和内存资源。

  • 更简单的应用程序架构。必须正确设置和配置代理服务器。没有代理服务器意味着更少的活动部件!

客户端负载均衡是在创建通道时配置的。使用负载均衡时要考虑的两个组件:

  • 解析器,解析通道的地址。解析器支持从外部源获取地址。这也称为服务发现。

  • 负载均衡器,它创建连接并选择 gRPC 调用将使用的地址。

以下代码示例将通道配置为使用具有循环负载平衡的 DNS 服务发现:

var channel = GrpcChannel.ForAddress(

    "dns:///my-example-host",

    newGrpcChannelOptions

    {

        Credentials = ChannelCredentials.Insecure,

        ServiceConfig = newServiceConfig { LoadBalancingConfigs = { newRoundRobinConfig() } }

    });

var client = newGreet.GreeterClient(channel);

var response = await client.SayHelloAsync(newHelloRequest { Name = "world" });

a7883665ca55e25327e0516de1721240.gif

更多信息,请参阅 gPRC 客户端负载平衡

  • gPRC 

    https://docs.microsoft.com/aspnet/core/grpc/

  • gPRC 客户端负载平衡:

    https://docs.microsoft.com/aspnet/core/grpc/loadbalancing

f2ee130244286341785d494031b309f3.png

带有重试的瞬间故障处理

b47c1e6393f7d7db074608ed05dc8597.png

gRPC 调用可能会被瞬时故障中断。瞬态故障包括:

  • 网络连接暂时中断。

  • 服务暂时不可用。

  • 由于服务器负载超时。

当 gRPC 调用被中断时,客户端会抛出一个包含错误详细信息的 RpcException。客户端应用程序必须捕获异常并选择如何处理错误。

var client =newGreeter.GreeterClient(channel);
try
{
var response =await client.SayHelloAsync(
newHelloRequest{Name=".NET"});
Console.WriteLine("From server: "+ response.Message);
}
catch(RpcException ex)
{
// Write logic to inspect the error and retry
// if the error is from a transient fault.

}

在整个应用程序中复制重试逻辑是冗长且容易出错的。幸运的是,.NET gRPC 客户端现在内置了对自动重试的支持。重试在通道上集中配置,并且有许多选项可用于使用 RetryPolicy 自定义重试行为。

var defaultMethodConfig =newMethodConfig
{
Names={MethodName.Default},
RetryPolicy=newRetryPolicy
{
MaxAttempts=5,
InitialBackoff=TimeSpan.FromSeconds(1),
MaxBackoff=TimeSpan.FromSeconds(5),
BackoffMultiplier=1.5,
RetryableStatusCodes={StatusCode.Unavailable}
}
};
// Clients created with this channel will automatically retry failed calls.
var channel =GrpcChannel.ForAddress("https://localhost:5001",newGrpcChannelOptions
{
ServiceConfig=newServiceConfig{MethodConfigs={ defaultMethodConfig }}
});
有关更多信息,请参阅使用 gRPC 重试进行瞬态故障处理。
  • 使用 gPRC 重试进行瞬态故障处理:

    https://docs.microsoft.com/aspnet/core/grpc/retries

2a63ede80ee798ad02a3decccb7295c5.png

Protobuf 性能

1eb299e003778a73e1f4864043fd17ba.png

关于.NET 的 gRPC 使用 Google.Protobuf 包作为消息的默认序列化程序。Protobuf 是一种高效的二进制序列化格式。Google.Protobuf 旨在提高性能,使用代码生成而不是反射来序列化 .NET 对象。在 .NET 5 中,我们与 Protobuf 团队合作,为序列化程序添加了对现代内存 API(例如 Span<T>、ReadOnlySequence<T>和IBufferWriter<T>)的支持。.NET 6 中的改进优化了一个已经很快的序列化程序。 

protocolbuffers/protobuf#8147添加了矢量化字符串序列化。SIMD 指令允许并行处理多个字符,从而在序列化某些字符串值时显着提高性能。

privatestring _value =newstring(' ',10080);
privatebyte[] _outputBuffer =newbyte[10080];
[Benchmark]
publicvoidWriteString()
{
var span =newSpan<byte>(_outputBuffer);
WriteContext.Initialize(ref span,outWriteContext ctx);
ctx.WriteString(_value);
ctx.Flush();
}

Method 

Google

.Protobuf

Mean

Ratio

Allocated

WriteString

3.14

8.838  us

1.00

0 B

WriteString

3.18 

2.919 ns

0.33

0 B

protocolbuffers/protobuf#7645添加了一个用于创建 ByteString 实例的新 API。如果你知道底层数据不会改变,那么使用 UnsafeByteOperations.UnsafeWrap 来创建一个 ByteString 而不复制底层数据。如果应用程序处理大字节有效负载并且您想降低垃圾收集频率,这将非常有用。

  • protocolbuffers/protobuf#7645:

    https://github.com/protocolbuffers/protobuf/pull/7645

06caa0854694d9c0b8fda60d86208ad7.png

gPRC 下载速度

65a42c4446005a22414e34ef51fcf7f9.png

gRPC 用户报告有时下载速度变慢。我们的调查发现,当客户端和服务器之间存在延迟时,HTTP/2 流量控制会限制下载。服务器在客户端可以耗尽之前填充接收缓冲区窗口,导致服务器暂停发送数据。gRPC 消息以开始/停止突发方式下载。

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

privateGrpcChannel _channel =GrpcChannel.ForAddress(...);
privateDownloadClient _client =newDownloadClient(_channel);
[Benchmark]
publicTaskGrpcLargeDownload()=>

    _client.DownloadLargeMessageAsync(newEmptyMessage());

Method

Runtime

Mean

Ratio

GrpcLargeDownload

.NET 5.0

6.33 s

1.00

GrpcLargeDownload

.NET 6.0

1.65 s

0.26

  • dotnet/runtime#54755

    https://github.com/dotnet/runtime/pull/54755


22d9b8a2b407b90097b2105c371df6b5.png

HTTP/3 支持

0e762cda364beeea1599f031be433fac.png

NET 上的 gRPC 现在支持 HTTP/3。gRPC 建立在 .NET 6 中添加到 ASP.NET Core 和 HttpClient 的 HTTP/3 支持之上。有关更多信息,请参阅.NET 6 中的 HTTP/3支持。

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

63c5c602d7a88833c369fd6d5a4e7d8e.png

  • .NET 6 中的 HTTP/3 :

    https://devblogs.microsoft.com/dotnet/http-3-support-in-dotnet-6/

  • gRFC:

    https://github.com/grpc/proposal/pull/256

  • 开发人员社区高度要求的功能:

    https://github.com/grpc/grpc/issues/19126

总结

7d5983dc7819657b259ca6a2db56f49e.png

1de3d9ea46093472ce7a1dc32470cb08.gif

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

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

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

  • 构建更环保的云原生应用程序 :

    https://docs.microsoft.com/aspnet/core/tutorials/grpc/grpc-start

  • dotnet:

    https://github.com/dotnet

  • grpc:

    https://github.com/grpc

c6b6fa28c5c7792822bc1e8c392644cd.png

5c7154b01af09cc54acfc02720094817.gif

 .NET 上的 gRPC参考文档

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

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

相关文章

如果你没有时间读书,至少要保留这个习惯

全世界只有3.14 % 的人关注了爆炸吧知识快节奏的生活中&#xff0c;如何花费少量的时间&#xff0c;就可以让自己的生活发生好的改变&#xff1f;知乎上有一个高赞回答&#xff1a;大量阅读优质文章。见识决定了你的眼界&#xff0c;站得越高&#xff0c;看得越多&#xff0c;你…

C++ 标准模板库

转载于:https://www.cnblogs.com/Flyzhcong/p/3977865.html

.NET Conf 2021 回顾

.NET Conf 2021是有史以来规模最大的.NET Conf,全球演讲者举办了80多场会议!我们非常感谢所有收看直播、在分享会上的提问、参与我们的乐趣和游戏的人。学习将持续到1月底&#xff0c;社区活动将持续进行&#xff0c;所以一定要查看这些活动&#xff0c;并关注我们的会议 GitHu…

男厕改女厕能多敷衍......

1 搓澡时最好不要闲聊&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 弟弟需要充电多久才能回家&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 这都什么野史&#xff1f;▼4 脚崴了怎么办&#xff1f;▼5 钥匙在老地方▼6 被红绿灯伤透…

《Single Image Haze Removal Using Dark Channel Prior》一文中图像去雾算法的原理、实现、效果(速度可实时)...

最新的效果见 &#xff1a;http://video.sina.com.cn/v/b/124538950-1254492273.html 可处理视频的示例&#xff1a;视频去雾效果 在图像去雾这个领域&#xff0c;几乎没有人不知道《Single Image Haze Removal Using Dark Channel Prior》这篇文章&#xff0c;该文是2009年C…

python 运算符重载_Python3面向对象-运算符重载

1&#xff1a;运算符重载介绍运算符重载&#xff0c;就是在某个类的方法中&#xff0c;拦截其内置的操作(比如&#xff1a;&#xff0c;-&#xff0c;*&#xff0c;/,比较&#xff0c;属性访问&#xff0c;等等)&#xff0c;使其实例的行为接近内置类型。当类的实例出现在内置操…

docker Failed to get D-Bus connection 报错

在centos7的容器里面出现了一个BUG&#xff0c;就是serveice启动服务的时候出现报错&#xff0c;不能用service启动服务。[roote13c3d3802d0 /]# service httpd startRedirecting to /bin/systemctl start httpd.serviceFailed to get D-Bus connection: Operation not permit…

牛顿法、拟牛顿法、高斯-牛顿法、共轭梯度法推导总结

原文&#xff1a;http://ihoge.cn/2018/newton1.html 前言&#xff1a; 线性最小二乘问题&#xff0c;我们可以通过理论推导可以得到其解析解&#xff0c;但是对于非线性最小二乘问题&#xff0c;则需要依赖迭代优化的方法&#xff0c;牛顿算法是解决非线性最优的常见算法之一…

不用变量交换2个值

题目: 不使用变量交换2个值 代码如下: #include <iostream> using namespace std;int main() { int a = 3;int b = 4;cout<<"a="<<a<<endl;cout<<"b="<<b<<endl;a = a ^ b;b = a ^ b;a = a ^ b;cout<&…

基于事件驱动架构构建微服务第16部分:Azure Active Directory B2C

原文链接: https://logcorner.com/building-micro-services-through-event-driven-architecture-part16-azure-active-directory-b2c/在本教程中&#xff0c;我将展示如何通过使用Azure AD B2C启用Oauth2和OpenId Connect来保护微服务。Azure Active Directory B2C将B2C身份认证…

java 栈和队列实现迷宫代码_LeetCode每日一题--剑指 Offer 09. 用两个栈实现队列(Java)

DailyChallenge剑指 Offer 09. 用两个栈实现队列Easy20200630Description用两个栈实现一个队列。队列的声明如下&#xff0c;请实现它的两个函数 appendTail 和 deleteHead &#xff0c;分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素&#xff0c;d…

提升方法之AdaBoost算法

提升方法之AdaBoost算法 作为非数学专业出身看到密密麻麻的数学公式刚开始真的是非常头疼。算法的物理逻辑的时候尚能理解&#xff0c;但是涉及到具体的数学公式实现就开始懵逼了&#xff1a;为什么要用这个公式&#xff0c;这个公式是怎么推到的&#xff0c;这个公式达到什么…

C# 开源一个基于 yarp 的 API 网关 Demo,支持绑定 Kubernetes Service

关于 Neting刚开始的时候是打算使用微软官方的 Yarp 库&#xff0c;实现一个 API 网关。目前写完了查看 Kubernetes Service 信息、创建 Route 和 Cluster 和绑定 Kubernetes Service。简单来说&#xff0c;就是完成了基础部分&#xff0c;配置路由和后端服务绑定&#xff0c;如…

CCR源码分析-CCR架构

CCR&#xff0c;并发与协调运行时(Concurrency and Coordination Runtime)。从名字里我们就可以知道&#xff0c;这个东东是用来简化并发程序设计的。为何要并发呢&#xff1f;因为我们有多个任务需要处理&#xff0c;如果能同时做就会充分利用硬 件而减少处理的时间。自然的&a…

量子力学到底有多难?他用700多幅漫画,让孩子秒懂这个神奇世界!

▲ 点击查看很多朋友应该都看过Facebook创始人扎克伯格给他的女儿讲量子力学的那张照片。扎克伯格在清华大学经济管理学院做演讲时&#xff0c;曾谈到&#xff1a;学习量子力学改变了他的思维方式。到底什么是量子力学&#xff1f;我们生活面对的物质尺度大约是厘米级到千米级之…

Openssl搭建私有CA认证

概述CA英文全称Certification Authority&#xff0c;即数字证书认机构。从广义上来说&#xff0c;CA是负责发放和管理数字证书的权威机构&#xff0c;并作为用户数字认证中受信任的第三方&#xff0c;承担公钥体系&#xff08;PKI&#xff09;中公钥的合法性检验的责任&#xf…

提升树算法总结(一)

本文是综合了之前的以往多个笔记汇总而成&#xff0c;内容较长。感兴趣的建议收藏用到时随时翻阅内容包含&#xff1a; 若有遗漏错误之处请反馈修改&#xff0c;感激不尽 一、Boosting基本概念 二、前向分步加法模型1. 加法模型2. 前向分步算法 三、AdaBoost1. 算法解析2. 模…

Android之Launcher分析和修改4——初始化加载数据

上面一篇文章说了Launcher是如何被启动的&#xff0c;Launcher启动的过程主要是加载界面数据然后显示出来&#xff0c; 界面数据都是系统APP有关的数据&#xff0c;都是从Launcher的数据库读取&#xff0c;下面我们详细分析Launcher如何加载数据。 在Launcher.java的onCreate()…

图像处理技术之分辨率与压缩

一 图像分辨率数码图像有两大类&#xff0c;一类是矢量图&#xff0c;也叫向量图&#xff1b;另一类是点阵图&#xff0c;也叫位图。矢量图比较简单&#xff0c;它是由大量数学方程式创建的&#xff0c;其图形是由线条和填充颜色的块面构成的&#xff0c;而不是由像素组成的&am…