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

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

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


money.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/477578.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 842. 将数组拆分成斐波那契序列(暴力查找)

1. 题目 给定一个数字字符串 S&#xff0c;比如 S “123456579”&#xff0c;我们可以将它分成斐波那契式的序列 [123, 456, 579]。 形式上&#xff0c;斐波那契式序列是一个非负整数列表 F&#xff0c;且满足&#xff1a; 0 < F[i] < 2^31 - 1&#xff0c;&#xff…

做CV和做NLP,是否都有光明的未来?

本文授权转载自公众号“算法圈的小破事”&#xff0c;点击以上卡片进行关注大家好&#xff0c;我是在互联网危险边缘疯狂试探的皮皮虾。最近有点忙&#xff0c;拖更了&#xff0c;不知道有没有读者惦记皮皮虾推文呢&#xff08;目测没有TT&#xff09;。首先祭出新华字典的老图…

论文浅尝 | 知识表示、多模态融合、搜索匹配三大方向探索——360人工智能研究院知识图谱算法团队...

转载公众号 | 老刘说NLP当前以促进技术发展、提升模型指标&#xff0c;探究模型天花板的竞赛越来越多&#xff0c;也逐步成为各大研究机构、互联网大厂竞相角逐的主战场。自2022年以来&#xff0c;在组员的共同努力下&#xff0c;团队(360人工智能研究院知识图谱算法团队)&…

Spring Cloud Zuul重试机制探秘

简介 本文章对应spring cloud的版本为(Dalston.SR4)&#xff0c;具体内容如下&#xff1a; 开启Zuul功能通过源码了解Zuul的一次转发怎么开启zuul的重试机制Edgware.RC1版本的优化 开启Zuul的功能 首先如何使用spring cloud zuul完成路由转发的功能&#xff0c;这个问题很简…

论文浅尝 | PASSLEAF: 一个用于不确定知识图谱嵌入的基于样本池的半监督学习框架...

笔记整理&#xff1a;杨露露&#xff0c;天津大学硕士链接&#xff1a;https://ojs.aaai.org/index.php/AAAI/article/view/16522/16329动机在不确定知识图谱的嵌入中&#xff0c;实体之间的每个关系都有一个置信度。鉴于现有的嵌入方法可能会丢弃不确定性信息&#xff0c;或只…

LeetCode 60. 第k个排列(回溯 康托展开)

文章目录1. 题目2. 解题2.1 回溯2.2 数学-康托展开1. 题目 给出集合 [1,2,3,…,n]&#xff0c;其所有元素共有 n! 种排列。 按大小顺序列出所有排列情况&#xff0c;并一一标记&#xff0c;当 n 3 时, 所有排列如下&#xff1a; “123” “132” “213” “231” “312” “…

我在谷歌实习时发现了一个模型 bug,于是有了这篇 ACL

文 | AlbertYang编 | 小轶表格的自动理解与检索已经成为 NLP 以及多模态任务中重要的一环。如果我们给模型一个冬奥会的奖牌榜并且问&#xff0c;“哪个国家的金牌最多&#xff1f;”&#xff0c;现有的模型已经可以毫不费力地输出正确的答案&#xff08;通常都是表格首行的国家…

Spring Cloud Zuul的fallback优化

如何在Zuul中使用fallback功能 我们在项目中使用Spring cloud zuul的时候&#xff0c;有一种这样的需求&#xff0c;就是当我们的zuul进行路由分发时&#xff0c;如果后端服务没有启动&#xff0c;或者调用超时&#xff0c;这时候我们希望Zuul提供一种降级功能&#xff0c;而不…

技术动态 | 「新一代知识图谱关键技术」最新2022进展综述

转载公众号 | 专知链接&#xff1a;https://crad.ict.ac.cn/CN/10.7544/issn1000-1239.20210829近年来&#xff0c;国内外在新一代知识图谱的关键技术和理论方面取得了一定进展&#xff0c;以知识图谱为载体的典型应用也逐渐走进各个行业领域,包括智能问答、推荐系统、个人助手…

LeetCode 397. 整数替换(递归 贪心)

文章目录1. 题目2. 解题2.1 递归2.2 记忆化递归2.3 贪心1. 题目 给定一个正整数 n&#xff0c;你可以做如下操作&#xff1a; 如果 n 是偶数&#xff0c;则用 n / 2替换 n。如果 n 是奇数&#xff0c;则可以用 n 1或n - 1替换 n。 n 变为 1 所需的最小替换次数是多少&#…

