REST API: несколько версий, одно приложение? - PullRequest
0 голосов
/ 24 октября 2018

Я работаю над REST API, где скоро мне придется внести некоторые критические изменения, поэтому необходима версия v2.Нам по-прежнему необходимо поддерживать v1 в течение пары месяцев, хотя параллельно, чтобы дать нашим клиентам время для перехода на новый API, когда они будут готовы.Наш API предлагается через разделяемое облако, и все наши клиенты используют один и тот же системный бэкэнд, особенно одну общую базу данных.

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

Однако я спрашиваю себя, как на самом деле я собираюсь реализовать этои я не нашел хороших статей по этому поводу.Я на самом деле не хочу переходить с v2 моего проекта, а затем собирать и развертывать v1 и v2 как отдельные приложения, потому что тогда у меня будет обслуживание, исправление ошибок, изменения конфигурации и т. Д. В двух приложениях, что является двойной работой и несет обычнуюОпасность избыточности (то есть: возможные несоответствия между версиями).Кроме того, версия v2, конечно, не отличается в каждой службе, поэтому большая часть кода все равно будет одинаковой.

Существуют ли рекомендации по технической реализации REST API в одном приложении, которое предоставляет нескольковерсии извне, и где некоторый код является общим (то есть: v2 / someService будет внутренне перенаправлять на v1 / someService), и только фактические различия закодированы в новых сервисах?Может быть, есть даже фреймворки, которые помогают в разработке этого?Приложение написано на Java с Spring MVC, если это полезно.

Я благодарен за любые советы или ресурсы о том, как справиться с этим.Спасибо!

Ответы [ 4 ]

0 голосов
/ 25 июня 2019

Я хотел бы обсудить следующие стратегии в обсуждении, обе стратегии в Непрерывная доставка .

Абстракция ветви

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

https://martinfowler.com/bliki/BranchByAbstraction.html

Переключение функций

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

https://martinfowler.com/articles/feature-toggles.html

0 голосов
/ 24 октября 2018

Дилемма v1 / v2 - это сильный намек на то, что у вас фактически нет REST API для начала.Пиры в архитектуре REST обмениваются более или менее стандартизированным контентом клиентами, запрашивающими представления медиа-типов, которые они понимают.Этот метод называется согласованием типа контента.Конечно, плохо написанный сервер может игнорировать предложенные типы медиа и отправлять тот, который клиент не понимает.Это, однако, предотвратит дальнейшее взаимодействие клиента с сервером.Поэтому сервер с хорошим поведением должен пытаться обслуживать клиентский запрос как можно лучше.

Согласно Филдингу:

API REST должен тратить почти все свои описательные усилия наопределение типа (типов) мультимедиа, используемых для представления ресурсов и управления состоянием приложения, или определение расширенных имен отношений и / или разметки с поддержкой гипертекста для существующих стандартных типов мультимедиа.Любое усилие, затрачиваемое на описание того, какие методы использовать для каких интересующих URI, должно быть полностью определено в рамках правил обработки для типа носителя (и в большинстве случаев уже определено существующими типами носителя).[ Ошибка здесь подразумевает, что внешняя информация управляет взаимодействием вместо гипертекста .]
Источник

Тип носителя описывает, какСинтаксис полезной нагрузки, обмениваемой для такого медиа-типа, выглядит так же, как и семантика каждого элемента в этом представлении.С помощью осмысленных имен отношений ссылок и типов мультимедиа сервер может обучить клиента следующим доступным опциям, которые клиент может использовать при выполнении своей задачи.Т.е. вспомним случай, когда в предыдущем ответе содержалось отношение ссылки create к клиенту.Клиент на самом деле не знает, как что-то должно выглядеть для того, чтобы его можно было обрабатывать на сервере, поэтому при вызове URI, возвращаемого для имени отношения ссылки create, сервер отвечает представлением в виде формы вдоль строки application/vnd.xyz-form+jsonгде этот тип мультимедиа определяет некоторые элементы управления вводом, которые клиент может использовать для генерации представления запроса, ожидаемого сервером на целевой конечной точке.Как и в Интернете, пользовательская форма также содержит действие HTTP, а также целевой URI, предоставленный клиентом для отправки ответа, и в конечном итоге также предпочтительное представление сервера.

Клиенты в архитектуре REST не должны 'насчет URI, поэтому возвращение URI, содержащего v1 или v2, должно быть для них более или менее бессмысленным.Филдинг даже заявил, что сам REST API вообще не должен иметь версию !Что важно, так это то, что клиент и сервер способны понять полученную полезную нагрузку.

Вместо управления версиями URI или API тип носителя, описывающий синтаксис и семантику, фактически должен быть версионирован.То есть, если вы посмотрите на веб-браузер на основе браузера (большой брат REST) ​​и, в частности, на HTML, вы заметите, что он разработан таким образом, чтобы требовать, чтобы новая версия оставалась обратно совместимой.Т.е. клиент и сервер, получающие определенную полезную нагрузку text/html, смогут обрабатывать чистый HTML (1.0) вплоть до содержимого HTML5 независимо от того, какой синтаксис (даже смесь) использовался.Однако другие типы носителей могут быть не такими снисходительными.Здесь вы можете использовать профили или зарегистрировать совершенно новый тип носителя, если считаете, что старый и новый полностью несовместимы друг с другом.

В любом случае, я надеюсь, что смогу пролить немного света наREST архитектура и как вы могли бы туда добраться.Мне хорошо известно, что мое предложение может быть нелегко реализовать, хотя, получив его, вы в основном отделили клиентов от своего API и дали последнему свободу развиваться, не опасаясь взлома клиентов.Связь все еще будет, но и клиент, и сервер будут связываться с типами мультимедиа, а не друг с другом.Перед созданием нового медиа-типа, вероятно, стоит поискать уже существующих

0 голосов
/ 24 октября 2018

Надеюсь, вы видели

  1. Дизайн API, обеспечивающий обратную совместимость
  2. http://static.googleusercontent.com/media/research.google.com/en//pubs/archive/32713.pdf

Наличие двух версий API в одном приложении достаточно тихо

api.mysite.com / [version1] / api / url

api.mysite.com / [version2]/ api / url

Не знаете, зачем вам создавать и развертывать v1 и v2 как отдельные приложения?Если вы не планируете непрерывное обновление с нулевым временем простоя в производстве

0 голосов
/ 24 октября 2018

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

Если v2 не обратно совместим с v1вы можете переместить v1 на другой сервер и уведомить своих пользователей о том, что он находится там в течение установленного ограниченного периода, чтобы дать им время для внесения изменений в код, необходимых для перехода на v2, но также уведомить их о том, что эта версия больше не используется.обновляется, и если у них есть проблемы, им нужно будет перейти на новую версию.Следовательно, v2 - это HEAD-версия вашей кодовой базы, в которой нет других разрабатываемых ветвей.

Надеюсь, это поможет и предложит то, о чем вы еще не думали.

...