Я читал о стратегиях управления версиями для API-интерфейсов ReST, и кое-что из них, похоже, не решает, как управлять базовой кодовой базой.
Скажем , мы делаем кучу ломки изменений в API - например, изменяя наш ресурс клиента так , чтобы он возвращал отдельным forename
и surname
поле вместо одного name
поля. (В этом примере я буду использовать решение для управления версиями URL, поскольку его легко понять, но вопрос в равной степени применим к согласованию содержимого или настраиваемым заголовкам HTTP)
Теперь у нас есть конечная точка http://api.mycompany.com/v1/customers/{id}
и другая несовместимая конечная точка http://api.mycompany.com/v2/customers/{id}
. Мы по-прежнему выпускаем исправления и обновления безопасности для API v1, но разработка новых функций теперь сосредоточена на v2. Как мы пишем, тестируем и внедряем изменения на нашем сервере API? Я вижу как минимум два решения:
Используйте ветку / тег системы управления версиями для кодовой базы v1. v1 и v2 разрабатываются и развертываются независимо, слияния системы контроля версий используются по мере необходимости для применения одного и того же исправления ошибок к обеим версиям - аналогично тому, как вы управляете кодовыми базами для собственных приложений при разработке новой основной версии, при этом по-прежнему поддерживая предыдущую версию.
Сделайте так, чтобы сама база кода знала о версиях API, чтобы в итоге вы получили единую базу кода, которая включает в себя как представление клиента v1, так и представление клиента v2. Рассматривайте управление версиями как часть архитектуры вашего решения, а не проблему развертывания - возможно, используя некоторую комбинацию пространств имен и маршрутизации, чтобы гарантировать, что запросы обрабатываются правильной версией.
Очевидным преимуществом модели ветвления является то, что старые версии API тривиально удалять - просто прекратите развертывание соответствующей ветки / тега - но если вы используете несколько версий, вы можете получить действительно запутанную структуру ветвей и конвейер развертывания. Модель «унифицированной кодовой базы» позволяет избежать этой проблемы, но (я думаю?) Значительно усложнит удаление устаревших ресурсов и конечных точек из кодовой базы, когда они больше не нужны. Я знаю, что это, вероятно, субъективно, поскольку вряд ли будет простой правильный ответ, но мне любопытно понять, как организации, поддерживающие сложные API-интерфейсы в нескольких версиях, решают эту проблему.