PACT 在微服务架构中的用途
在微服务架构盛行的今天,如何确保各个微服务之间的交互正确且稳定成为了一个关键问题。PACT(一种契约测试工具)在这个领域发挥着重要的作用。那么,PACT 在微服务架构中的用途到底是什么呢?
一、微服务架构的挑战
微服务架构将一个大型的应用拆分成多个小型的、独立的服务。这些服务之间通过网络进行通信,通常使用 RESTful API 或者消息队列等方式。然而,这种架构也带来了一些挑战:
- 服务之间的依赖复杂:由于微服务数量众多,它们之间的依赖关系变得非常复杂。一个服务的修改可能会影响到多个其他服务,而这些影响往往很难在开发阶段完全预测到。
- 集成测试困难:在传统的单体应用中,集成测试相对容易,因为所有的组件都在一个应用中。但在微服务架构中,要进行全面的集成测试需要启动多个服务,这不仅耗时,而且容易出现环境配置问题。
- 难以保证一致性:不同的开发团队可能同时开发不同的微服务,他们对服务之间的交互约定可能存在理解上的差异,这可能导致服务之间的通信出现问题。
二、PACT 的介绍
PACT 是一种用于微服务架构的契约测试工具。它的核心思想是通过定义服务消费者和服务提供者之间的契约,来确保双方对交互的期望一致。
PACT 由两部分组成:
- 消费者驱动的契约测试(Consumer-Driven Contract Tests):由服务消费者编写的测试,用于描述它对服务提供者的期望。这些测试会模拟服务消费者对服务提供者的调用,并验证返回的结果是否符合预期。
- 契约验证(Contract Verification):在服务提供者一侧,使用 PACT 来验证它是否满足与服务消费者之间的契约。如果契约被违反,测试将失败,提示服务提供者进行修复。
三、PACT 在微服务架构中的用途
(一)确保服务之间的交互正确
- 定义明确的契约:通过 PACT,服务消费者可以明确地定义它对服务提供者的期望,包括请求的格式、参数、返回值等。这有助于避免由于理解不一致而导致的错误。
- 早期发现问题:在开发阶段,通过运行消费者驱动的契约测试,可以在服务集成之前就发现潜在的问题。这使得开发人员能够及时修复问题,而不是等到集成测试阶段才发现问题,从而节省了时间和成本。
(二)提高开发效率
- 独立开发:服务消费者和服务提供者可以独立开发,只需要关注自己的功能和与对方的契约。这减少了开发过程中的依赖,使得开发团队可以更加高效地工作。
- 自动化测试:PACT 可以与持续集成工具集成,实现自动化的契约测试。这确保了每次代码变更都能及时进行契约验证,提高了开发的质量和稳定性。
(三)增强系统的稳定性
- 防止回归问题:当服务提供者进行修改时,通过运行契约验证,可以确保这些修改不会破坏与服务消费者之间的契约。这有助于防止回归问题的出现,保证系统的稳定性。
- 易于维护:由于契约明确地定义了服务之间的交互,当需要对服务进行修改或扩展时,开发人员可以更加清楚地了解这些修改可能带来的影响,从而更容易进行维护。
四、PACT 的具体工作流程
-
服务消费者定义契约
- 服务消费者的开发团队根据业务需求,确定对服务提供者的期望,包括请求的 URL、方法、参数、头部信息以及预期的响应格式和内容。
- 使用 PACT 的测试框架编写消费者驱动的契约测试,模拟对服务提供者的调用,并验证返回的结果是否符合预期。
-
生成契约文件
- 运行消费者驱动的契约测试后,PACT 会生成一个契约文件,描述服务消费者对服务提供者的期望。这个契约文件可以是 JSON 格式或者其他特定的格式。
-
契约文件传递给服务提供者
- 契约文件可以通过持续集成工具或者其他方式传递给服务提供者的开发团队。
-
服务提供者进行契约验证
- 服务提供者的开发团队使用 PACT 提供的工具,读取契约文件,并针对契约进行验证。
- 他们会启动服务提供者,并模拟服务消费者的请求,验证服务提供者的实际响应是否与契约文件中描述的一致。
-
反馈和修复
- 如果契约验证失败,服务提供者的开发团队会收到错误信息,指出哪些地方不符合契约。他们可以根据这些信息进行修复,确保服务提供者满足契约要求。
五、实际项目中成功应用 PACT 的案例
案例一:电商平台微服务架构
在一个大型电商平台的微服务架构中,有多个服务负责不同的业务功能,如商品管理、订单处理、用户管理等。这些服务之间需要频繁地进行交互。
在开发过程中,使用 PACT 进行契约测试。商品管理服务作为服务消费者,定义了对订单处理服务的契约,包括请求订单详情的 API 格式和预期的响应内容。订单处理服务在进行开发时,通过契约验证确保其满足商品管理服务的期望。
通过使用 PACT,开发团队在早期就发现了一些服务之间交互的问题,避免了在集成测试阶段才发现问题而导致的大量返工。同时,各个服务团队可以独立开发,提高了开发效率。
案例二:金融科技公司微服务系统
一家金融科技公司的微服务系统包括账户管理服务、交易服务、报表服务等。为了确保系统的稳定性和正确性,引入了 PACT。
账户管理服务作为服务消费者,定义了对交易服务的契约,规定了查询账户余额和进行交易的 API 要求。交易服务在开发过程中进行契约验证,确保其符合账户管理服务的期望。
在实际应用中,PACT 帮助开发团队及时发现了服务之间的兼容性问题,提高了系统的质量。同时,由于契约的明确性,系统的维护也变得更加容易。
六、PACT 的优缺点
(一)优点
- 提高服务间交互的正确性:通过明确的契约定义,减少了由于理解不一致而导致的错误,确保了微服务之间的交互正确。
- 早期问题发现:在开发早期就能发现服务之间的潜在问题,避免了在集成测试阶段才发现问题所带来的大量返工和成本增加。
- 促进独立开发:服务消费者和服务提供者可以独立开发,减少了开发过程中的依赖,提高了开发效率。
- 增强系统稳定性:防止服务提供者的修改破坏与服务消费者之间的契约,减少了回归问题的出现,增强了系统的稳定性。
- 易于维护:契约明确了服务之间的交互,使得在进行服务修改或扩展时,开发人员能更好地理解其影响,易于维护系统。
(二)缺点
- 学习成本:对于不熟悉契约测试的开发团队来说,学习和使用 PACT 可能需要一定的时间和成本。
- 额外的测试工作:引入 PACT 会增加一定的测试工作量,包括编写消费者驱动的契约测试和进行契约验证。
- 契约文件管理:随着微服务数量的增加,契约文件的管理可能会变得复杂,需要有效的管理策略来确保契约的准确性和及时性。
七、总结
在微服务架构中,PACT 作为一种强大的契约测试工具,发挥着重要的作用。它通过定义明确的契约,确保服务之间的交互正确,提高了开发效率,增强了系统的稳定性。
文章(专栏)将持续更新,欢迎关注公众号:服务端技术精选。欢迎点赞、关注、转发。
个人小工具程序上线啦,通过公众号(服务端技术精选)菜单【个人工具】即可体验,欢迎大家体验后提出优化意见!500 个访问欢迎大家踊跃体验哦~
相关文章:

