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

为解决这些问题,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仓库)

clean install -Dmaven.test.skip=true

发现已经安装好了:

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

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

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

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

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

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

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:

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

@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等。

示例代码查看:https://github.com/importsource/spring-cloud-contract


消费者驱动的微服务契约测试套件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. 世界机器人大会|人工智能VS人类
  2. python multi_python – 堆叠MultiIndex的所有级别
  3. 联想确定造芯!全资半导体公司曝光:上海自贸区注册,数据中心VP任法人
  4. npm publish 发布一个 Angular 库的时候报错以及解决方法
  5. 如何通过Fiori后台调试的方式找到gateway系统的ID
  6. cobbler介绍与部署
  7. Domino服务器以及Notes客户端重新配置的方法
  8. MySQL导入sql文件的三种方法
  9. POI 导出Excel文件 设置指定列格式为文本格式
  10. 1. 查询表customer——查询姓名和联系人相同的顾客信息
  11. Web基础知识与常用技术
  12. synology nfs_如何在Synology NAS桌面上创建,重新排列,组织和删除快捷方式
  13. 计算机毕业设计之java+ssm校园外卖配送系统
  14. 抖音短视频账号运营方案
  15. 腾讯T2大牛亲自讲解!Android开发唯一的出路:进阶学习
  16. pynq 环境搭建_PYNQ系列学习(一)——Pynq开发环境配置
  17. 2022年第三次面试,含泪整理万字面试题。
  18. JAVA技术及应用(第二版)(赵锐,李卫华)学习总结
  19. 百度算法大全:更新至2121年
  20. Oracle数据库导入导出(以用户的形式)

热门文章

  1. Android中Activity启动模式
  2. 启动列表的activity
  3. CSS 中的定位:relative,absolute
  4. 全局曝光和卷帘曝光的区别
  5. Parquet格式描述
  6. 为什么不能同时用const和static修饰成员函数?
  7. 刚接触电子时,有过哪些百思不得其解的问题?
  8. Datawhale-零基础入门NLP-新闻文本分类Task01
  9. python文字游戏 生成数字菜单_python自学日记5——文字游戏
  10. 威纶触摸屏与电脑连接_PLC与这7种设备的连接方式,一看就懂!