2016-11-10 328 views
2

假設我們使用gRCP/Protobuf來連接許多應用程序。 這些應用程序是由他們自己的團隊開發併發布的,具有自己的速度。隨着時間的推移,將會有不同版本的相同應用程序(例如安裝在用戶PC上的桌面應用程序)在定義的界面上使用不同的版本。gRPC/Protobuf接口版本

雖然Protobuf旨在允許向後兼容,但有沒有辦法知道在不同點上運行的接口的版本是什麼?

最簡單的實現是使接口版本等於應用程序版本。 但是,隨着許多語言的使用,在所有這些語言中實現應用程序版本化並非微不足道。

所以版本接口,以及如何讓服務器知道客戶端版本? 我認爲服務器應該[使用接口v.version]可以登錄由AppName的v.version

DATETIME連接

+0

可能我需要看的是全球性的攔截 –

+0

到https://groups.google.com/forum/#!topic/grpc-io/LPsPg5ctQd4類似人們是否實行 「GetVersion()」方法是什麼?問題 –

+0

我建議版本方法和維護兩個最新版本。它會產生'DoSmth7()'和'DoSmth8()',這有點難看,但我買了這個。 –

回答

0

如果您使用的是協議緩衝區版本2,則可以使用默認值來實現此目的。協議緩衝區3已經移除了對默認值的支持,所以這個答案在那裏不起作用。

在.proto文件中定義的接口,有這樣的事:

message MyLoginMessage 
{ 
    ... normal login fields ... 

    // Increment this number when you make new releases 
    // of this .proto. 
    optional int32 protocol_version [default=55]; 
} 

這樣任何客戶端將自動包括來自.proto拍攝的版本號。

編輯:啊,剛剛注意到了proto3標籤..所以我想這個答案畢竟對你沒用。要做到這一點

+0

想法很好。然而'可選的'不是關鍵字/ proto3的支持。還需要添加到每個消息和接口。 –

0

一種方法是在你的.proto文件的頂部添加custom option並設置選項,如:

option (my_app.version) = 3; 

然後,在每一種語言,你可以檢查該選項的值並將其指明爲您的版本號。

0

在即將發佈的gRPC版本中,將會有一個稱爲服務器反射的新功能。這將允許客戶端向服務器詢問描述符所使用的原始文件的描述符。客戶端並不知道服務器正在運行的版本,而是知道服務器正在運行的是什麼。如果服務器描述符與客戶端已有的描述符匹配,那麼它將知道他們正在以相同版本發言。

這將在版本1.1中發佈。

請注意,Protobufs的設計使您不必必須這樣做!如果您正確設置了原型,新舊版本的客戶端和服務器應該一起工作。