PACT 在微服务架构中的用途
在微服务架构盛行的今天,如何确保各个微服务之间的交互正确且稳定成为了一个关键问题。PACT(一种契约测试工具)在这个领域发挥着重要的作用。那么,PACT 在微服务架构中的用途到底是什么呢? 一、微服务架构的挑战 微服…...

LeetCode 3200.三角形的最大高度:枚举
【LetMeFly】3200.三角形的最大高度:枚举 力扣题目链接:https://leetcode.cn/problems/maximum-height-of-a-triangle/ 给你两个整数 red 和 blue,分别表示红色球和蓝色球的数量。你需要使用这些球来组成一个三角形,满足第 1 行…...

ssm基于java的招聘系统设计与开发+vue
系统包含:源码论文 所用技术:SpringBootVueSSMMybatisMysql 免费提供给大家参考或者学习,获取源码请私聊我 需要定制请私聊 目 录 第1章 绪论 1 1.1 课题背景 1 1.2 课题意义 1 1.3 研究内容 1 第2章 开发环境与技术 3 2.1 Java语言…...

【网络原理】TCP/IP五层网络模型之网络层-----IP协议详解,建议收藏!!
💐个人主页:初晴~ 📚相关专栏:计算机网络那些事 前几篇文章中我们深入研究了TCP协议,因为TCP协议在我们日常开发中的使用频率非常高。而相比之下,IP协议与我们普通程序员关系就没那么近了。一般是专门开发…...

三次握手与四次挥手
一、三次握手 AB之间 都会发送一个syn - ack。 A 先发 syn ,B收到 。 A: 什么都不知道 B:知道A可以发送。 B发送syn-ack,A收到 。 A: 知道B可以收也可以发 , B知道A可以发送。 A发送ack,B收到。 A : 知道B可以收也可以发 , B知道A…...

