浅谈.NET 6 中 gRPC 的最新功能
gRPC?是一個現代的、跨平臺的、高性能的 RPC 框架。gRPC 是構建在 ASP.NET Core 之上,也是我們推薦的使用 .NET 構建 RPC 服務的方法。
.NET 6 進一步提高了 gRPC 已經非常出色的性能,并添加了一系列新功能,使 gRPC 在現代云原生應用程序中比以往任何時候都更好。在這篇文章中,我將描述這些新功能以及我們如何通過第一個支持端到端 HTTP/3 的 gRPC 實現引領行業。
gPRC?客戶端負載均衡
客戶端負載平衡是一項允許 gRPC 客戶端在可用服務器之間優化分配負載的功能??蛻舳素撦d平衡可以消除對負載平衡代理的需要。這有幾個好處:
改進的性能。無代理意味著消除額外的網絡躍點并減少延遲,因為 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" });
更多信息,請參閱?gPRC?客戶端負載平衡。
gPRC?
https://docs.microsoft.com/aspnet/core/grpc/
gPRC 客戶端負載平衡:
https://docs.microsoft.com/aspnet/core/grpc/loadbalancing
帶有重試的瞬間故障處理
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
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();}Method? | .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
gPRC?下載速度
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
HTTP/3?支持
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 在該領域處于領先地位。
.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
總結
性能是 .NET 和 gRPC 的一個特性,而 .NET 6 比以往任何時候都快??蛻舳素撦d平衡和 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
?.NET 上的 gRPC參考文檔
總結
以上是生活随笔為你收集整理的浅谈.NET 6 中 gRPC 的最新功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 路遥工具箱全面迁移至 .NET 6.0
- 下一篇: .NET Conf 2021 回顾