Ich schreibe eine Rest API und frage mich, wie ich mit der Unterstützung der verschiedenen Versionen am besten umgehen kann. Damit meine ich nicht, wie man einen URI als V2 oder V3 definiert, sondern wie man den Code strukturiert, vorausgesetzt, er müsste:
- Unterstützt mehrere Versionen gleichzeitig, z. V1-, V2- und V3-URIs müssen gleichzeitig aktiv sein. Ich würde V1 in den Ruhestand versetzen, wenn V4 eingeht, um die zu einem bestimmten Zeitpunkt unterstützte Menge zu beschränken.
- Vermeiden Sie so viele Code-Duplikate wie möglich
- Erleichtern Sie das Hinzufügen von Änderungen an einer Version, ohne dass dies Auswirkungen auf andere Versionen hat
Es scheint, dass es nur wenige Ansätze gibt, die ergriffen werden könnten:
Verwenden Sie Git, um die Versionen zu steuern, mit einer Verzweigung für die verschiedenen Versionen (und alten Versionen, an denen im Wesentlichen keine neuen Entwicklungsarbeiten durchgeführt wurden). Dies würde bedeuten, dass der Code nicht doppelt vorhanden ist, da sich nur die neueste Version im Code befindet. Vorherige Versionen müssten jedoch mit der neuen Version der Datenbank arbeiten, bis sie ausgemustert sind.
Code duplizieren, sodass jede Version in derselben Anwendung verarbeitet wird und einen völlig separaten Codepfad hat, dies würde jedoch eine Menge Duplizierung bedeuten
Verwenden Sie viel Code für alle Versionen erneut, dies würde jedoch die Wartung erschweren, da das Ändern einer Version eher Auswirkungen auf eine frühere Version hat
Gibt es eine bewährte Methode, um mit diesem Problem umzugehen, da alle Optionen ihre eigenen Probleme zu haben scheinen?
quelle
Antworten:
Mach das:
aber nicht die vorherigen Versionen brechen.
Sie sollten Tests haben, die sicherstellen, dass alle unterstützten Versionen ordnungsgemäß funktionieren. Wenn Sie diese Tests nicht haben, sollten Sie sie zuerst erstellen, um den Code abzudecken, den Sie ändern.
quelle
Eine Kombination aus der Verwendung von GIT-Release-Zweigen (oder der Verzweigung jeder Version in ein separates Repository) zur Unterstützung und Pflege alter API-Versionen und möglicherweise wiederverwendbarem Code, der wie eine allgemeine Bibliothek als Abhängigkeit gemeinsam genutzt werden kann, ist höchstwahrscheinlich der richtige Weg gehen. Jede API-Version wäre also ein separat implementierbares Artefakt. Dies ermöglicht Flexibilität, sodass beispielsweise API V1 von Commons V1 abhängen kann, während APIs V2, V3, V4 von Commons V2 abhängen können. Dies wäre aus Sicht der Entwicklung am einfachsten und saubersten, da Ihre Codebasis nicht mit jeder neuen Version multipliziert wird, sondern jede Version in ihrem eigenen Projekt / Codebasis isoliert ist und sich nur um sich selbst kümmert.
Ein weiterer Grund für die Bereitstellung separater Artefakte besteht darin, dass möglicherweise übergreifende Bedenken wie ein Sicherheitsmechanismus oder Frameworks / Bibliotheken wie Ihr Abhängigkeitsinjektions-Framework vorliegen, die sich in neueren Versionen der API ändern könnten und die Unterstützung älterer APIs erheblich erschweren würden Alle leben in der gleichen Codebasis (und Classloader zur Laufzeit, wenn es sich um Java handelt).
Bei jedem Ansatz, unabhängig davon, ob es sich um eine Verzweigung pro Version oder eine monolithisch duplizierte Codebasis handelt, muss immer ein gemeinsamer Integrationspunkt (wie die Datenbank oder ein verteiltes Cache-Schema) geändert werden. APIs älterer Versionen müssen möglicherweise gewartet werden, um mit diesen Änderungen fertig zu werden, oder es müssen andere Tools (z. B. Datenbankansichten) eingeführt werden, um die Kompatibilität zu verbessern. Dies kann je nach Art Ihrer Änderungen eine unvermeidbare Schwierigkeit sein.
quelle
Ich weiß nicht, wie unterschiedlich die Ergebnisse von Ihren API-Versionen sind, aber Sie könnten eine Kompatibilitätsebene in der Mitte haben, die zwischen den Versionen wechseln und Lücken füllen oder Daten übersetzen kann.
Davon abgesehen - es funktioniert normalerweise nie eins zu eins - hat mir ein Schalter- oder Zustandsmaschinentyp bei diesem Problem geholfen.
quelle