搭配对比学习,万能的 prompt 还能做可控文本生成

文 | ZenMoore编 | 小轶可控文本生成&#xff0c;旨在让语言模型的输出带有我们想要的某种属性。比如情感、主题、三元组等。一般我们习惯采用 CTRL[1] 或者 PPLM[2] 等方式。但是&#xff0c;CTRL 是对整个语言模型进行 Finetuning, PPLM 因为需要在生成的过程中迭代更新 hidd…

Eureka Client注册到Eureka Server的秘密

前言 我们知道Eureka分为两部分&#xff0c;Eureka Server和Eureka Client。Eureka Server充当注册中心的角色&#xff0c;Eureka Client相对于Eureka Server来说是客户端&#xff0c;需要将自身信息注册到注册中心。本文主要介绍的就是在Eureka Client注册到Eureka Server时R…

论文浅尝-综述 | 基于强化学习的知识图谱综述

转载公众号 | 人工智能前沿讲习论文来源&#xff1a;https://crad.ict.ac.cn/CN/10.7544/issn1000-1239.20211264摘要&#xff1a;知识图谱是一种用图结构建模事物及事物间联系的数据表示形式&#xff0c;是实现认知智能的重要基础&#xff0c;得到了学术界和工业界的广泛关注.…

AI当下要破局,不能没有知识图谱!

AI或AI赋能已是传统行业智能化升级和转型的基本模式。近年来越来越多的传统行业的核心战略转移到人工智能领域&#xff0c;但随着大数据红利的消失殆尽&#xff0c;以深度学习为代表的感知智能水平日益接近其“天花板”&#xff08;来自肖仰华老师分享&#xff09;。数据驱动的…

LeetCode 495. 提莫攻击

1. 题目 在《英雄联盟》的世界中&#xff0c;有一个叫 “提莫” 的英雄&#xff0c;他的攻击可以让敌方英雄艾希&#xff08;编者注&#xff1a;寒冰射手&#xff09;进入中毒状态。现在&#xff0c;给出提莫对艾希的攻击时间序列和提莫攻击的中毒持续时间&#xff0c;你需要输…

Spring Cloud Config的配置中心获取不到最新配置信息的问题

本篇源于Spring Cloud Config的一个问题&#xff0c;但这个问题并非所有人都会遇到。如果您遇到了&#xff0c;那必须得看看这篇&#xff0c;如果没有遇到您也应该看看&#xff0c;防患于未然&#xff01; 问题描述 之前有朋友提出Spring Cloud Config的配置中心在运行一段时间…

图谱实战 | 京东基于时序知识图谱的问答系统

转载公众号 | DataFunSummit分享嘉宾&#xff1a;商超博士 京东硅谷研究院 研究员编辑整理&#xff1a;张存旺 北航杭州创新研究院出品平台&#xff1a;DataFunTalk导读&#xff1a;本文将分享Temporal Knowledge Graphs方向的一个最新尝试&#xff0c;如何在时序知识图谱上去做…

请不要吸开源的血

文 | 琴梨梨源 | 知乎今天无聊刷GitHub看到一个让我血压上来的项目乍一看&#xff0c;2.4k star&#xff0c;应该不像是什么小项目应该是比较有用的项目&#xff0c;但接下来的事情属实是让我气的很对于开源项目我是不喜欢下载预构建的成品的&#xff0c;我更喜欢自己动手从源代…

LeetCode 357. 计算各个位数不同的数字个数(DP)

1. 题目 给定一个非负整数 n&#xff0c;计算各位数字都不同的数字 x 的个数&#xff0c;其中 0 ≤ x < 10n。 示例: 输入: 2 输出: 91 解释: 答案应为除去 11,22,33,44,55,66,77,88,99 外&#xff0c;在 [0,100) 区间内的所有数字。来源&#xff1a;力扣&#xff08;Lee…

SpringCloud实战小贴士:Zuul的路径匹配

路径匹配 不论是使用传统路由的配置方式还是服务路由的配置方式&#xff0c;我们都需要为每个路由规则定义匹配表达式&#xff0c;也就是上面所说的path参数。在Zuul中&#xff0c;路由匹配的路径表达式采用了Ant风格定义。 Ant风格的路径表达式使用起来非常简单&#xff0c;…