Что такое consumer-driven contracts и зачем они нужны?
1️⃣ Как кратко ответить
Consumer-driven contracts — это подход к тестированию взаимодействия между микросервисами, где контракт между сервисами определяется потребителем (consumer) и проверяется поставщиком (provider). Они помогают гарантировать, что изменения в API поставщика не нарушат работу потребителя, обеспечивая стабильность и согласованность в распределенных системах.
2️⃣ Подробное объяснение темы
В современных распределенных системах, таких как микросервисные архитектуры, взаимодействие между сервисами происходит через API. Каждый сервис может быть как потребителем (consumer), так и поставщиком (provider) данных. Важно, чтобы изменения в API одного сервиса не нарушали работу других сервисов, которые зависят от него. Здесь на помощь приходят consumer-driven contracts.
Consumer-driven contracts (CDC) — это методология, при которой контракт между потребителем и поставщиком API определяется потребителем. Контракт описывает, как потребитель ожидает, что API будет себя вести. Поставщик затем использует этот контракт для проверки, что его API соответствует ожиданиям потребителя.
Зачем нужны consumer-driven contracts?
- Стабильность системы: CDC помогает предотвратить ситуации, когда изменения в API одного сервиса нарушают работу других сервисов, которые от него зависят.
- Независимость разработки: Потребители и поставщики могут разрабатывать и тестировать свои части системы независимо друг от друга, зная, что контракт обеспечит совместимость.
- Ускорение разработки: CDC позволяет быстрее вносить изменения в систему, так как разработчики могут быть уверены, что их изменения не нарушат работу других сервисов.
- Документация: Контракты служат живой документацией, которая всегда актуальна и отражает текущее состояние взаимодействия между сервисами.
Как это работает?
-
Определение контракта: Потребитель определяет контракт, описывающий, как он ожидает, что API будет себя вести. Это может включать в себя ожидаемые запросы и ответы, форматы данных и т.д.
-
Проверка контракта: Поставщик использует контракт для тестирования своего API. Это может быть автоматизировано с помощью инструментов, таких как Pact, которые позволяют генерировать тесты на основе контракта.
-
Валидация изменений: Перед развертыванием изменений в API, поставщик проверяет, что его изменения не нарушают контракт. Это может быть частью процесса CI/CD.
Пример использования Pact
Pact — это один из популярных инструментов для реализации consumer-driven contracts. Рассмотрим простой пример использования Pact для тестирования взаимодействия между потребителем и поставщиком.
Пример кода
from pact import Consumer, Provider
import requests
# Создаем потребителя и поставщика
consumer = Consumer('ConsumerService')
provider = Provider('ProviderService')
# Определяем контракт
with consumer.has_pact_with(provider) as pact:
# Ожидаемый запрос и ответ
pact.given('User exists') \
.upon_receiving('a request for user data') \
.with_request('get', '/user/1') \
.will_respond_with(200, body={'id': 1, 'name': 'John Doe'})
# Проверка, что поставщик соответствует контракту
with pact:
# Выполняем запрос к поставщику
response = requests.get('http://localhost:1234/user/1')
# Проверяем, что ответ соответствует ожиданиям
assert response.json() == {'id': 1, 'name': 'John Doe'}
- Создание потребителя и поставщика: Мы создаем объекты
ConsumerиProvider, которые представляют наш потребительский и поставщицкий сервисы. - Определение контракта: Используем метод
has_pact_withдля определения контракта. В данном случае, мы ожидаем, что при запросеGET /user/1поставщик вернет статус 200 и тело ответа с данными пользователя. - Проверка контракта: Внутри блока
with pactмы выполняем реальный HTTP-запрос к поставщику и проверяем, что ответ соответствует ожиданиям, описанным в контракте.
Consumer-driven contracts обеспечивают надежное взаимодействие между микросервисами, минимизируя риски, связанные с изменениями в API, и ускоряя процесс разработки.
🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!
Подписаться