对于我们的微服务设置,我只是从消费者驱动合同开始,由于它们主要是Spring Boot应用程序,因此自然选择Spring Cloud Contract。 但是随之而来的是混乱。在docs的所有示例中,合同都是在生产方定义的,消费者从maven仓库中检索合同。如果生产者定义它们,它是由消费者驱动的吗?
我的理解是,从概念上讲,消费者将它们定义为生产者对其使用的部分API的期望。除了上一个问题外,Spring Cloud Contract是否可以在消费者方定义合同并在生产者方进行验证?
答案 0 :(得分:5)
感谢这个问题。是的,Spring Cloud Contract可以由消费者驱动或由生产者驱动。
合同定义可以由生产者提供,也可以位于外部存储库中。消费者驱动的概念与合同存储的事实无关。这与创建合同的人或推动合同变更的人有关。另一件事是每个消费者是否可以定义一组自己的需求。这意味着一个消费者可以有与另一个消费者不同的需求。
因此,在针对生产者驱动方法的Spring Cloud Contract中,生产者只是创建合同,而实际上并不关心不同的使用者是否以不同的方式使用其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_on_the_producer_side.html
生产者合同教程,其中包含外部回购中的合同:https://cloud-samples.spring.io/spring-cloud-contract-samples/tutorials/contracts_external.html