Загрузочное приложение Spring Cloud Stub Runner и Cloud Stream (Kafka) для Smoke Test

В микросервисной архитектуре у меня есть три сервиса. Первый создает сообщение в очереди кафка с весенним облачным потоком. В этом сервисе я использую весенний облачный контракт для создания контракта. Вторая служба - это служба загрузки Spring Cloud Stub Runner, которая считывает контракты первой службы и предоставляет их третьей службе. Третий сервис выполняет дымовой тест против сервиса stub runner, используя endpont / triiggers / {label}. Я понимаю, что когда я вызываю / triggers / {label}, исполнитель заглушки службы должен отправлять сообщение, созданное в контракте службы, в очередь kafka, но никогда не отправляет его в очередь. Как я могу сделать так, чтобы служба stub runner отправляла сообщение контракта в очередь kafka ?. Спасибо

Код:

Сервис 1

Договор:

org.springframework.cloud.contract.spec.Contract.make {

    description 'Register event: Customer registered'

    label 'CustomerRegistered'

    input {
        // the contract will be triggered by a method
        triggeredBy('registerEvent()')
    }
    // output message of the contract
    outputMessage {
        // destination to which the output message will be sent
        sentTo 'ClassCustomerEvent'
        // the body of the output message
        body('''{"id":1,"eventType":"CustomerRegistered","entity": {"clientId":1,"clientName":"David, Suarez, Pascual","classCalendarId":1,"classCalendarName":"Aula 1 - Aerobic","classCalendarDayId":7}}''')
    headers {
        header('contentType', applicationJson())
    }
}

}

Услуга 2:

application.yml:

spring:
  cloud:
    stream:
      kafka:
        binder:
          brokers: localhost
          zkNodes: localhost
      default-binder: kafka

stubrunner:
  cloud:
    stubbed:
      discovery:
        enabled: false

stubrunner:
  stubsMode: LOCAL
  ids:
    - com.elipcero.classcustomerschool:classcustomer-school:1.0.0:stubs:8762

Основной:

@SpringBootApplication
@EnableStubRunnerServer
@EnableBinding
@AutoConfigureStubRunner
public class ClassCustomerStubrunnerSchoolApplication {

    public static void main(String[] args) {

SpringApplication.run(ClassCustomerStubrunnerSchoolApplication.class, args);
}
}

Сервис 3

SmokeTest:

@Test
public void should_calculate_client_total_by_classrooom_and_set_class_by_client() {

    mongoOperations.dropCollection("CustomerClass");
    mongoOperations.dropCollection("ClassCustomerDayTotal");

    String url = this.stubRunnerUrl + "/triggers/CustomerRegistered";

    log.info("Mongo collections deletes");
    log.info("Url stub runner boot: " + url);

    ResponseEntity<Map> response = this.restTemplate.postForEntity(url, "", Map.class);
    then(response.getStatusCode().is2xxSuccessful()).isTrue();

    log.info("Triggered customer event");

    await().until( () ->
         customerClassRepository
                 .findById(1)
                 .map((c) -> c.getClasses().isEmpty())
                 .orElse(false)
    );
 }

Раковина:

@Service
@EnableBinding(ClassCustomerConsumer.class)
@RequiredArgsConstructor
public class ClassCustomerEvent {

    public static final String CONST_EVENT_CUSTOMER_REGISTERED = "CustomerRegistered";
    public static final String CONST_EVENT_CUSTOMER_UNREGISTERED = "CustomerUnregistered";

    @NonNull private ClassCustomerTotalView classCustomerTotalView;
    @NonNull private CustomerClassView customerClassView;

    @StreamListener(ClassCustomerConsumer.INPUT)
    public void ConsumeClassCustomerEvent(EventMessage<ClassCustomer> eventMessage) {
        classCustomerTotalView.calculate(eventMessage);
        customerClassView.selectOrUnSelected(eventMessage);
    }
}

Вот вам пример такого сценария с кроликом github.com/spring-cloud-samples/…. Можете ли вы проверить это и увидеть, делаете ли вы то же самое?

Marcin Grzejszczak 07.08.2018 19:41

Спасибо, я основан на github.com/spring-cloud-samples/…, и я думаю, что делаю то же самое.

David Suárez 07.08.2018 20:15

Мне кажется, что созданный канал - это DirectChannel с диспетчером типа org.springframework.cloud.stream.test.binder.TestSupportBind‌ er. Этот обработчик хранит сообщения в памяти. Есть ли способ использовать обработчик kafka вместо связующего устройства потокового теста?

David Suárez 08.08.2018 08:34

Вы исключили автоконфиг? TestSupportBinderAutoConfiguration?

Marcin Grzejszczak 08.08.2018 09:18

Да, я использовал @SpringBootApplication (exclude = {TestSupportBinderAutoConfiguration.class}), но не работал. Я не знаю почему?

David Suárez 08.08.2018 09:34

Можете ли вы загрузить код на гитхаб?

Marcin Grzejszczak 08.08.2018 09:34

Да, бегунок заглушки здесь: github.com/davsuapas/DanceSchool/tree/Smoke_Test/… и контракт здесь: github.com/davsuapas/DanceSchool/blob/Smoke_Test/…

David Suárez 08.08.2018 09:42

Я думаю, что проблема в StubRunnerStreamsIntegrationAutoConfiguration из-за добавления TestSupportBinderAutoConfiguration в ImportAutoConfiguration. Хотя он должен работать ConditionalOnClass. Я думаю, что этого класса не было в версии Dalston.SR3, которая использовалась в образце github-analytics-stub-runner-boot

David Suárez 08.08.2018 10:55

Отличный анализ, позвольте мне попробовать передать эту версию Финчли и посмотрим, что произойдет.

Marcin Grzejszczak 08.08.2018 11:07

В худшем случае вы можете использовать Edgware или Dalston в качестве временного решения, верно?

Marcin Grzejszczak 08.08.2018 11:09

Хорошо, я попробую

David Suárez 08.08.2018 11:18
0
11
433
1

Ответы 1

Исправлено в мастере для следующей версии после spring-cloud-contract-v2.1.0.M2

Ссылка на выпуск: https://github.com/spring-cloud/spring-cloud-contract/pull/805

Другие вопросы по теме