gRPC在C#中的未来属于grpc-dotnet
作者:Jan Tattermusch
grpc-dotnet(Grpc.Net.Client[1]和Grpc.AspNetCore.Server[2]?nuget 包)現(xiàn)在是.NET/C#中推薦的 gRPC 實(shí)現(xiàn)。最初的 gRPC C#實(shí)現(xiàn)(Grpc.Core nuget 包)將進(jìn)入維護(hù)模式,不會(huì)得到任何新功能,只會(huì)收到重要的錯(cuò)誤修復(fù)和安全修復(fù)。最終的計(jì)劃是在未來的某個(gè)時(shí)候逐步完全淘汰 Grpc.Core。該公告描述了我們決定這樣做的原因,并更詳細(xì)地列出了該計(jì)劃。
2019 年 9 月,我們宣布[3]了一個(gè)新的gRPC C#實(shí)現(xiàn)[4]的普遍可用性,它不再基于 gRPC C 核心原生庫(kù),而是使用了在.NET Core 3 和 ASP.NET Core 3 中添加的 HTTP/2 協(xié)議實(shí)現(xiàn)。我們將此實(shí)現(xiàn)稱為“grpc-dotnet”。
當(dāng)我們引入 grpc-dotnet 實(shí)現(xiàn)時(shí),我們宣布 gRPC C#實(shí)現(xiàn)(新的純 C# grpc-dotnet 實(shí)現(xiàn)和基于 C 核心原生庫(kù)的最初的 gRPC C#實(shí)現(xiàn))將并存,讓用戶 選擇最適合他們的實(shí)現(xiàn)。這很有道理,因?yàn)?grpc-dotnet 當(dāng)時(shí)是全新的,并且需要一個(gè)剛剛發(fā)布的.NET Core 框架,而最初的 gRPC C#實(shí)現(xiàn)已經(jīng)穩(wěn)定了很長(zhǎng)時(shí)間,擁有很多用戶,并且甚至可以使用很老的.NET Framework 版本。事情需要一些時(shí)間才能解決。
從那時(shí)起,新的 grpc-dotnet 實(shí)現(xiàn)已經(jīng)取得了很大的進(jìn)展:它被許多用戶所采用并變得非常流行,它已經(jīng)被許多生產(chǎn)環(huán)境中的應(yīng)用程序所使用,并且還添加了許多有趣的新特性。此外,它的主要先決條件,.NET Core 3 框架已經(jīng)存在一段時(shí)間了,并且它的采用人數(shù)正在增長(zhǎng)。
同時(shí),最初的 gRPC C#實(shí)現(xiàn)[5](通常稱為“gRPC.Core”,它的 nuget 包的名字)肯定有它的位置,它是非常受歡迎的,我們現(xiàn)在正接近一個(gè)點(diǎn),在 2016 年(當(dāng) gRPC C#作為 GA 發(fā)布時(shí))的一些設(shè)計(jì)決定不再有他們過去的重量。例如,我們決定將 gRPC C#實(shí)現(xiàn)建立在一個(gè)原生庫(kù)上,因?yàn)樵?2016 年,還沒有可用的 C# HTTP/2 庫(kù)可供我們依賴。通過依賴 C 核心原生庫(kù),我們能夠更快地交付一個(gè)穩(wěn)定的、高性能的 gRPC 庫(kù),而不是從頭開始用 C#實(shí)現(xiàn)所有東西。但是從今天的角度來看,采用原生依賴已經(jīng)沒有多大意義了,因?yàn)?HTTP/2 支持已經(jīng)內(nèi)置到.NET Core 框架中。擁有原生依賴的好處正在減少,而擁有一個(gè)原生依賴的維護(hù)負(fù)擔(dān)卻保持不變。
在這兩種穩(wěn)定的 C#實(shí)現(xiàn)中,grpc-dotnet 實(shí)現(xiàn)無疑是未來潛力更大的一個(gè)。它是一個(gè)更現(xiàn)代的實(shí)現(xiàn),與.NET 的現(xiàn)代版本很好地集成在一起,而且它很可能與 C#社區(qū)在幾年后的發(fā)展方向更加一致。它也是一個(gè)純粹的 C#實(shí)現(xiàn)(沒有原生組件),這使得它對(duì)貢獻(xiàn)更加友好,帶來更好的可調(diào)試性,這也是 C#愛好者喜歡看到的東西。
因?yàn)闉?C#提供兩種官方的 gRPC 實(shí)現(xiàn)的維護(hù)成本非同小可,而且從長(zhǎng)遠(yuǎn)來看 grpc-dotnet 似乎是所有用戶的最佳選擇,我們想要宣布的計(jì)劃是逐步淘汰最初的 gRPC C#實(shí)現(xiàn)(nuget 包 gRPC.Core),以支持更現(xiàn)代和更有前瞻性的 grpc-dotnet 實(shí)現(xiàn)。
計(jì)劃的細(xì)節(jié)將在下面的部分中描述,并進(jìn)一步解釋為什么它是有意義的。為了幫助理解逐步淘汰 Grpc.Core 的后果,此外,我們還列出了一些常見問題,并提供了答案。
是什么讓 grpc-dotnet 成為首選實(shí)現(xiàn)
簡(jiǎn)單地說,grpc-dotnet 似乎是一個(gè)更好的未來賭注。一些最重要的要點(diǎn)已經(jīng)提到了。以下是我們相信 grpc-dotnet 將更好地滿足用戶需求的更詳細(xì)的原因:
這是一個(gè)更現(xiàn)代的實(shí)現(xiàn),基于.NET 框架最新版本的特性。因此,將來它可能是兩種實(shí)現(xiàn)中更可行的一種。
它更符合 C#/.NET 社區(qū)現(xiàn)在和未來的發(fā)展方向。與社區(qū)的發(fā)展方向保持一致似乎是 C#中 gRPC 未來的最佳選擇。
它的實(shí)現(xiàn)更加敏捷,貢獻(xiàn)更加友好——因?yàn)樗趦?nèi)部是基于眾所周知的原語(yǔ)/API(ASP.NET 核心服務(wù) API 和 HTTP2 客戶端),它是用純 C#實(shí)現(xiàn)的,代碼對(duì) C#開發(fā)人員更容易訪問(對(duì)只想了解事情如何工作的用戶和可能編寫 PR 的貢獻(xiàn)者)。grpc-dotnet 代碼庫(kù)相對(duì)較小,構(gòu)建只需幾秒鐘,運(yùn)行測(cè)試簡(jiǎn)單快捷。從長(zhǎng)遠(yuǎn)來看,更輕松的開發(fā)和貢獻(xiàn)友好性應(yīng)彌補(bǔ)當(dāng)今缺少的一些功能,并使其成為用戶的絕佳選擇——也就是說,降低貢獻(xiàn)和修復(fù)/改進(jìn)產(chǎn)品的障礙將轉(zhuǎn)化為更多的產(chǎn)品修復(fù),并在一段時(shí)間后改善用戶體驗(yàn)。
與依賴于原生組件的實(shí)現(xiàn)相比,使用純 C#實(shí)現(xiàn)的庫(kù)通常更受.NET 社區(qū)的歡迎。雖然 C#很好地支持與原生庫(kù)的互操作,但這是一種大多數(shù) C#開發(fā)人員不熟悉的技術(shù),對(duì)他們來說它就像一個(gè)黑盒。原生互操作很難正確實(shí)現(xiàn),而且有許多缺點(diǎn)(例如,更復(fù)雜的開發(fā)和構(gòu)建過程、復(fù)雜的調(diào)試、難以維護(hù)、難以獲得社區(qū)貢獻(xiàn)、難以為多個(gè)平臺(tái)提供支持)。使用 Grpc.Core 我們能夠克服這些挑戰(zhàn)中的大多數(shù)(所以這些天事情都很順利),但這需要大量的努力,解決方案有時(shí)是復(fù)雜和脆弱的,維護(hù)它是昂貴的,需要大量的專業(yè)知識(shí)。
注意:用于 C#的 Google.Protobuf 庫(kù)已經(jīng)完全用 C#編寫(沒有原生組件),所以有一個(gè)純粹的 gRPC C#實(shí)現(xiàn)就完全擺脫了開發(fā)者微服務(wù)棧中的原生組件。
為什么不永遠(yuǎn)保留 Grpc.Core 呢?
用 C#開發(fā) gRPC 的兩個(gè)實(shí)現(xiàn)并不是免費(fèi)的。它花費(fèi)了寶貴的資源,我們相信工程時(shí)間應(yīng)該花在讓 C#中的 gRPC 更容易使用和添加新功能(當(dāng)然還有修復(fù) bug)上,而不是需要在兩個(gè)不同的代碼庫(kù)上工作,它們都服務(wù)于同一個(gè)目的。另外,擁有兩個(gè)獨(dú)立的實(shí)現(xiàn)必然會(huì)在一定程度上分割用戶基礎(chǔ),并將貢獻(xiàn)者的工作分成兩部分。同樣,僅僅是用戶需要選擇他們想押注的兩個(gè)實(shí)現(xiàn)中的哪一個(gè)的簡(jiǎn)單行為就會(huì)帶來不確定性和內(nèi)在風(fēng)險(xiǎn)(我們不希望我們的用戶有這樣的風(fēng)險(xiǎn))。
通過使 grpc-dotnet 成為推薦的實(shí)現(xiàn),通過使 Grpc.Core 的實(shí)現(xiàn)“僅限維護(hù)”(并最終將其淘汰),我們想實(shí)現(xiàn)以下目標(biāo):
釋放工程資源來開發(fā)更好的特性和可用性。
統(tǒng)一 gRPC C#用戶群。這將導(dǎo)致將所有社區(qū)工作和貢獻(xiàn)導(dǎo)向單一的實(shí)施。它還消除了用戶需要選擇使用這兩種正式實(shí)現(xiàn)中的哪一種而產(chǎn)生的內(nèi)在摩擦。
解決 Grpc.Core 的一些眾所周知的痛點(diǎn),很難通過其他方式解決的問題。
通過與.NET 社區(qū)保持一致,讓 gRPC 的 C#/.NET 實(shí)現(xiàn)面向未來。
計(jì)劃
階段 1:Grpc.Core 變成“僅限維護(hù)”
時(shí)間:即刻生效(2021 年 5 月)
從現(xiàn)在開始,我們將不再為 Grpc.Core 提供新特性或增強(qiáng)。重要的錯(cuò)誤和安全問題將繼續(xù)以正常的方式解決。
我們將正常發(fā)布 Grpc.Core 版本,以通常的 6 周節(jié)奏發(fā)布。
新版本將基于最新的 grpc C 核心原生庫(kù)構(gòu)建,所以所有不需要 C#特定工作的新特性也將被包括在內(nèi)。
階段 2:Grpc.Core 變成“棄用”
時(shí)間:1 年后(2022 年 5 月)
一旦達(dá)到這一里程碑,Grpc.Core 將不再被官方支持,所有用戶將強(qiáng)烈建議從那時(shí)開始只使用 grpc-dotnet。
Grpc.Core nuget 包將繼續(xù)在 nuget.org 倉(cāng)庫(kù)中可用,但不會(huì)提供更多的修復(fù)(=甚至沒有安全修復(fù))。
Grpc.Tools 和 Grpc.Core.Api nuget 包的未來
這兩個(gè)包將繼續(xù)得到完全支持,因?yàn)閲?yán)格來說它們不是 Grpc.Core 的一部分,他們也被 grpc-dotnet 使用。
Grpc.Tools nuget 包為 C#項(xiàng)目提供 codegen 構(gòu)建集成將繼續(xù)得到支持(并有可能得到改進(jìn))——因?yàn)樗?Grpc.Core 和 grpc-dotnet 使用。此包獨(dú)立于 C 內(nèi)核。
Grpc.Core.Api 包是 grpc-dotnet 的先決條件,因此它將有可能隨著時(shí)間的推移而演變(但它是一個(gè)純 C# API 包,因?yàn)樗话?API 表面,更改是非常少的)。
常見問題
我現(xiàn)在是 Grpc.Core 用戶,這對(duì)我意味著什么?
我們將繼續(xù)支持 Grpc.Core(有關(guān)詳細(xì)信息,請(qǐng)參閱棄用時(shí)間表),如果你想在未來繼續(xù)獲得更新和 bug 修復(fù),你必須將你的項(xiàng)目遷移到 grpc-dotnet。
如何將現(xiàn)有項(xiàng)目遷移到 grpc-dotnet?
因?yàn)?Grpc.Core 和 grpc-dotnet 是兩個(gè)不同的庫(kù),在你的項(xiàng)目中會(huì)有一些必要的代碼更改。由于這兩個(gè)實(shí)現(xiàn)都共享調(diào)用和處理 rpc 的相同 API(我們故意這樣設(shè)計(jì)它們),我們相信必要的代碼更改應(yīng)該相當(dāng)少。對(duì)于許多應(yīng)用程序,你只需要改變配置 gRPC 通道和服務(wù)器的方式;這通常只是應(yīng)用程序?qū)崿F(xiàn)的一小部分,往往與業(yè)務(wù)邏輯分離。
更多關(guān)于如何從 Grpc.Core 遷移到 grpc-dotnet 的提示,請(qǐng)參見Migrating gRPC services from C-core to ASP.NET Core[6]。
我們計(jì)劃在未來發(fā)布一個(gè)更詳細(xì)的遷移指南,以幫助從 Grpc.Core 遷移到 grpc-dotnet。
我想在一個(gè)新項(xiàng)目中使用 C#的 gRPC。我應(yīng)該選擇哪種實(shí)現(xiàn)?
我們強(qiáng)烈建議在新項(xiàng)目中只使用 grpc-dotnet。我們將在未來停止支持 Grpc.Core。
這是否意味著我現(xiàn)在需要停止使用 Grpc.Core 嗎?
不,Grpc.Core 將繼續(xù)支持一段時(shí)間(參見棄用時(shí)間表)。你應(yīng)該有足夠的時(shí)間來評(píng)估情況并計(jì)劃遷移。
我沒有在我的代碼中直接使用 gRPC,但我使用谷歌云客戶端庫(kù)(它在底層確實(shí)使用 Grpc.Core)。這對(duì)我有什么影響?
這種棄用目前不會(huì)影響谷歌云客戶端庫(kù)的現(xiàn)有用戶。
因?yàn)?Grpc.Core 是客戶端庫(kù)的組成部分,Grpc.Core 的安全和 bug 修復(fù)將繼續(xù)在谷歌云客戶端庫(kù)提供。
將提供擴(kuò)展支持的客戶端庫(kù):
Google Cloud Libraries for .NET[7]
Google Ads Client Library for .NET[8]
注意 Grpc.Core 的擴(kuò)展支持將只提供給當(dāng) Grpc.Core 用作這些客戶端庫(kù)的一部分時(shí)。對(duì)于谷歌云客戶端庫(kù)之外的其他用例,Grpc.Core 將不會(huì)在棄用日期之后得到官方支持,用戶必須在棄用發(fā)生之前將現(xiàn)有工作負(fù)載遷移到 grpc-dotnet。
我可以在哪里找到支持的特性列表?
我們?cè)趃ithub 上的文檔[9]對(duì)支持的特性進(jìn)行了比較。
我有本文檔沒有涵蓋的一個(gè)重要的 Grpc.Core 用例。
我們歡迎你的反饋!通過gRPC-io 谷歌群[10],或任何其他gRPC 社區(qū)的主要渠道[11]寫給我們。
參考資料
[1]
Grpc.Net.Client:?https://www.nuget.org/packages/Grpc.Net.Client/
[2]Grpc.AspNetCore.Server:?https://www.nuget.org/packages/Grpc.AspNetCore.Server/
[3]宣布:?https://www.grpc.io/blog/grpc-on-dotnetcore/
[4]gRPC C#實(shí)現(xiàn):?https://github.com/grpc/grpc-dotnet
[5]最初的 gRPC C#實(shí)現(xiàn):?https://github.com/grpc/grpc/tree/master/src/csharp
[6]Migrating gRPC services from C-core to ASP.NET Core:?https://docs.microsoft.com/en-us/aspnet/core/grpc/migration
[7]Google Cloud Libraries for .NET:?https://github.com/googleapis/google-cloud-dotnet
[8]Google Ads Client Library for .NET:?https://github.com/googleads/google-ads-dotnet/
[9]github 上的文檔:?https://github.com/grpc/grpc-dotnet/blob/master/doc/implementation_comparison.md
[10]gRPC-io 谷歌群:?https://groups.google.com/forum/#!forum/grpc-io
[11]gRPC 社區(qū)的主要渠道:?https://www.grpc.io/community/
點(diǎn)擊【閱讀原文】閱讀網(wǎng)站原文。
總結(jié)
以上是生活随笔為你收集整理的gRPC在C#中的未来属于grpc-dotnet的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 深入探究ASP.NET Core读取Re
- 下一篇: ML.NET 示例:对象检测