IT干货   IT源码网   IT序号网   ITGUEST

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

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

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

gPRC 客户端负载均衡

客户端负载平衡是一项允许 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" });

带有重试的瞬间故障处理

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 }}

});

Protobuf 性能

关于.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();

}

 

posted @   net工程师  阅读(199)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示