Spring 云合同 - 是消费者驱动的吗?
Spring Cloud Contract - is it Consumer Driven?
我刚开始为我们的微服务设置使用消费者驱动的合同,因为它们主要是 Spring 启动应用程序,自然选择 Spring 云合同。
但随之而来的是混乱。在文档中的所有示例中,合同都是在生产者端定义的,消费者从 maven repo 中检索它们。生产者自己定义,怎么是消费者驱动?
我的理解是,从概念上讲,消费者将它们定义为生产者对其使用的部分 API 的期望。除了前面的问题,Spring Cloud Contract 是否可以在消费者端定义合约并在生产者端验证它?
感谢您提出这个问题。是的,Spring Cloud Contract 可以是消费者驱动的或生产者驱动的。
合同定义可以放在生产者那里,也可以放在外部存储库中。消费者驱动的概念与存储合约的事实无关。这与创建合同的人或实际推动合同变更的人有关。另一件事是每个消费者是否可以定义一套自己的需求。这意味着一位消费者的要求可能与另一位消费者不同。
所以在 Spring 生产者驱动方法的云合同中,生产者只是创建合同,它并不真正关心不同的消费者是否以不同的方式使用他们的 API。 API 的生产者创建了例如1 个针对所有消费者的合同定义,与该合同保持一致是消费者的问题。
使用 Spring Cloud Contract 的消费者驱动合同,是消费者提出更改建议并创建合同定义。消费者将 PR 发送到生产者团队的仓库或存储所有合约定义的单独仓库。做这件事的不是生产者,而是消费者。与此同时,消费者可以在不征求生产者许可的情况下在本地创建存根,并对 API 进行原型制作。一旦消费者完成了它的工作并且当然之前与生产者团队讨论了更改,那么可以发送带有建议更改的拉取请求。要记住的重要一点是,每个消费者都有自己的文件夹和他们的要求。例如。如果有消费者 example1
和 example2
并且有生产者 producer1
那么在 producer1
的合同文件夹下会有 2 个文件夹,一个 example1
和第二个example2
。两者都包含对特定消费者的期望。
然后生产者接管PR,验证发生在生产者这边。生成测试。一旦实现被编写并且测试通过,就可以上传存根。
最后,在消费者端,消费者可以切换到开始获取上传的存根以始终获得最新版本的存根。
您可以在此处查看有关如何完成 CDC 完整周期的视频:https://www.youtube.com/watch?v=pDkC_00hhvA
消费者驱动契约教程:https://cloud-samples.spring.io/spring-cloud-contract-samples/tutorials/stubs_per_consumer.html
-
生产者合约教程与外部仓库中的合约:https://cloud-samples.spring.io/spring-cloud-contract-samples/tutorials/contracts_external.html
与使用 Spring Cloud Contract 进行合同测试相关的所有工作流程都可以在这里找到 - https://docs.spring.io/spring-cloud-contract/docs/current/reference/html/using.html#using
我刚开始为我们的微服务设置使用消费者驱动的合同,因为它们主要是 Spring 启动应用程序,自然选择 Spring 云合同。 但随之而来的是混乱。在文档中的所有示例中,合同都是在生产者端定义的,消费者从 maven repo 中检索它们。生产者自己定义,怎么是消费者驱动?
我的理解是,从概念上讲,消费者将它们定义为生产者对其使用的部分 API 的期望。除了前面的问题,Spring Cloud Contract 是否可以在消费者端定义合约并在生产者端验证它?
感谢您提出这个问题。是的,Spring Cloud Contract 可以是消费者驱动的或生产者驱动的。
合同定义可以放在生产者那里,也可以放在外部存储库中。消费者驱动的概念与存储合约的事实无关。这与创建合同的人或实际推动合同变更的人有关。另一件事是每个消费者是否可以定义一套自己的需求。这意味着一位消费者的要求可能与另一位消费者不同。
所以在 Spring 生产者驱动方法的云合同中,生产者只是创建合同,它并不真正关心不同的消费者是否以不同的方式使用他们的 API。 API 的生产者创建了例如1 个针对所有消费者的合同定义,与该合同保持一致是消费者的问题。
使用 Spring Cloud Contract 的消费者驱动合同,是消费者提出更改建议并创建合同定义。消费者将 PR 发送到生产者团队的仓库或存储所有合约定义的单独仓库。做这件事的不是生产者,而是消费者。与此同时,消费者可以在不征求生产者许可的情况下在本地创建存根,并对 API 进行原型制作。一旦消费者完成了它的工作并且当然之前与生产者团队讨论了更改,那么可以发送带有建议更改的拉取请求。要记住的重要一点是,每个消费者都有自己的文件夹和他们的要求。例如。如果有消费者 example1
和 example2
并且有生产者 producer1
那么在 producer1
的合同文件夹下会有 2 个文件夹,一个 example1
和第二个example2
。两者都包含对特定消费者的期望。
然后生产者接管PR,验证发生在生产者这边。生成测试。一旦实现被编写并且测试通过,就可以上传存根。
最后,在消费者端,消费者可以切换到开始获取上传的存根以始终获得最新版本的存根。
您可以在此处查看有关如何完成 CDC 完整周期的视频:https://www.youtube.com/watch?v=pDkC_00hhvA
消费者驱动契约教程:https://cloud-samples.spring.io/spring-cloud-contract-samples/tutorials/stubs_per_consumer.html
生产者合约教程与外部仓库中的合约:https://cloud-samples.spring.io/spring-cloud-contract-samples/tutorials/contracts_external.html
与使用 Spring Cloud Contract 进行合同测试相关的所有工作流程都可以在这里找到 - https://docs.spring.io/spring-cloud-contract/docs/current/reference/html/using.html#using