awk命令学习记录
awk命令 awk命令 表示将一行数据按特定分割符分割成多列,而从而选取特定列数的数据,默认分割符为空格,连接符默认也是空格 // 1. 更换分割符 awk -F : 1.txt // 1.txt为你的文件名 // 2. 打印多列 awk {print $1,$2} // $0为整行ÿ…...

科大讯飞嵌入式面试题及参考答案
平衡二叉树和普通二叉树的区别 平衡二叉树是一种特殊的二叉树,与普通二叉树相比有以下显著区别: 一、定义与结构 普通二叉树:二叉树是每个节点最多有两个子树的树结构。它没有特定的平衡要求,节点的分布可能比较随机。例如&#x…...

C Lua5.4.6 SDK开发库
下载 .lua执行 #include "lua.h" #include "lualib.h" #include "lauxlib.h"static int luaopen_ui(lua_State *L) {static const struct luaL_Reg lib_f[] = {{"saveFile", saveFile},{"loadFile", loadFile},{NULL, NULL…...

无线网卡知识的学习-- wireless基础知识(cfg80211)
1. 基本概念 mac80211 :这是最底层的模块,与hardware offloading 关联最多。 mac80211 的工作是给出硬件的所有功能与硬件进行交互。(Kernel态) cfg80211:是设备和用户之间的桥梁,cfg80211的工作则是观察跟踪wlan设备的实际状态. (Kernel态) nl80211: 介于用户空间与内核…...

Next.js 学习 - 路由系统(Routing)
Next.js 的路由系统基于文件系统,这意味着文件和文件夹的结构决定了 URL 路径。相较于传统的 React 应用中的路由配置,Next.js 的文件路由系统非常简洁和自动化。下面是对 Next.js 路由的详细介绍。 1. 目录结构 在 Next.js 13 中,app 目录…...

Unity XR PICO 手势交互 Demo APK
效果展示 用手抓取物体,调整物体位置和大小等 亲测pico4 企业版可用, 其他设备待测试 下载链接: 我标记的不收费 https://download.csdn.net/download/qq_35030499/89879333...

EM算法学习
1.EM算法的介绍 可以发现:计算出θA和θB的值的前提是知道A、B币种的抛掷情况。 所以我们需要使用EM算法:求出每轮选择硬币种类的概率 2.EM算法执行过程: 第一步:首先初始化设置一组PA和PB证明的值。然后通过最大似然估计得到每…...

019_基于python+django食品销售数据分析系统2024_4032ydxt
目录 系统展示 开发背景 代码实现 项目案例 获取源码 博主介绍:CodeMentor毕业设计领航者、全网关注者30W群落,InfoQ特邀专栏作家、技术博客领航者、InfoQ新星培育计划导师、Web开发领域杰出贡献者,博客领航之星、开发者头条/腾讯云/AW…...

C语言笔记(数据的存储篇)
目录 1.数据类型的详细介绍 2.整型在内存中的存储:原码、反码、补码 3.大小端字节序介绍及判断 4.浮点型的内存中的存储解析 1.数据类型的详细介绍 下述是内置类型: char // 字符数据类型 short // 短整型 int // 整型 long …...

wsl: 检测到 localhost 代理配置,但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理的解决方法
前言 开头先讲讲wsl2启用代理的必要性,一般来说,会用wsl的都是开发者,那么就避免不了从网络上下载软件和应用,但是由于众所周知的原因,你使用apt,wget等工具下载国外网站的东西时,下载速度就会…...

CSS 居中那些事
一、父子元素高度确定 简单粗暴, 直接通过设置合适的 padding 或 margin 实现居中 <style>.p {padding: 20px 0;background: rgba(255, 0, 0, 0.1);}.c {width: 40px;height: 20px;background: blue;} </style> <div class"p"><div class"…...

Java项目-基于springboot框架的智能热度分析和自媒体推送平台项目实战(附源码+文档)
作者:计算机学长阿伟 开发技术:SpringBoot、SSM、Vue、MySQL、ElementUI等,“文末源码”。 开发运行环境 开发语言:Java数据库:MySQL技术:SpringBoot、Vue、Mybaits Plus、ELementUI工具:IDEA/…...

