在微服务架构下,你的服务可能由不同的团队提供和维护,在这种情况下,接口的开发和维护可能会带来一些问题,比如服务端调整架构或接口调整而对消费者不透明,导致接口调用失败。

为解决这些问题,Ian Robinson提出了一个以服务消费者定义契约为驱动的开发模式:“Consumer-Driver Contracts(CDC)”,就是:消费者驱动契约。

通常我们开发中主要由服务提供方约定接口,虽然提供方架构调整或改变接口之前通常会通知消费者,但可能还存在上述风险,如果上线出现问题就GG了,而CDC则是以消费者提出接口契约,交由服务提供方实现,并以测试用例对契约进行产生约束,所以服务提供方在满足测试用例的情况下可以自行更改接口或架构实现而不影响消费者。

消费者驱动的契约测试(Consumer-Driven Contracts,简称CDC),是指从消费者业务实现的角度出发,驱动出契约,再基于契约,对提供者验证的一种测试方式。

如果你目前使用SpringCloud作为微服务基础环境,那么集成SpringCloud Contracts也是比较好的选择。

原本你要测试的话必须启动相应的服务。像下面这样:

使用了Spring Cloud Contract之后,你就不需要启动这么多的服务了。像下面这样:

也许你发现了,出现了一个新的生物,叫STUB。这是个什么东西呢?稍后会详细说,这里你先就认为它可以模拟出provider,然后消费者直接调用就可以模拟服务调用了。

是不是不错。

好,接下来我们透过代码来详细的讲解下这个套件吧。

我们接下来模拟一个流程。现在有两个团队,分别负责不同的服务。

这里就假设有provider团队和consumer团队。那么当provider团队的服务还没有开发好,或者provider的团队的服务没有在启动的时候,我们可不可以进行开发呢?

答案是可以的。

契约(Contract)

这里引入一个重要的概念,就是契约,Contract。这是什么呢?很简单,就是provider和consumer事先要约定好一个接口的规范,之后双方提供服务接口和消费服务接口都要按照这个契约来。

先来看看代码的基本结构:

分别有三个模块:common、consumer、provider。

接下来一一介绍:

Common模块

然后分别有两个类,一个是分页Page实体,另外一个是Customer实体类。

1、Customer:

2、Page:

待会我们会在provider和consumer中都用到。

Provider程序

先来看看pom依赖:**

1、引入spring-cloud-starter-contract-verifier

注:引入verfier是为了验证是否符合契约

2、引入spring-cloud-contract-maven-plugin:

baseClassForTests这个就是你要符合契约的测试代码。

这里主要介绍和contract紧相关的依赖。其他依赖你可以到具体的源码中查看(点击“阅读原文”)。

3、契约

先来看看契约的定义是什么样。

我们在provider的test下的resources下新建了一个contracts目录,这个就是放置契约的地方,里边有个shouldReturnAllCustomers的groovy文件就是我们的契约,来看看吧。

shouldReturnAllCustomers.grovvy:

我们看到有三个部分:description、request、response。通过request定义了请求时的url和method,然后通过response约定返回时的headers和body信息。

契约采用groovy的DSL描述,所以一目了然,就是通过url:/ api / customers来取得一个json格式的客户列表,返回两个客户信息。

契约约定好了。接下来我们就来实现这个契约吧:

CustomerRepository:

CustomerRestController:

接下来我们就来生成stub jar文件。这个jar文件的目的就是可以被消费者拿来当做一个模拟服务来启动然后在本地跑测试用例,而不需要真正的服务提供者启动。

4、生成stub jar:

执行install把stubjar包安装到本地(在正式开发的时候可以deploy仓库)

  1. clean install -Dmaven.test.skip=true

发现已经安装好了:

这时候我们可以通过contract插件简单的看下效果:

run之后,我们会看到通过启动stub 的jar文件,我们可以模拟一个真实的服务:

然后我们访问:http://localhost:8080/api/customers

可以发现,我们通过契约然后生成了stub jar,然后启动stub jar居然模拟了契约约定好的服务。

接下来我们去编写一个consumer程序吧。

另外启动stub也可以通过以下命令来启动:

  1. java -jar spring-cloud-contract-provider-0.0.1-SNAPSHOT-stubs.jar --stubrunner.ids=com.importsource.springcloud:spring-cloud-contract-provider:+:8080 --stubrunner.workOffline=true

Consumer程序

1、spring-cloud-starter-contract-stub-runner

依赖spring-cloud-starter-contract-stub-runner:

通过这个依赖,我们一会就可以启动stub来模拟启动一个契约好的服务了。

接下来,作为消费者端,来写一个测试用例,来模拟测试服务吧:

2、SpringCloudContractConsumerApplicationTests:

这里使用到了以下的注解:

  1. @AutoConfigureStubRunner(ids = {"com.importsource.springcloud:spring-cloud-contract-provider:+:8080"}, workOffline = true)

@AutoConfigureStubRunner

通过@AutoConfigureStubRunner来自动配置注入一个StubRunner。

1、ids:

然后通过ids去定位到刚刚通过clean install好的那个stub jar 包,然后在8080端口去启动这个stub jar。

ids的格式是长这样:

groupId:artifactId:version:classifier:port

2、workOffline = true

是指使用本地maven库,不要使用线上的版本,所以你只要把Consumer在你本机上安装过就可以了。

然后运行测试:

发现测试通过了。

总结

你应该发现了,我们根本没有真正的启动服务提供者,而是在本地启动了stub就模拟测试了一次服务调用。

