您能否简单解释什么是消费者驱动的合同?

时间:2015-04-02 13:25:31

标签: architecture client-server

我正在阅读有关消费者驱动合同的this article ,但却没有正确理解。任何人都可以用简单的语言告诉我它是什么以及我们如何在C#中实现(任何伪代码都可以)?

2 个答案:

答案 0 :(得分:1)

根据我的理解,消费者驱动的合同归结为

  • 客户只承担并断言其需要

有几种有效的方法来管理这种范式

  1. 客户首先发现可用的实体字段
  2. 客户端仅查询所需的内容。
  3. 服务器作为服务提供商的“合同”的一部分,提供与他们集成的客户端。这样可以最大程度地控制与服务提供商的过度交互。虽然这可能有问题,但请考虑以下好处:

    在没有用户意识的情况下,可以完全改变有效负载。这包括压缩,字段更改和URI。

    可以强制执行客户端验证。客户永远不会发送肯定被拒绝的数据。

    最后,与任何其他服务协议一样,服务可能会终止。礼貌的服务提供商会给你足够的通知。您的服务可以而且应该这样做。您实际上可以使用类似random early drop的内容,以及有关终止服务以及新URL或版本等内容的消息。随着迁移的最后期限临近,下降概率继续上升

答案 1 :(得分:1)

消费者驱动的合同是我称之为"反向测试"。它在微服务架构中特别有用,但不仅限于此架构。

问题: 当您有多个必须合作的服务时,可能会发生一个服务将引入在公共API中不向后兼容的更改。这可能是意外发生的,如果这不是"计划"改变你想避免它。

直观的解决方案: 您对所有正在运行的服务执行端到端测试。但是,当您有多个服务彼此协作时,此类测试非常有问题。

更好的解决方案: 开发客户服务团队(消费者)准备合同。合同是描述终端(让我们保留REST术语)客户端想要从生产者/服务器使用的描述,消费者期望从每个使用的端点(格式,结构,HTTP响应代码等)接收的内容。现在,消费者团队将此合同发送给制作人团队。在验证/测试阶段,制作人团队应针对当前正在运行的应用程序运行所有合同。因此,服务启动并且每个合同的请求都会重放以防止运行服务,所有期望都会被检查。如果未满足某些期望,则构建/测试阶段将失败。

重点是,在消费者合同测试中,您不需要开始一切(例如100个微服务)来仅测试两个服务之间的协作。