2016-11-10 6 views
2

Nehmen wir an, wir verwenden gRCP/Protobuf, um viele Anwendungen zu verbinden. Diese Anwendung wird in ihrem eigenen Team mit eigener Geschwindigkeit entwickelt und veröffentlicht. Im Laufe der Zeit wird es eine andere Version der gleichen App geben (z. B. Desktop-Apps, die auf Benutzer-PCs installiert werden), die auf einer definierten Oberfläche eine andere Version verwenden.gRPC/Protobuf Schnittstelle Versionierung

Während Protobuf Abwärtskompatibilität zu ermöglichen, ist gibt es eine Möglichkeit zu wissen, welche Version der Schnittstelle an verschiedenen Punkten ausgeführt wird?

Die einfachste Implementierung ist eine Schnittstellenversion, die der App-Version entspricht. Aber so viele Sprachen verwendet werden, ist es nicht trivial, App-Versionierung in allen von ihnen zu implementieren.

So wie Version Schnittstelle und lassen Sie Server-Client-Version wissen? denke ich Server in der Lage sein sollte

DATETIME- Verbindung von AnwName v.version log [Schnittstelle v.version mit]

+0

Möglicherweise, was ich brauche, zu betrachten ist Globale Abfangjäger –

+0

Ähnlich https://groups.google.com/forum/#!topic/grpc-io/LPsPg5ctQd4 Sie einen Menschen implementieren „GetVersion()“ Methode? Frage –

+0

Ich rate zu Version Methoden und pflegen zwei neueste Versionen. Es führt zu 'DoSmth7()' und 'DoSmth8()', was ein bisschen hässlich ist, aber ich kaufe das. –

Antwort

0

Wenn Sie Protokollpuffer Version 2 verwenden, können Sie die Standardwerte verwenden, um dies zu implementieren. Protokollpuffer 3 hat die Unterstützung für Standardwerte entfernt, sodass diese Antwort dort nicht funktioniert.

In der .proto Datei Ihre Schnittstelle zu definieren, haben so etwas wie:

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

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

Auf diese Weise wird jeder Client automatisch die Versionsnummer aus dem .proto genommen ist.

Edit: Ah, gerade bemerkte die Proto3-Tag .. so denke ich, diese Antwort ist nicht nützlich für Sie schließlich.

+0

Idee ist nett. "Optional" ist jedoch kein Schlüsselwort/unterstützt für Proto3.Auch das wäre erforderlich, um jede Nachricht und Schnittstelle hinzuzufügen. –

0

Eine Möglichkeit, dies zu tun, wäre ein custom option hinzufügen und legen Sie diese Option an der Spitze Ihrer .proto Datei, wie folgt aus:

option (my_app.version) = 3; 

Dann in jeder Sprache, die Sie den Wert dieser Option prüfen können und geben Sie es als Ihre Versionsnummer an.

0

In den kommenden Versionen von gRPC wird es eine neue Funktion namens Server Reflection geben. Dies ermöglicht einem Client, den Server nach dem Deskriptor zu fragen, der die verwendete Proto-Datei verwendet. Anstatt dass der Server über die Version informiert, die der Client ausführt, weiß der Client, was der Server ausführt. Wenn der Serverdeskriptor mit dem übereinstimmt, den der Client bereits besitzt, weiß er, dass sie mit der gleichen Version sprechen.

Diese wird in der Version 1.1 veröffentlicht.

Beachten Sie, dass Protobufs so entworfen sind, dass Sie nicht tun müssen! Wenn Sie Ihr Proto korrekt einrichten, sollten alte und neue Versionen von Clients und Server zusammenarbeiten.