Як підтримувати різні версії API


15

Я пишу API відпочинку і цікавлюсь, як найкраще впоратися з підтримкою різних версій. Під цим я маю на увазі не те, як визначити URI як V2 чи V3, а як структурувати код, враховуючи, що йому потрібно:

  • Підтримка декількох версій одночасно, наприклад. URI та V2 та V3 URI мають бути одночасно відтвореними. Я б пішов у відставку з V1, коли скажу, що V4 приходить для того, щоб в будь-який час обмежити суму, яку підтримують.
  • Уникайте якомога більше дублювання коду
  • Додайте неспроможні зміни до версії, не впливаючи на інші версії

Здавалося б, існує кілька підходів, до яких можна скористатися:

  • Використовуйте Git для управління версіями, з гілкою для різних версій (і старі версії, по суті, не виконують нових робіт з розробки). Це означатиме, що не дублювання коду, оскільки в коді є лише остання версія, але попередні версії повинні працювати з новою версією БД, поки вони не будуть звільнені.

  • Дублікат коду, так що кожна версія обробляється в одній програмі та має абсолютно окремий шлях коду, але це означатиме багато дублювання

  • Повторне використання великого коду в усіх версіях, але це ускладнить підтримку, оскільки зміна однієї версії скоріше вплине на попередню версію

Чи є найкраща практика для вирішення цієї проблеми, оскільки, здається, всі варіанти мають свої проблеми?


1
Якщо ви вкажете номер версії в URL-адресі (наприклад, myserver / api / 3.1.4 / user / get), ви можете передати номер версії в будь-яку функцію, яку ви викликаєте, щоб ви могли локалізувати поведінку, що залежить від версії, не обмінюючись занадто великим кодом.
Джеймс МакЛейд

Відповіді:


5

Зробити це:

Повторне використання великого коду в усіх версіях, але це ускладнить підтримку, оскільки зміна однієї версії скоріше вплине на попередню версію

але не порушуйте попередні версії.

У вас повинні бути тести, які підтверджують, що всі підтримувані версії працюють правильно. Якщо у вас немає цих тестів, спершу слід створити їх, щоб охопити будь-який код, який ви змінюєте.


2

Найбільш вірогідним є поєднання використання гілок випуску GIT (або перенаправлення кожної версії в окремий сховище) для підтримки та підтримки старих версій API, і, можливо, якийсь код, який можна повторно використовувати, який може бути спільним, як залежність, наприклад, бібліотека Commons йти. Таким чином, кожна версія API буде артефактом, який можна розгортати окремо. Це дозволяє забезпечити гнучкість, так що, наприклад, API V1 може залежати від загальнодоступних V1, тоді як API V2, V3, V4 можуть залежати від общин V2. Це було б найпростіше і найяскравіше з точки зору розвитку, оскільки ваша база коду не множиться з кожною новою версією, натомість кожна версія є ізольованою у власній базі проекту / коду і стосується лише себе.

Ще однією причиною розгортання окремих артефактів є те, що можуть виникнути наскрізні проблеми, як-от механізм захисту, або рамки / бібліотеки, такі як ваша структура введення залежності, які могли б змінитися в нових версіях API та створили б багато труднощів у підтримці старих API, якщо вони всі живуть в одній базі коду (і Classloader під час виконання, якщо це Java)

Кожен підхід, незалежно від того, будь то розгалуження на версію чи монолітний дубльований код коду, завжди повинен мати питання про загальну точку інтеграції (наприклад, БД або схему розподіленого кешу), яку потрібно змінити. API старих версій може потребувати певного технічного обслуговування для роботи з цими змінами або впровадження деяких інших інструментів (наприклад, переглядів бази даних) для сприяння сумісності. Це може бути неминучою складністю залежно від характеру змін.


0

Я не знаю, наскільки результати відрізняються від ваших версій API, але ви можете мати рівень сумісності посередині, який може перемикатися між версіями та заповнювати прогалини або перекладати дані.

Однак, як правило, це ніколи не виходить один на один, тож перемикач або конструкція типу машинної машини допомогли мені у цій проблемі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.