Swagger В Rbk.money — О Наших Внешних Api

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

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

Конечно, можно погуглить, что означает та или иная спецификация, можно проверить в бою, что и как (а потом так же бодро откатиться на предыдущую рабочую версию), но лучше, когда человеку дают подробную документацию.



Swagger в RBK.money — о наших внешних API

Вот о чем я говорю сегодня.

В этом посте я расскажу, почему мы в RBK.money используем Swagger, как он помогает нам в работе и какие у него проблемы.

Итак, Swagger, он же OpenAPI ( https://swagger.io/ ).

Swagger хорош тем, что включает в себя сразу кучу полезных вкусностей, посмотрите:

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

Схема описывается в кратком окончательном файле YAML или JSON, ее легко проверить, а интерфейсы можно быстро сгенерировать для любого языка.

Также можно быстро описать интерфейс в Swagger. Вот так - альтернатив особых нет в принципе.

Конечно, можно вспомнить xml, но лично мне он кажется какой-то неудобной древностью чисто с эстетической точки зрения.

Мне это вообще-то кажется важным, потому что я пытаюсь относиться к коду так, как товарищ Туполев относится к самолетам:

Swagger в RBK.money — о наших внешних API

Только красивые самолеты могут хорошо летать Да, тут можно порассуждать о точности цитаты, да и вообще вспомнить Марселя Дассо и его «un bel avion est un avion qui vole bien», но мы пока не об этом.

Надеюсь я все же передал суть.

Итак, вот оно.

В моем случае в Sublime Text то, что мы делаем, должно выглядеть красиво.

Если это спецификация, так и есть.

К сожалению, этот тезис не применим к xml. А вот YAML — никакого мусора там нет, есть только то, что вы написали.

Спецификация Swagger интересна еще и тем, что вы можете нормально делать описания и определения.

Вот и получается, что сам протокол — это интерактивная документация.

В арсенале много крутых штук, позволяющих сделать из YAML вполне приличную вещь.

Все, что мне нужно для его нормальной поддержки — немного подправить спецификации в YAML, и все, у меня есть готовая документация.

Пример интерактивной документации, построенной по спецификации с помощью скриптов ReDoc, используется нами на нашем портале разработчиков: https://developer.rbk.money/api/ .



Подробнее о преимуществах

Весь протокол виден и описан, вы знаете какие бывают типы, если вам нужно что-то проверить на степень безопасности, вы можете спокойно зайти в реализацию протокола в коде и понять, что (как минимум) все типы, которые приходят к вам, были проверены.

Это уже круто, потому что это достаточная степень защиты — набор входящих данных в команду управления известен, и можно легко контролировать соответствие этого набора схеме.

Сразу оговорюсь, полной гарантии безопасности это не дает (спойлер: вообще ничего не дает), но сразу закрывает огромную кучу потенциальных дыр.

Подобный протокол также рассматривается быстро.

К новой сущности добавляется какое-то определение, например, возвратный платеж.

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

Потому что возврат платежей, в принципе, — это по сути очень сложный бизнес-процесс.

И очень тяжелый.

Но здесь оно уместилось в 6 файлов и 224 строки.

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

В общем, ребята, это действительно удобно.

Отладка также доставляет удовольствие.

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

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

В процессе взять отпуск (или больничный) довольно сложно.

Тем более, что в такой схеме все должно быть дико защищено, а хочется открытости и прозрачности.

Чтобы можно было быстро выдернуть из консоли curl и посмотреть, как в целом обстоят дела.

Существует достаточно типов данных; до сих пор у нас никогда не было ситуации, когда нам не хватало типов данных.

И вот еще что.

Вы собрали распределенную команду, собрали все вместе, кто-то написал клиент, кто-то сервер, вы собственно пошли писать UX/UI для бэкенда.

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

Вы можете начать писать интерфейс еще до того, как бэкенд допьет кофе и включит компьютер, чтобы начать работу.

А потом пишешь бэкенд, меняешь эндпойнт и получаешь готовое решение.

То есть вы можете не только распараллелить разработку, но и отделить зависимости команд. Это классная вещь.



Минусы, есть ли недостатки?

И где бы мы были без них? Это отличная вещь, но еще не панацея.

Во-первых, кодогенератор Swagger на самом деле не работает. Нам пришлось его сократить, но мы настолько увлеклись, что в итоге написали свой собственный.

Теперь мы можем генерировать методы и классы.

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

На самом деле у вас нет ни клиента, ни сервера.

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

Во-вторых, на старте у нас был конфликт такого рода.

Внутри платформы у нас есть Thrift. В то же время снаружи у нас есть Swagger. Я, кстати, до сих пор не могу себе признаться, что мы точно всё сделали правильно, и что хорошо, что Сваггера не взяли сразу везде.

А так работы стало в два раза больше, переводчиков протоколов и прочих радостей.

Кстати, почему Бережливость - у нас были готовые разработки для rpc и клиент-серверных вещей, решавших транспортные задачи.

Мы быстро прикрутили реализацию Google Dapper, реализацию идеи о том, что в распределенной микросервисной среде обязательно нужно уметь отслеживать запросы.

То есть понять, через какую цепочку микросервисов идут эти самые вопросы, и где они глупы, если они глупы.

Подробнее об этом будет в одном из следующих постов.

И оказалось, что внутри все есть, а снаружи надо делать что-то свое.

А также список изменений.

Автоматизация журнала изменений здесь крайне слаба.

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

А поскольку все время что-то приходится делать вручную, потому что это невозможно автоматизировать, то это делаться вообще не будет. А теперь это немного мешает моей работе; например, я не могу нормально объяснить клиентам, в чем разница между API 2.0 и API 3.0 — нет журнала изменений.

И примеров нет. Обычно они существуют, но здесь их придется прописать самостоятельно в генераторе документации.

Это не так уж сложно, но требует времени.



Общий

В целом мы довольны, но есть нюансы — в документации не отражены некоторые вложенные структуры, теперь это 3-я спецификация, на которую мы пока не можем мигрировать и живем по второй.

Но это наш технический долг.

Итак, давайте бороться.

И даже если мне что-то больше не понравилось, сбросить это больше некуда.

Вдруг вы предложите что-нибудь интересное по теме в комментариях.

Я бы, конечно, не променял Swagger на какой-то отдельный костыль, потому что что-то костыльное и свое в конечном счете даже хуже, чем что-то посредственное, но стандартное.

И вот почему.

В принципе, я был бы очень рад, если бы все, кто сейчас открывает API, пошли в сторону Swagger, посмотрите — это сообщество, в первую очередь.

Пришедшее сообщество посмотрит на стандарт, на спецификацию, и она начнет развиваться.

Там, где кому-то что-то не нравится, они это доделают и сделают лучше.

Стандарт здесь всегда предпочтительнее.



Swagger в RBK.money — о наших внешних API

Потому что стандарт можно улучшить.

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

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

Взять и оценить можно здесь .

Замечание после обсуждения в комментариях.

Если начинать с нуля, то следует сразу сосредоточиться на спецификации Открытая спецификация API 3.0 .

Вкусностей кардинально больше, можно сказать, что это практически новый стандарт, сильно отличающийся от версии 2. Теги: #платежные системы #api #Микросервисы #java #Распределенные системы #Erlang/OTP #RBKmoney

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.