- Регистрация
- 12.04.17
- Сообщения
- 19.095
- Реакции
- 107
- Репутация
- 0
- ваша система состоит из множества взаимосвязанных сервисов?
- всё ещё вручную актуализируете код сервисов при изменении публичного API?
- изменения в ваших сервисах часто подрывают работу других, а другие разработчики вас за это ненавидят?
Если ответили да хотя бы один раз, то добро пожаловать!
Термины
Публичные контракты, спецификации – публичные интерфейсы, через которые можно взаимодействовать с сервисом. В тексте означают одно и то же.
О чем статья
Узнаете, как сократить время на разработку веб-сервисов, используя инструменты унифицированного описания контрактов и автоматической генерации кода.
Грамотное использование описанных ниже техник и инструментов позволит быстрее выкатывать новые фичи и не ломать старые.
Как выглядит проблема
Есть система, которая состоит из нескольких сервисов. Эти сервисы закреплены за разными командами.
Сервисы-потребители зависят от сервиса-поставщика.
Система развивается, и однажды сервис-поставщик меняет свои публичные контракты.
Если сервисы-потребители не готовы к изменениям, то система перестает полноценно работать.
Как решить эту проблему
Команда сервиса поставщика сама всё поправит
Так можно поступить, если команда поставщика владеет предметной областью других сервисов и имеет доступ к их git-репозиториям. Это сработает только в небольших проектах, когда зависимых сервисов немного. Это самый дешевый вариант. По возможности, следует воспользоваться им.
Актуализировать код своего сервиса команде потребителя
Почему ломают другие, а чиним мы?
Однако главный вопрос — это как починить свой сервис, как теперь выглядит контракт? Нужно изучать новый код сервиса поставщика или обращаться к их команде. Тратим время на изучение кода и на взаимодействие с другой командой.
Подумать, что сделать чтобы проблема не проявлялась
Самый разумный вариант в долгосрочной перспективе. Рассмотрим его в следующем разделе.
Как не допустить проявления проблемы
Жизненный цикл разработки ПО можно представить тремя этапами: проектирование, реализация и тестирование.
Каждый из этапов нужно расширить следующим образом:
- на этапе проектирования декларативно определяем контракты;
- во время реализации генерируем серверный и клиентский код по контрактам;
- при тестировании проверяем контракты и стараемся учитывать потребности клиентов (CDC).
Каждый из этапов объясняется далее на примере нашей проблемы.
Как проблема выглядит у нас
Так выглядит наша экосистема.
Кружочки – сервисы, а стрелочки – каналы общения между ними.
Frontend – клиентское web-приложение.
Большинство стрелок ведут в Storage Service. В нем хранятся документы. Это самый важный сервис. Ведь наш продукт – это система электронного документооборота.
Стоит этому сервису поменять свои контракты, система сразу перестанет работать.
Исходники нашей системы преимущественно написаны на c#, но также есть сервисы на Go и Python. В данном контексте неважно, чем занимаются остальные сервисы на рисунке.
В каждом сервисе своя реализация клиента для работы с сервисом хранилищ. При изменении контрактов нужно вручную актуализировать код в каждом проекте.
Хочется уйти от ручной актуализации в сторону автоматической. Это поможет увеличить скорость изменения клиентского кода и сократить количество ошибок. Под ошибками понимаются опечатки в URL, ошибки из-за невнимательности и т.п.
Однако, этим подходом не исправишь ошибки в клиентской бизнес-логике. Скорректировать её можно только вручную.
От проблемы к задаче
В нашем случае требуется реализовать автоматическую генерацию клиентского кода.
При этом нужно учитывать следующее:
- серверная часть – контроллеры уже написаны;
- браузер является клиентом сервиса;
- сервисы взаимодействуют по HTTP;
- генерация должна настраиваться. Например, для поддержки JWT.
Вопросы
В ходе решения задачи встали вопросы:
- какой инструмент выбрать;
- как получить контракты;
- где расположить контракты;
- где расположить код клиента;
- в какой момент выполнять генерацию.
Дальше приводятся ответы на эти вопросы.
Какой инструмент выбрать
Инструменты для работы с контрактами представлены по двум направлениям – RPC и REST.
Под RPC можно понимать просто удаленный вызов, в то время как REST требует соблюдения дополнительных условий на HTTP-глаголы и URL.
Отличия в вызове RPC и REST представлены здесь
RPC – Remote procedure call | REST Representational State Transfer |



