【问题标题】:Spring Cloud Contract - is it Consumer Driven?Spring Cloud Contract - 是消费者驱动的吗?
【发布时间】:2019-12-10 02:34:20
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    感谢您提出这个问题。是的,Spring Cloud Contract 可以是消费者驱动的,也可以是生产者驱动的。

    合约定义可以放在生产者那里,也可以放在外部存储库中。消费者驱动的概念与合约的存储位置无关。这与谁创建它们或实际上谁推动了这些合同的变化有关。另一件事是每个消费者是否可以定义一组他们自己的需求。这意味着一位消费者可能有与另一位消费者不同的要求。

    因此,在 Spring Cloud Contract 中,生产者驱动的方法中,生产者只是创建合约,并不关心不同的消费者是否以不同的方式使用他们的 API。 API 的生产者创建例如为所有消费者定义 1 个合同定义,与该合同保持一致是消费者的问题。

    使用 Spring Cloud Contract 的消费者驱动契约,是消费者建议更改并创建契约定义。消费者将 PR 发送到生产者团队的仓库或存储所有合约定义的单独仓库。做这件事的不是生产者,而是消费者。与此同时,消费者可以在本地创建存根,而无需向生产者征求许可,并对 API 进行原型制作。一旦消费者完成了它的工作,并且当然与生产者团队讨论了之前的更改,那么可以发送带有建议更改的拉取请求。要记住的重要一点是,每个消费者都有自己的文件夹,里面有他们的要求。例如。如果有消费者example1example2,并且有一个生产者producer1,那么在producer1 的合约文件夹下将有2 个文件夹,一个example1,第二个example2。两者都包含对特定消费者的期望。

    然后生产者接管 PR,并在生产者端进行验证。生成测试。一旦编写了实现并且测试通过了,就可以上传存根。

    最后,在消费者方面,消费者可以切换到开始获取上传的存根,以始终获取新版本的存根。

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

    【讨论】:

    • 感谢您的详细解答。这些教程的某个地方是否有完整的代码?
    • 当然,我们从 Spring Cloud Contract 示例生成教程 - github.com/spring-cloud-samples/spring-cloud-contract-samples
    • " 同时,消费者可以在本地创建存根,而无需向生产者请求许可,并对 API 进行原型化。" - 这是否意味着重新使用上次的存根?或者也许修改提供者的最后一个存根文件,用他们希望在提供者看到的更改更新它,然后运行它?
    • 您可以修改现有合约、创建新合约并将它们转换为存根,仅供本地使用。然后,一旦对结果感到满意,在与制作人团队进行适当的对话后,您可以提交一份 PR 并包含对合同的更改
    猜你喜欢
    • 1970-01-01
    • 2018-11-05
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-20
    • 1970-01-01
    相关资源
    最近更新 更多