Контракты, управляемые потребителями (CDC): обеспечение бесперебойного взаимодействия в распределенных системах

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

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

Преимущества контрактов, ориентированных на потребителя:

  1. Раздельная разработка: CDC обеспечивают независимую разработку и развертывание сервисов, обеспечивая четкое понимание ожидаемого поведения между сервисами. Это позволяет командам работать параллельно, не полагаясь на синхронную координацию.

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

  3. Более быстрые итерации. С помощью CDC поставщики услуг могут уверенно вносить изменения в свою реализацию при условии соблюдения установленных контрактов. Затем потребители смогут проверить эти изменения на соответствие своим ожиданиям, что позволит ускорить итерации и получить возможность самостоятельно выпускать обновления.

Методы реализации потребительских контрактов:

  1. 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
  1. 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
    }
}
  1. 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 в свой процесс разработки, вы сможете обеспечить бесперебойное взаимодействие и поддерживать стабильность своих распределенных систем.