gRPC版本控制


非中斷性變更允許現有客戶端繼續工作而不做任何變更。

非重大變化

在 gRPC 協議級別和 .NET 二進制級別,這些變更不會中斷。

  • 添加新服務
  • 向服務中添加新方法
  • 將字段添加到請求消息 - 添加到請求消息的字段將在服務器上通過默認值(若未設置)進行反序列化。
  • 將字段添加到響應消息 - 添加到響應消息的字段將反序列化到客戶端上消息的未知字段集合中。
  • 向枚舉添加值 - 枚舉被序列化為數值。 新的枚舉值在客戶端反序列化為沒有枚舉名的枚舉值。 

二進制中斷性變更

以下變更在 gRPC 協議級別是非中斷性變更,但如果客戶端升級到最新的 .proto 協定或客戶端 .NET 程序集,則需要對其進行更新。 如果你計划將 gRPC 庫發布到 NuGet,二進制兼容性很重要。

  • 刪除字段 - 已刪除字段中的值被反序列化為消息的未知字段。 這並不是 gRPC 協議中斷性變更,但如果客戶端升級到最新的協定,則需要對其進行更新。 刪除的字段編號不會在將來被意外重用,這點很重要。 若要確保不會發生這種情況,請使用 Protobuf 的保留關鍵字指定郵件上已刪除的字段編號和名稱。
  • 重命名消息 - 消息名稱通常不會在網絡上發送,因此這不是 gRPC 協議中斷性變更。 如果客戶端升級到最新的協定,則需要對其進行更新。 當消息名稱用於標識消息類型時,任何字段都會出現消息名稱在網絡上發送的情況。
  • 更改 csharp_namespace - 更改 csharp_namespace 將更改所生成的 .NET 類型的命名空間。 這並不是 gRPC 協議中斷性變更,但如果客戶端升級到最新的協定,則需要對其進行更新。

協議中斷性變更

以下各項是協議和二進制的中斷性變更:

  • 重命名字段 - 對於 Protobuf 內容,字段名只在生成的代碼中使用。 字段編號用於標識網絡上的字段。 對 Protobuf 來說,重命名字段不是協議中斷性變更。 但是,如果服務器正在使用 JSON 內容,則重命名字段是一個中斷性變更。
  • 更改字段數據類型 - 將字段的數據類型更改為不兼容類型將在反序列化消息時導致錯誤。 即使新的數據類型是兼容的,但如果客戶端升級到最新的協定,它也可能需要更新以支持新的類型。
  • 更改字段編號 - 對於 Protobuf 有效負載,字段編號用於標識網絡上的字段。
  • 重命名包、服務或方法 - gRPC 使用包名、服務名和方法名來生成 URL。 客戶端從服務器獲取 UNIMPLEMENTED 狀態。
  • 刪除服務或方法 - 客戶端在調用已刪除的方法時從服務器獲取 UNIMPLEMENTED 狀態。

行為中斷性變更

在進行非中斷性更改時,還必須考慮舊客戶端是否可以繼續使用新的服務行為。 例如,向請求消息添加新字段:

  • 它不是協議中斷性變更。
  • 如果未設置新字段,則在服務器上返回錯誤狀態對於舊客戶端來說是一個中斷性變更。

行為兼容性由應用特定的代碼決定。

版本號服務

服務應盡量保持與舊客戶端的后向兼容。 最終對應用的更改可能需要進行中斷性變更。 中斷舊客戶端並強制其隨服務一起更新不是一種好的用戶體驗。 若要在進行中斷性變更的同時保持后向兼容性,一種方法是發布服務的多個版本。

gRPC 支持可選的說明符,它的功能非常類似於 .NET 命名空間。 實際上,如果 .proto 文件中未設置 option csharp_namespace,則 package 將用作生成的 .NET 類型的 .NET 命名空間。 該包可用於指定服務的版本號及其消息:

 

package greet.v1;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM