【问题标题】:Spring Cloud Contract and two services that are both producers and consumersSpring Cloud Contract 和两个既是生产者又是消费者的服务
【发布时间】:2018-11-05 21:39:25
【问题描述】:

TL;DR:如何为交换信息的两个服务生成存根(因此它们都是生产者和消费者)?

嗨,

我正在使用带有 maven、Spring Boot、Spring Cloud Stream、Spring Cloud Contract Verifier 和 Stub Runner 的微服务架构开发一个应用程序,用于集成测试。我正在使用事件溯源通过 Kafka 发布事件。所以我有这样的事情:

my-app
|-- pom.xml (sets up both subprojects as children)
|-- person-service (handles person's money)
|  |-- src/main/java/person/EventProducer.java (produces a personCreated event)
|  `-- src/main/java/person/EventConsumer.java (consumes an objectBought event)
`-- object-service (handles objects that can be bought)
   |-- src/main/java/object/EventProducer.java (produces an objectBought event)
   `-- src/main/java/object/EventConsumer.java (consumes a personCreated event)

现在,我的问题是,对于事件溯源,两种服务都是生产者和消费者。所以我有两个服务生成存根供另一个服务使用,如下所示:

个人服务集成测试

@SpringBootTest(classes = PersonApplication.class, webEnvironment = RANDOM_PORT)
@AutoConfigureStubRunner(ids = "example.com:object-service", stubsMode = LOCAL)
class PersonIntegrationTests extends Specification {
    @Inject StubTrigger stubTrigger
    // tests
}

对象-服务集成测试

@SpringBootTest(classes = ObjectApplication.class, webEnvironment = RANDOM_PORT)
@AutoConfigureStubRunner(ids = "com.example:person-service", stubsMode = LOCAL)
class ObjectIntegrationTests extends Specification {
    @Inject StubTrigger stubTrigger
    // tests
}

当然,现在,在父项目中运行 mvn clean install 会给我一个错误,因为无论构建顺序如何,尚未生成其他项目中的存根。

我查看了 Spring Cloud Contract Verifier 文档及其示例,但我还没有找到适合这种情况的解决方案。

现在作为一种解决方法,我首先运行 mvn clean install -DskipTests 以首先生成存根,然后运行 ​​mvn clean install 以运行所有测试。我还尝试设置两个服务都可以使用的外部合同项目,但每个服务仍会生成自己的存根。我认为将 stubsMode 更改为 CLASSPATH 也无济于事,因为仍然需要首先创建存根...

我想创建一个“存根服务”来实现每个服务的生产者,这样每个项目都会引用它来获取存根(所以我会在每个集成测试中使用ids = "com.example:stub-service")。但这似乎很麻烦,并且可能导致人为错误,因为合同的每次更改以及在 Event Store 中发布的每个附加服务都需要反映在存根服务中。

我的问题是:在运行我的集成测试之前,有没有更好的方法来为两个项目生成存根?我希望能够仅使用 mvn clean install 构建和运行集成测试。

【问题讨论】:

    标签: java maven spring-cloud-stream spring-cloud-contract


    【解决方案1】:

    这是一个很好的问题。这是一个先有鸡还是先有蛋的问题。

    现在作为一种解决方法,我首先运行 mvn clean install -DskipTests 来生成存根,然后运行 ​​mvn clean install 来运行所有测试。我还尝试设置两个服务都可以使用的外部合同项目,但每个服务仍然会生成自己的存根

    这似乎很合理。您还可以将一些测试放在不同的套件中,首先使用一个配置文件(例如producer)运行测试,然后再运行另一个配置文件(例如consumer)。但是你做的似乎是最快的。

    您可以在 Spring Cloud Contract 中提出问题,我们可以尝试调查在这种情况下如何让开发人员的生活更轻松。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多