跨平台进程池背后的思想
背景是基于业务需求,需要实现一个跨平台的项目。项目中由于有部分功能存在大量计算,所以打算单独分配一个进程去进行计算。 进程池的实现与线程池的实现逻辑上如出一辙。但是实现上进程池的实现会比线程池实现复杂的多,主要比较复杂的点的就在于并发安全的任务队列。…...

前端性能优化之加载篇
前端页面加载的过程其实跟我们常常提起的浏览器页面渲染流程几乎一致: 网络请求,服务端返回 HTML 内容。 浏览器一边解析 HTML,一边进行页面渲染。 解析到外部资源,会发起 HTTP 请求获取,加载 Javascript 代码时会暂停页面渲染。 根据业务代码加载过程,会分别进入页面开始…...

数据结构(栈)
每当误会消除冰释前嫌的时候,故事就距离结尾不远了。 栈 概念与结构 1. 栈⼀种特殊的线性表,其只允许在固定的⼀端进行插入和删除元素操作。 2. 进行数据插入和删除操作的⼀端称为栈顶,另⼀端称为栈底。 3. 栈中的数据元素遵守后进先出的原则…...

Aspose.PDF功能演示:使用 JavaScript 从 PDF 中提取文本
在数据提取、业务文档自动化和文本挖掘方面,使用 JavaScript 从PDF中提取文本非常有用。它允许开发人员自动执行从 PDF 收集信息的过程,从而显著提高处理大量文档的生产力和效率。在这篇博文中,我们将学习如何使用 JavaScript 从 PDF 中提取文…...

计算机系统简介
一、计算机的软硬件概念 1.硬件:计算机的实体,如主机、外设、硬盘、显卡等。 2.软件:由具有各类特殊功能的信息(程序)组成。 系统软件:用来管理整个计算机系统,如语言处理程序、操作系统、服…...

学习文档10/18
MySQL高性能优化规范: 数据库命名规范 所有数据库对象名称必须使用小写字母并用下划线分割所有数据库对象名称禁止使用 MySQL 保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来)数据库对象的命名要能做到见名识意…...

Redis入门到精通(二):入门Redis看这一篇就够了
文章目录 一、Redis的双写一致性1.延迟双删2.添加分布式锁3.异步监听可靠消息基于MQ消息队列的异步监听基于Canal的异步通知 二、Redis的持久化持久化流程1.RDB机制1.1save1.2bgsave1.3自动触发 2.AOF机制三种触发机制3.RDB和AOF的对比 三、Redis的数据删除策略1.惰性删除2.定期…...

荒岛逃生游戏
题目描述 一个荒岛上有若干人,岛上只有一条路通往岛屿两端的港口,大家需要逃往两端的港口才可逃生。 假定每个人移动的速度一样,且只可选择向左或向右逃生。 若两个人相遇,则进行决斗,战斗力强的能够活下来ÿ…...

玫瑰花HTML源码
HTML源码 <pre id"tiresult" style"font-size: 9px; background-color: #000000; font-weight: bold; padding: 4px 5px; --fs: 9px;"><b style"color:#000000">0010000100000111101110110111100010000100000100001010111111100110…...

【wpf】07 后端验证及令牌码获取步骤
由于在用wpf开发应用程序时,从后端获取数据需要用到 Authorization 授权的Bearer令牌,而这个令牌的获取需要登录后台进行获取,这里登录时还涉及到的验证码的操作,所以在获取过程中,需要对后台系统进行登录并拿到这个Be…...

学习中,师傅b站泷羽sec——xss挖掘过程
某职业技术学院网站xss挖掘: 资产归纳 例如:先把功能点都看一遍,大部分都是文章 根据信息搜集第一课学习到一般主站的防御力是比较强的,出现漏洞的点不是对新手不友好。 在资产验证过程中还是把主站看了一遍 没有发现有攻击的机会…...

什么是双因素身份验证?双因素身份验证的凭据类型有哪些?
w微服务在数字化的时代,保护个人和企业的敏感信息至关重要。双因素身份验证(Two-Factor Authentication,简称 2FA)作为一种增强安全性的方法,越来越受到广泛关注。那么,什么是双因素身份验证呢?…...

【MR开发】在Pico设备上接入MRTK3(一)——在Unity工程中导入MRTK3依赖
写在前面的话 在Pico上接入MRTK3,目前已有大佬开源。 https://github.com/Phantomxm2021/PicoMRTK3 也有值得推荐的文章。 MRTK3在PICO4上的使用小结 但由于在MacOS上使用MRTK3,无法通过Mixed Reality Feature Tool工具管理MRTK3安装包。 故记录一下…...