web-dev-qa-db-ja.com

異なるAPIバージョンをサポートする方法

私はRest APIを書いていて、さまざまなバージョンのサポートを処理するための最善の方法を考えています。これによって、URIをV2またはV3として定義する方法を意味するのではなく、必要な場合にコードを構造化する方法を意味します。

  • 同時に複数のバージョンをサポートします。 V1&V2&V3 URIは同時にライブである必要があります。一度にサポートされる量を制限するためにV4が登場したとき、私はV1を廃止します。
  • コードの重複をできるだけ避けます
  • 他のバージョンに影響を与えることなく、バージョンに互換性のない変更を簡単に追加できます

取ることのできるアプローチはほとんどないようです。

  • Gitを使用してバージョンを制御し、異なるバージョンのブランチを用意します(古いバージョンでは、基本的に新しい開発作業は行われていません)。コードには最新バージョンのみが含まれているため、コードが重複しないことを意味しますが、以前のバージョンは廃止されるまで新しいバージョンのDBで動作する必要があります。

  • 各バージョンが同じアプリケーションで処理され、コードパスがまったく異なるようにコードを複製するが、これは多くの複製を意味する

  • バージョン間で多くのコードを再利用しますが、1つのバージョンを変更すると以前のバージョンに影響が出る可能性が高くなるため、維持が難しくなります。

すべてのオプションに独自の問題があるように見えるため、この問題に対処するためのベストプラクティスはありますか?

15
Andy Davies

これを行う:

バージョン間で多くのコードを再利用しますが、1つのバージョンを変更すると以前のバージョンに影響が出る可能性が高くなるため、維持が難しくなります。

以前のバージョンを壊さないでください。

サポートされているすべてのバージョンが正しく動作していることを確認するテストが必要です。これらのテストがない場合は、最初にそれらを作成して、変更するコードをカバーする必要があります。

5
kevin cline

GITリリースブランチ(または各バージョンを個別のリポジトリにフォーク)を使用して、古いAPIバージョンをサポートおよび維持し、場合によっては、コモンズライブラリなどの依存関係として共有できる再利用可能なコードを組み合わせることが最も可能性の高い方法ですトーゴ。したがって、各APIバージョンは個別にデプロイ可能なアーティファクトになります。これにより、たとえばAPI V1がコモンV1に依存できるように、API V2、V3、V4がコモンV2に依存できるように、柔軟性が可能になります。これは、コードベースが新しいバージョンごとに増加するのではなく、すべてのバージョンが独自のプロジェクト/コードベースに分離され、それ自体にのみ関係するため、開発の観点から最も簡単でクリーンです。

個別のアーティファクトをデプロイするもう1つの理由は、セキュリティメカニズムや依存性注入フレームワークのようなフレームワーク/ライブラリが、APIの新しいバージョンで変更される可能性があり、古いAPIのサポートが困難になる場合があることです。すべてが同じコードベースにあります(Javaの場合は実行時にClassloaderも)。

バージョンごとのブランチであれ、モノリシックな重複コードベースであれ、すべてのアプローチには、変更が必要な共通の統合ポイント(DBや分散キャッシュスキーマなど)の問題があります。古いバージョンのAPIでは、これらの変更に対応するために何らかのメンテナンスが必要になるか、互換性を高めるために他のツール(データベースビューなど)の導入が必要になる場合があります。変更の性質によっては、これは避けられない困難な場合があります。

2
PaulMooney

結果がAPIバージョンとどのように異なるかわかりませんが、バージョンを切り替えてギャップを埋めたり、データを変換したりできる互換性レイヤーを中央に配置できます。

そうは言っても、通常は1対1で機能することはないため、スイッチまたはステートマシンタイプの設計がこの問題の解決に役立ちました。

0
Zach Leighton