java - Spring Cloud Contract - 是消费者驱动的吗?

标签 java spring-boot-test spring-cloud-contract

我刚开始为我们的微服务设置使用消费者驱动的契约(Contract),因为它们主要是 Spring Boot 应用程序,所以自然选择 Spring Cloud Contract。
但随之而来的是困惑。在文档中的所有示例中,合约都是在生产者端定义的,消费者从 maven repo 中检索它们。如果生产者定义它们,它如何是消费者驱动的?

我的理解是,从概念上讲,消费者将它们定义为生产者对其使用的部分 API 的期望。除了上一个问题,Spring Cloud Contract 是否可以在消费者端定义一个合约并在生产者端进行验证?

最佳答案

谢谢这个问题。是的,Spring Cloud Contract 可以是消费者驱动的,也可以是生产者驱动的。
契约(Contract)定义可以放在生产者那里,也可以放在外部存储库中。消费者驱动的概念与合约的存储位置无关。这与谁创建它们或实际上谁插入了这些契约(Contract)的变化有关。另一件事是每个消费者是否可以定义一组他们自己的需求。这意味着一位消费者可能有与另一位消费者不同的要求。
所以在 Spring Cloud Contract 的生产者驱动方法中,生产者只是创建合约,它并不关心不同的消费者是否以不同的方式使用他们的 API。 API 的生产者创建例如1 所有消费者的契约(Contract)定义,与该契约(Contract)保持一致是消费者的问题。
使用 Spring Cloud Contract 的消费者驱动契约,是消费者建议更改并创建契约定义。消费者将 PR 发送到生产者团队的仓库或存储所有合约定义的单独仓库。做这件事的不是生产者,而是消费者。与此同时,消费者可以在本地创建 stub ,而无需向生产者征求许可,并对 API 进行原型(prototype)制作。一旦消费者完成了工作,当然之前与生产者团队讨论了更改,那么可以发送带有建议更改的拉取请求。要记住的重要一点是,每个消费者都有自己的文件夹,里面有他们的要求。例如。如果有消费者example1example2还有一个制作人producer1然后在 producer1 下的合约文件夹会有2个文件夹,一个example1第二个 example2 .两者都将包含对特定消费者的期望。
然后生产者接管 PR,并在生产者端进行验证。生成测试。一旦编写了实现并且测试通过了,就可以上传 stub 。
最后,在消费者端,消费者可以切换到开始获取上传的 stub ,以始终获取新版本的 stub 。

  • 您可以在此处查看有关如何完成 CDC 完整周期的视频:https://www.youtube.com/watch?v=pDkC_00hhvA
  • 消费者驱动合约教程:https://cloud-samples.spring.io/spring-cloud-contract-samples/tutorials/stubs_per_consumer.html
  • Producer Contract 制作者合约教程:https://cloud-samples.spring.io/spring-cloud-contract-samples/tutorials/contracts_on_the_producer_side.html
  • Producer Contract 教程,包含外部 repo 中的合约:https://cloud-samples.spring.io/spring-cloud-contract-samples/tutorials/contracts_external.html

  • 所有与使用 Spring Cloud Contract 进行契约(Contract)测试相关的工作流程都可以在这里找到 - https://docs.spring.io/spring-cloud-contract/docs/current/reference/html/using.html#using

    关于java - Spring Cloud Contract - 是消费者驱动的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57309971/

    相关文章:

    java - 接口(interface)模拟工作不正常

    java - @Value 属性在 JUnit 测试中始终为 null

    spring-boot - 用于测试 Spring Boot 应用程序的初始化 H2 数据库期间出现异常 "org.h2.jdbc.JdbcSQLSyntaxErrorException:Table "NAME“未找到”

    java - 初始化错误无法在 Gradle 构建中调用合约测试

    java - 逻辑错误;即使在设置为 null 后,TextView 也会返回

    java - 如何捕获传递给 Groovy 脚本的参数?

    spring-boot - 为什么 WireMock 说请求不匹配? Spring Cloud 合约

    java - Spring Cloud 合约 - Feign Client

    JTextArea 中用于控制字符的 Java 图像

    spring-boot - 如何使用 spring-boot-test 中的 ApplicationContextRunner 测试 @ConfigurationProperties?