Как поддерживать разные версии API

15

Я пишу Rest API и мне интересно, как лучше всего поддерживать различные версии. Под этим я не подразумеваю, как определить URI как V2 или V3, а скорее как структурировать код, учитывая, что для этого потребуется:

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

Казалось бы, есть несколько подходов, которые могут быть приняты:

  • Используйте Git для управления версиями, с ветвью для разных версий (и старых версий, по существу, без новых разработок). Это означало бы отсутствие дублирования кода, поскольку в коде присутствует только последняя версия, но предыдущие версии должны будут работать с новой версией БД, пока они не будут удалены.

  • Дублируйте код, чтобы каждая версия обрабатывалась в одном приложении и имела совершенно отдельный путь к коду, но это означало бы много дублирования

  • Повторно используйте много кода в разных версиях, но это усложнит поддержку, поскольку изменение одной версии с большей вероятностью повлияет на предыдущую версию.

Есть ли лучшая практика для решения этой проблемы, поскольку у всех вариантов есть свои проблемы?

Энди Дэвис
источник
1
Если вы указываете номер версии в URL (например, myserver / api / 3.1.4 / user / get), вы можете передать номер версии в любую вызываемую вами функцию, чтобы вы могли локализовать поведение, зависящее от версии, без совместного использования слишком большого количества кода.
Джеймс Маклеод

Ответы:

5

Сделай это:

Повторно используйте много кода в разных версиях, но это усложнит поддержку, поскольку изменение одной версии с большей вероятностью повлияет на предыдущую версию.

но не ломайте предыдущие версии.

У вас должны быть тесты, которые подтверждают, что все поддерживаемые версии работают правильно. Если у вас нет этих тестов, вы должны сначала создать их, чтобы покрыть любой код, который вы изменяете.

Кевин Клайн
источник
2

Комбинация использования веток релиза GIT (или разветвления каждой версии в отдельный репозиторий) для поддержки и поддержки старых версий API и, возможно, наличия некоторого кода многократного использования, который может быть передан в качестве зависимости, например, библиотека общего пользования, является наиболее вероятным способом идти. Таким образом, каждая версия API будет отдельным развертываемым артефактом. Это обеспечивает гибкость, так что, например, API V1 может зависеть от общих V1, в то время как API V2, V3, V4 могут зависеть от общих V2. Это было бы самым простым и чистым с точки зрения разработки, поскольку ваша кодовая база не умножается с каждой новой версией, вместо этого каждая версия изолируется в своей собственной базе проекта / кода и касается только себя.

Другая причина развертывания отдельных артефактов заключается в том, что могут существовать сквозные проблемы, такие как механизм безопасности, или инфраструктуры / библиотеки, такие как ваша структура внедрения зависимостей, которые могут измениться в более новых версиях API и могут создать большие трудности при поддержке старых API, если они все живут в одной и той же кодовой базе (и Classloader во время выполнения, если это Java).

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

PaulMooney
источник
0

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

Это сказанное - это обычно никогда не работает один к одному - таким образом, дизайн типа переключателя или конечного автомата помог мне с этой проблемой.

Зак Лейтон
источник