我刚开始为我们的微服务设置使用消费者驱动的契约(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)制作。一旦消费者完成了工作,当然之前与生产者团队讨论了更改,那么可以发送带有建议更改的拉取请求。要记住的重要一点是,每个消费者都有自己的文件夹,里面有他们的要求。例如。如果有消费者example1
和 example2
还有一个制作人producer1
然后在 producer1
下的合约文件夹会有2个文件夹,一个example1
第二个 example2
.两者都将包含对特定消费者的期望。
然后生产者接管 PR,并在生产者端进行验证。生成测试。一旦编写了实现并且测试通过了,就可以上传 stub 。
最后,在消费者端,消费者可以切换到开始获取上传的 stub ,以始终获取新版本的 stub 。
所有与使用 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/