
gRPC是一個現代的、跨平台的、高性能的 RPC 架構。gRPC for .NET 建構在 ASP.NET Core 之上,是我們推薦的在 .NET 中建構 RPC 服務的方法。
.NET 6 進一步提高了 gRPC 已經非常出色的性能,并添加了一系列新功能,使 gRPC 在現代雲原生應用程式中比以往任何時候都更好。在這篇文章中,我将描述這些新功能, 以及我們如何通過第一個支援端到端 HTTP/3 的 gRPC 實作引領行業。
用戶端負載均衡功能允許 gRPC 用戶端以最佳方式在可用伺服器之間配置設定負載, 這樣就不需要使用專門的負載均衡代理伺服器, 這有幾個好處:
性能改進, 無代理可以減少網絡延遲, 因為 RPC 直接發送到 gRPC 伺服器, 無需中轉。
節省伺服器資源,負載均衡代理必須解析然後重新發送每個 HTTP 請求, 本身也會占用 CPU 和記憶體, 是以移除代理可以節省伺服器資源。
更簡單的程式架構, gRPC 負載均衡代理需要安裝, 配置才能正常工作, 而使用用戶端負載均衡, 用戶端直接發送到服務端, 程式的架構也很簡單。
如果要使用用戶端負載均衡, 需要在建立 channel 的時候進行配置, 另外使用負載均衡時要考慮兩個元件
resolver 解析器, 它可以從建立的 channel 中傳回服務位址, 并且支援從外部源擷取位址, 其實這就是我們熟悉的服務發現。
load balancer 負載均衡器, 當調用 gRPC 的時候, 它會根據配置的負載均衡的政策, 傳回響應的服務位址, 并建立連接配接。
下面的代碼中, 給 GrpcChannel 配置了 DNS 服務發現和輪詢的負載均衡政策。
有關更多資訊,請參考 gRPC 用戶端負載均衡。
gRPC 調用過程中可能會遇到瞬時故障而中斷,瞬時故障包括:
網絡連接配接暫時中斷。
服務暫時不可用。
伺服器響應逾時。
當 gRPC 調用中斷時,用戶端會抛出 <code>RpcException</code> 有關錯誤的詳細資訊,用戶端應用程式需要捕獲異常并選擇如何處理錯誤,如下
在您的程式中, 你可能需要在很多地方寫這樣的處理代碼, 幸運的是,.NET gRPC 用戶端現在内置了對自動重試的支援, 隻需要在 channel 上統一配置即可, 并且支援幾種不同的重試政策。
有關更多資訊,請參閱使用 gRPC 重試進行瞬态故障處理。
gRPC for .NET 使用 Google.Protobuf 庫作為消息的預設序列化程式。Protobuf 是一種高效的二進制序列化格式。Google.Protobuf 旨在提高性能,使用代碼生成而不是反射來序列化 .NET 對象。在.NET 5,我們和 Protobuf 團隊合作并支援了記憶體API的序列化, 包括 <code>Span<T>, ReadOnlySequence<T>, IBufferWriter<T></code>, 在.NET 6, 序列化的性能得到進一步的優化和提升。
protocolbuffers/protobuf#8147 支援了矢量化字元串的序列化。SIMD 指令允許并行處理多個字元,進而在序列化某些字元串值時顯著提高性能。
Method
Google.Protobuf
Mean
Ratio
Allocated
WriteString
3.14
8.838 us
1.00
0 B
3.18
2.919 ns
0.33
protocolbuffers/protobuf#7645 添加了一個用于建立 <code>ByteString</code> 執行個體的新 API, <code>UnsafeByteOperations.UnsafeWrapByteString</code>, 如果您知道底層資料不會發生改變, 那麼可以使用它建立, 這樣如果應用程式處理大位元組資料時并且您想降低垃圾收集的頻率,這将非常有用。
gRPC 使用者反映有時下載下傳速度會變慢, 特别時較大的檔案, 我們的調查發現,當内容大于初始的接收視窗大小時,并且用戶端和伺服器之間存在高延遲, 會導緻網絡阻塞和整體吞吐量降低。
這已在 dotnet/runtime#54755 中修複。HttpClient 現在動态縮放接收緩沖區視窗。建立 HTTP/2 連接配接後,用戶端将向伺服器發送 ping 以測量延遲。如果存在高延遲,用戶端會自動增加接收緩沖區視窗,進而實作快速、連續的下載下傳。
Runtime
GrpcLargeDownload
.NET 5.0
6.33 s
.NET 6.0
1.65 s
0.26
.NET 上的 gRPC 現在支援 HTTP/3, 其中在 .NET 6 的 ASP.NET Core 和 HttpClient, 有關更多資訊,請參閱 .NET 6 中的 HTTP/3 支援。
.NET 是第一個支援端到端 HTTP/3 的 gRPC 實作,我們已經為其他平台送出了 gRFC,以便将來支援 HTTP/3。帶有 HTTP/3 的 gRPC 是開發人員社群高度要求的功能,很高興看到 .NET 在該領域處于領先地位。
性能是 .NET 和 gRPC 的一個重要特性,而 .NET 6 比以往任何時候都快。用戶端負載均衡和 HTTP/3 等以性能為導向的新功能意味着更低的延遲、更高的吞吐量和更少的伺服器。這是一個節省資金、減少能耗和建構更環保的雲原生應用程式的機會。
要試用新功能并開始在 .NET 中使用 gRPC,最好的起點是在 ASP.NET Core教程中 建立 gRPC 用戶端和伺服器。
我們期待聽到有關使用 gRPC 和 .NET 建構的應用程式以及您未來在dotnet和grpc 存儲庫中的貢獻!
作者: James Newton-King (.NET 首席軟體工程師)
原文: https://devblogs.microsoft.com/dotnet/grpc-in-dotnet-6/