本文首先向你介绍了消费者驱动测试的基本背景,然后我们编写了一个服务的契约,并介绍如何定义Spring Cloud Contract的契约,然后我们借助contract maven插件生成了stub jar包,然后install到本地。接着我们编写了消费者端的测试用例,通过stub runner来模拟服务提供者完成了一次消费者调用服务的测试。

契约测试的工具除了Spring Cloud Contract外,还有其他的一些工具可供你选择,比如:Janus,Pact,Pacto等。

示例代码请点击“阅读原文”查看

推荐阅读

  • 白话:服务降级与熔断的区别

  • JPA的多表复杂查询:详细篇

  • 博客搭建攻略(三):创造收益

  • 近期关于Spring Boot/Cloud的文章汇总

  • 海外IT工程师工作福利揭秘

消费者驱动的微服务契约测试套件:Spring Cloud Contract相关推荐

  1. 消费者驱动的微服务契约测试套件Spring Cloud Contract

    在微服务架构下,你的服务可能由不同的团队提供和维护,在这种情况下,接口的开发和维护可能会带来一些问题,比如服务端调整架构或接口调整而对消费者不透明,导致接口调用失败. 为解决这些问题,Ian Robi ...

  2. 微服务契约测试-Pact

    一.微服务概述 本质是一种架构模式,是SOA(面向服务型架构)的一种变体,每个服务围绕具体的业务进行构建,可以独立部署:每个服务运行于独立的进程中,服务间用Rest API进行通讯. 单体架构 优点 ...

  3. 两大微服务框架dubbo和spring cloud对比

    一.基本介绍 dubbo Dubbo 是一个分布式服务框架,致力于提供高性能和透明化的 RPC 远程服务调用方案,以及 SOA 服务治理方案.简单的说,Dubbo 就是个服务框架,说白了就是个远程服务 ...

  4. 微服务技术方案:Spring Cloud 从入门到实战

    随着互联网技术的发展与不断创新,以及用户流量的不断增大,越来越多的企业项目面临大数据.高并发等问题,随之而来的就是通过分布式模型组建架构,微服务思想就集中体现了应用价值,2020 年的你还没有掌握微服 ...

  5. spring cloud微服务分布式云架构-Spring Cloud简介

    Spring Cloud是一系列框架的有序集合.利用Spring Boot的开发模式简化了分布式系统基础设施的开发,如服务发现.注册.配置中心.消息总线.负载均衡.断路器.数据监控等(这里只简单的列了 ...

  6. spring cloud微服务分布式云架构 - Spring Cloud简介

    Spring Cloud是一系列框架的有序集合.利用Spring Boot的开发模式简化了分布式系统基础设施的开发,如服务发现.注册.配置中心.消息总线.负载均衡.断路器.数据监控等(这里只简单的列了 ...

  7. spring cloud微服务分布式云架构 - Spring Cloud简介(一)

    点击上面 免费订阅本账号! 本文作者:it菲菲 原文:https://yq.aliyun.com/articles/672239? 点击阅读全文前往 Spring Cloud是一系列框架的有序集合.利 ...

  8. 微服务的精髓,Spring Cloud 到底该学到什么程度才算精通?

    微服务到底是什么 微服务到底是什么,一直众说纷纭,我们只知道各大企业纷纷追捧和实践微服务架构,有的项目可能使用了 Spring Cloud 就算是使用微服务了,然后说微服务就是 Spring Clou ...

  9. 创智播客微服务_周立-Spring Cloud微服务实战视频课程

    『课程目录』:" |0 O6 f0 d! b% }$ Z; T- g 1 公开课 2 1.1 微服务架构概述 3. 2.1 开始使用Spring Cloud实战微服务 4 3.1 服务提供者 ...

最新文章

  1. 云炬WEB开发笔记 第2章小结回顾
  2. VTK:IO之FindAllArrayNames
  3. 适配移动端的文字超出隐藏并添加省略号
  4. ios如何判断键盘是否已经显示
  5. python3urllib常见使用_Python3 urllib常用操作
  6. 使用 jQuery Mobile 与 HTML5 开发 Web App (十七) —— HTML5 离线缓存
  7. python中for循环的用法_@Python小白,一文让你掌握Python爬虫
  8. 2019 年上万篇论文发表,这 14 篇脱颖而出!
  9. Jquery的validate表单验证
  10. 深度 | 人工智能究竟能否实现?
  11. 00 后搞视频号月入过万,怎么做?
  12. 误入 GitHub 游戏区,意外地收获颇丰
  13. X Chen笔记---百度云破解限速
  14. Excel中index和match结合解决vlookup匹配出错问题
  15. uni-app引入阿里图标
  16. 如何在小程序的wxml中书写函数逻辑,wxs的使用
  17. c语言转汇编编译器,【转】C语言内嵌汇编(asm)
  18. 利用百度地图sdk实现定位
  19. EDA软件常用3D库站点
  20. TOUGH2系列建模方法及在CO2地质封存、水文地球化学、地热、地下水污染等领域中的技术

热门文章

  1. linux tee 命令 输出的同时写入文件
  2. linux shell脚本 静态检查工具 shellcheck 简介
  3. win10 输入法不见了、繁体 问题解决
  4. linux socket recv函数 MSG_PEEK标志介绍
  5. Linux Shell -- 无网不利
  6. Shell脚本的调试技术
  7. mysql zip 安装 启动_window的zip版mysql安装启动
  8. Android Region代码分析
  9. 1一10到时的英文单词_10张“牛皮癣”可换1个鸡蛋!徐州一街道全民总动员
  10. matlab reshape函数_numpy中的np.ascontiguousarray()函数