Я пишу Rest API и мне интересно, как лучше всего поддерживать различные версии. Под этим я не подразумеваю, как определить URI как V2 или V3, а скорее как структурировать код, учитывая, что для этого потребуется:
- Поддержка нескольких версий одновременно, например. URI V1 & V2 & V3 должны быть активны одновременно. Я бы отказался от V1, когда, скажем, V4 входит, чтобы ограничить количество поддерживаемых в любое время.
- Избегайте максимально возможного дублирования кода
- Упростите добавление неразрывных изменений в версию, не влияя на другие версии
Казалось бы, есть несколько подходов, которые могут быть приняты:
Используйте Git для управления версиями, с ветвью для разных версий (и старых версий, по существу, без новых разработок). Это означало бы отсутствие дублирования кода, поскольку в коде присутствует только последняя версия, но предыдущие версии должны будут работать с новой версией БД, пока они не будут удалены.
Дублируйте код, чтобы каждая версия обрабатывалась в одном приложении и имела совершенно отдельный путь к коду, но это означало бы много дублирования
Повторно используйте много кода в разных версиях, но это усложнит поддержку, поскольку изменение одной версии с большей вероятностью повлияет на предыдущую версию.
Есть ли лучшая практика для решения этой проблемы, поскольку у всех вариантов есть свои проблемы?
источник
Ответы:
Сделай это:
но не ломайте предыдущие версии.
У вас должны быть тесты, которые подтверждают, что все поддерживаемые версии работают правильно. Если у вас нет этих тестов, вы должны сначала создать их, чтобы покрыть любой код, который вы изменяете.
источник
Комбинация использования веток релиза GIT (или разветвления каждой версии в отдельный репозиторий) для поддержки и поддержки старых версий API и, возможно, наличия некоторого кода многократного использования, который может быть передан в качестве зависимости, например, библиотека общего пользования, является наиболее вероятным способом идти. Таким образом, каждая версия API будет отдельным развертываемым артефактом. Это обеспечивает гибкость, так что, например, API V1 может зависеть от общих V1, в то время как API V2, V3, V4 могут зависеть от общих V2. Это было бы самым простым и чистым с точки зрения разработки, поскольку ваша кодовая база не умножается с каждой новой версией, вместо этого каждая версия изолируется в своей собственной базе проекта / кода и касается только себя.
Другая причина развертывания отдельных артефактов заключается в том, что могут существовать сквозные проблемы, такие как механизм безопасности, или инфраструктуры / библиотеки, такие как ваша структура внедрения зависимостей, которые могут измениться в более новых версиях API и могут создать большие трудности при поддержке старых API, если они все живут в одной и той же кодовой базе (и Classloader во время выполнения, если это Java).
Каждый подход, будь то ветвь на версию или монолитный дублированный код, всегда будет вызывать проблему общей точки интеграции (например, БД или схемы распределенного кэша), которую необходимо изменить. Для работы с этими изменениями API более ранней версии может потребоваться какое-то обслуживание или введение некоторых других инструментов (например, представлений базы данных) для обеспечения совместимости. Это может быть неизбежной трудностью в зависимости от характера ваших изменений.
источник
Я не знаю, насколько результаты отличаются от ваших версий API, но вы могли бы иметь посередине слой совместимости, который может переключаться между версиями и заполнять пробелы или переводить данные.
Это сказанное - это обычно никогда не работает один к одному - таким образом, дизайн типа переключателя или конечного автомата помог мне с этой проблемой.
источник