В распределенной системе, где несколько сервисов взаимодействуют друг с другом через API, поддержание согласованности и предотвращение регрессий может оказаться сложной задачей. Именно здесь в игру вступают контракты, ориентированные на потребителя (CDC). CDC — это подход к тестированию, который обеспечивает независимую разработку и развертывание сервисов путем заключения соглашений между потребителями и поставщиками услуг. В этой статье мы рассмотрим концепцию CDC, ее преимущества и обсудим различные методы с примерами кода для реализации CDC в ваших проектах.
Понимание контрактов, ориентированных на потребителя (CDC).
Контракты, ориентированные на потребителя, – это метод проектирования и тестирования взаимодействия между поставщиками услуг и потребителями. В отличие от традиционных контрактов, которые пишутся и исполняются поставщиками услуг, CDC управляются потребителями. CDC определяют ожидания потребителей относительно поведения и данных, которыми обмениваются поставщики услуг. Они стремятся гарантировать, что изменения, внесенные поставщиками, не нарушат функциональность потребителей.
Преимущества контрактов, ориентированных на потребителя:
-
Раздельная разработка: CDC обеспечивают независимую разработку и развертывание сервисов, обеспечивая четкое понимание ожидаемого поведения между сервисами. Это позволяет командам работать параллельно, не полагаясь на синхронную координацию.
-
Уменьшение регрессии. Определяя явные контракты между потребителями и поставщиками, CDC помогают обнаруживать критические изменения на ранних этапах цикла разработки. Это снижает вероятность регресса и нарушения существующих функций.
-
Более быстрые итерации. С помощью CDC поставщики услуг могут уверенно вносить изменения в свою реализацию при условии соблюдения установленных контрактов. Затем потребители смогут проверить эти изменения на соответствие своим ожиданиям, что позволит ускорить итерации и получить возможность самостоятельно выпускать обновления.
Методы реализации потребительских контрактов:
- Pact:
Pact — это популярная платформа CDC, позволяющая определять и проверять контракты между поставщиками услуг и потребителями. Он поддерживает несколько языков программирования и предоставляет инструменты для тестирования контрактов, включая Pact Broker для управления контрактами.
Пример фрагмента кода с использованием Pact (в Ruby):
# Consumer test
Pact.provider_states_for('Consumer') do
provider_state('data exists') do
set_up do
# Prepare test data
end
end
end
Pact.consumer_contract('Consumer') do
has_pact_with('Provider') do
mock_service(:provider) do
port 1234
end
honours_pact_with('Consumer') do
pact_uri 'https://pact-broker.example.com/pacts/provider/Consumer/latest'
end
end
end
- Spring Cloud Contract:
Spring Cloud Contract — это платформа, которая облегчает реализацию CDC для приложений Java и Spring. Он позволяет определять контракты с помощью Groovy или YAML и автоматически создает заглушки для поставщиков услуг и тесты для потребителей.
Пример фрагмента кода с использованием Spring Cloud Contract (в Groovy):
// Contract definition
Contract.make {
request {
method 'GET'
url '/api/users'
}
response {
status 200
body(
[
id: 1,
name: 'John Doe',
email: 'john.doe@example.com'
]
)
}
}
// Consumer test
@SpringBootTest
@AutoConfigureStubRunner
class ConsumerContractTest {
@Autowired
private RestTemplate restTemplate
@Test
void shouldRetrieveUser() {
def user = restTemplate.getForObject('/api/users', User.class)
// Assertions
}
}
- Pactflow:
Pactflow — это коммерческое предложение, созданное на основе Pact и предоставляющее дополнительные функции для управления контрактами и совместной работы над ними. Он предлагает веб-интерфейс для управления контрактами, управления версиями и тестирования контрактов.
Пример фрагмента кода с использованием Pactflow (в JavaScript):
// Consumer test
const { Pact } = require('@pact-foundation/pact')
const { like, eachLike } = require('@pact-foundation/pact/dsl/matchers')
const provider = new Pact({
consumer: 'Consumer',
provider: 'Provider',
port: 1234
})
// Define contract expectations
provider
.given('data exists')
.uponReceiving('a request for user data')
.withRequest({
method: 'GET',
path: '/api/users'
})
.willRespondWith({
status: 200,
body: eachLike({
id: like(1),
name: like('John Doe'),
email: like('john.doe@example.com')
})
})
// Run the test
provider.run(async () => {
// Make API request to provider
const response = await axios.get('http://localhost:1234/api/users')
// Assertions
})
// Cleanup
provider.finalize()
Контракты, управляемые потребителем, предлагают мощный подход, обеспечивающий плавное взаимодействие между службами в распределенных системах. Переложив ответственность за определение контрактов на потребителей, CDCsenable отделила разработку, сократила количество регрессий и ускорила итерации. В этой статье мы рассмотрели концепцию CDC и обсудили три популярных метода реализации CDC: Pact, Spring Cloud Contract и Pactflow. Каждый метод предоставляет инструменты и платформы для определения, проверки и тестирования контрактов между поставщиками услуг и потребителями. Включив CDC в свой процесс разработки, вы сможете обеспечить бесперебойное взаимодействие и поддерживать стабильность своих распределенных систем.