2016-11-10 14 views
2

多くのアプリケーションを接続するためにgRCP/Protobufを使用します。 これらのアプリケーションは独自のスピードで独自のチームで開発され、リリースされます。時間が経つと、定義されたインターフェイスで異なるバージョンを使用する異なるバージョンの同じアプリ(デスクトップPCなど)がユーザーPCにインストールされます。gRPC/Protobufインターフェイスのバージョン管理

Protobufは後方互換性を持たせることを目的としていますが、は、異なるバージョンで実行されているインターフェイスのバージョンを知る方法がありますか?

最も単純な実装は、アプリケーションバージョンと等しいインターフェイスバージョンを持つことです。 しかし、多くの言語が使用されているので、すべてのアプリケーションでバージョン管理を実装するのは簡単ではありません。

それでは、どのバージョンのインターフェイスとクライアントのバージョンを知るために、サーバーを聞かせて? 私は、サーバーがAppNameパラメータv.versionから

DATETIME接続をログに記録することができるはずだと思う[インターフェースv.versionを使っ]

+0

おそらく私が見る必要があるのはグローバルインターセプタです –

+0

https://groups.google.com/forum/#!topic/grpc-io/LPsPg5ctQd4に似ています人々は 「GetVersion()」メソッドを実装していますか?質問 –

+0

メソッドをバージョンアップし、2つの最新バージョンを維持することをお勧めします。それは '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

アイデアがいいです。しかし、 'optional'はproto3のキーワード/サポートされていません。また、すべてのメッセージとインターフェイスに追加する必要があります。 –

0

一つの方法は、custom optionを追加し、このように、あなたの.protoファイルの先頭にそのオプションを設定するには、次のようになります。

option (my_app.version) = 3; 

次に、各言語であなたがそのオプションの値を調べることができますあなたのバージョン番号としてそれを示してください。

0

gRPCの次期バージョンでは、Server Reflectionという新しい機能が追加されます。これにより、クライアントは、使用されているプロトファイルを記述する記述子をサーバに求めることができる。サーバーは、クライアントが実行しているバージョンを知っているのではなく、サーバーが何を実行しているかを知ることができます。クライアントがすでに持っているものとサーバ記述子が一致する場合、同じバージョンで話していることがわかります。

これはバージョン1.1でリリースされます。

Protobufsは、になっていないように設計されています。 protoを正しく設定すると、古いバージョンと新しいバージョンのクライアントとサーバーが連携して動作するはずです。

関連する問題