Ich habe mich über Versionsstrategien für ReST-APIs informiert, und keine davon scheint sich mit der Verwaltung der zugrunde liegenden Codebasis zu befassen.
Nehmen wir an, wir nehmen eine Reihe von Änderungen an einer API vor, z. B. indem wir unsere Kundenressource so ändern, dass sie separate forename
und surname
Felder anstelle eines einzelnen name
Felds zurückgibt . (In diesem Beispiel verwende ich die URL-Versionierungslösung, da die Konzepte leicht zu verstehen sind. Die Frage gilt jedoch auch für die Aushandlung von Inhalten oder benutzerdefinierte HTTP-Header.)
Wir haben jetzt einen Endpunkt bei http://api.mycompany.com/v1/customers/{id}
und einen anderen inkompatiblen Endpunkt bei http://api.mycompany.com/v2/customers/{id}
. Wir veröffentlichen immer noch Bugfixes und Sicherheitsupdates für die v1-API, aber die Entwicklung neuer Funktionen konzentriert sich jetzt alle auf v2. Wie schreiben, testen und implementieren wir Änderungen auf unserem API-Server? Ich kann mindestens zwei Lösungen sehen:
Verwenden Sie einen Versionsverwaltungszweig / ein Tag für die v1-Codebasis. v1 und v2 werden unabhängig voneinander entwickelt und bereitgestellt, wobei bei Bedarf Revisionskontrollzusammenführungen verwendet werden, um denselben Bugfix auf beide Versionen anzuwenden - ähnlich wie Sie Codebasen für native Apps verwalten würden, wenn Sie eine neue Hauptversion entwickeln und gleichzeitig die vorherige Version unterstützen.
Machen Sie die Codebasis selbst auf die API-Versionen aufmerksam, sodass Sie eine einzige Codebasis erhalten, die sowohl die v1-Kundenrepräsentation als auch die v2-Kundenrepräsentation enthält. Behandeln Sie die Versionierung als Teil Ihrer Lösungsarchitektur anstelle eines Bereitstellungsproblems. Verwenden Sie möglicherweise eine Kombination aus Namespaces und Routing, um sicherzustellen, dass Anforderungen von der richtigen Version verarbeitet werden.
Der offensichtliche Vorteil des Zweigstellenmodells besteht darin, dass es trivial ist, alte API-Versionen zu löschen - beenden Sie einfach die Bereitstellung des entsprechenden Zweigs / Tags -, aber wenn Sie mehrere Versionen ausführen, kann dies zu einer wirklich komplizierten Zweigstruktur und Bereitstellungspipeline führen. Das "Unified Codebase" -Modell vermeidet dieses Problem, aber (glaube ich?) Würde es viel schwieriger machen, veraltete Ressourcen und Endpunkte aus der Codebasis zu entfernen, wenn sie nicht mehr benötigt werden. Ich weiß, dass dies wahrscheinlich subjektiv ist, da es wahrscheinlich keine einfache richtige Antwort gibt, aber ich bin gespannt, wie Organisationen, die komplexe APIs über mehrere Versionen hinweg verwalten, dieses Problem lösen.