在微服务架构下,不同服务由不一样的团队开发和维护。如果个别服务由某些原因升级后需要调整接口,还没有改造完成,影响到服务消费方正常使用接口。
Ian Robinson提出Consumer-Driver Contracts,消费者驱动契约,简称CDC。能解决上述所描述的问题,这里契约是指服务消费者和服务提供者约定,消费者消费契约,提供者提供契约。
在没有加入契约时,微服务集成测试调用流程如图1,如果服务提供者返回响应内容发生改变,消费者无法正常集成测试了。
加入契约,微服务集成测试流程如图2,在开发过程中,消费者无须等到服务提供者开发完成,就能利用契约能进行预集成测试,同时,能降到联调接口成本。
上述主要说明加入契约的好处,我们要做到知其然知其所以然,看看下面消费者驱动契约的流程图:
下面给大家解读流程图。
consumer使用producer发布stubs.jar进行接口测试,也就是说consumer接收到响应内容是stub.jar返回。在consumer服务要加入pring-cloud-starter-stub-runner依赖包,目的为了能够调用stubs.jar包含的契约。
producer需要生成stubs.jar,提供consumer使用。通过contract maven插件生成stub jar包,然后install到本地。在生成之前需要配置groovy文件,groovy文件主要包括请求信息和响应内容, groovy文件可以理解为契约内容。在producer服务要加入spring-cloud-starter-contract-verifier,为了验证是否符合契约。
搭建消费者驱动契约需要用到:
- Java8
- Spring Boot (2.04.RELEASE)
- Spring Cloud Contract (2.0.1.RELEASE)
- Maven
暂时不详细说整个开发流程,日后会把开发流程写完。大家下载在github上下载CDC例子进行解读和运行。
参考资料:Consumer-Driven Contract Testing with Spring Cloud Contract