9月7日-8日,相约 2023 腾讯全球数字生态大会!聚焦产业未来发展新趋势! 了解详情
写点什么

干货 | 代理模式 Mock 平台在携程的应用

  • 2021-03-05
  • 本文字数:3251 字

    阅读完需:约 11 分钟

干货 | 代理模式Mock平台在携程的应用

本文描述的是 2020 年携程 IBU 机票研发团队基于业务痛点所研发的轻量级前端 Mock 解决方案(目前正与集团另一 Mock 中台融合,从中台的赋能中探寻更多拓展)。希望可以借此文为有类似前端 Mock 需求,正在寻找解决方案的团队/个人提供一种思路。

一、背景

在实际开发场景中,有很多前端需求是需要和后端基于契约进行并行开发的。因此不论是开发阶段,如何让开发和测试更简便地覆盖业务场景,提升开发质量,还是在产品验收阶段,如何在出现问题时精确、快速的定位,都是前端开发需要解决的痛点。


因此,拥有一个稳定、灵活、易用的数据 Mock 平台是保证前端开发和排查问题效率的重要前提。

总结前端在开发、调试、验收等各阶段需要 Mock 平台具备的能力后,我们整理出了 Mock 平台需要具备的核心功能:


1)实时请求数据可视化(抓包);

2)简单易用的 Mock 报文管理,支持设备维度的个性化 Mock;

3)满足设备多接口不同环境的支持(复杂业务下不同接口不同团队开发,发布在不同环境的测试服务器上);

4)模拟延时,支持前端模拟不同业务场景下的展现;


在明确了主要需求后,我们开始调研公司内已有的和市面上主流的 Mock 工具和平台。

二、调研

公司内:

公司内已有一个功能集成较高的 Mock 效率平台,但是其主要的功能设计为面向服务端和测试,对上述单个设备维度及多测试环境的前端 Mock 需求支持度不够高。

市场调研:

外部市场 Mock 工具大致分为以下三类:


1)数据本地管理

该方法是将 Mock 数据存储在本地-代码或本地存储中,前端在业务代码中使用假数据或通过配置读取数据。这种做法会导致测试代码与业务代码耦合,提交代码和发布前必须删除测试代码或修改配置,容易造成生产事故。即使结合运行环境控制还是存在维护效率低、成本高的问题。


2)Mock 平台:如 Rap\YApi

开源的一些企业级 Mock 平台,提供了接口文档管理,接口数据模拟,接口调试等功能。但这些平台都是围绕接口的契约文档为核心对数据进行 mock 和管理,对于已经接入过接口管理框架(如 Swagger)的组织来说,会存在接口文档同步难的问题。对报文实时回显和多接口不同环境的配置功能支持也不足。


3)代理工具:如 Charles、Fiddler

轻量级的客户端代理工具,能满足日常开发抓包和简单的 Mock 需求。缺点是配置繁琐,对 Mock 数据的管理能力弱,数据和报文也无法共享。


因此我们根据自身痛点开发了 Mars 系统 –基于代理模式的轻量级前端 Mock 平台。较好的解决了上述痛点,支持了业务发展,显著提升了前端开发效率。

三、设计实现

对前端 Mock 平台而言,不论是 PC,H5 还是 App,每个设备的 Mock 需求都会不同。为了解决设备间的差异性,我们将 Mars 定义为基于设备维度的 Mock 平台。

 

摆在我们面前的有两类实现方案:


方案 A:往公司的服务治理中心注册 Mock 地址,前端需要在现有的基础网络设施上配置 Mock 地址。这种方案侧重对后端环境的模拟,需要强依赖服务治理中心,前端不同设备在 Mock 时需要再针对单个设备进行特定配置,不够灵活。


方案 B:通过代理请求的方式,客户端将所有请求发送到 Mock 平台,平台内部判断是走 Mock 还是走原请求。这种方案对请求的控制更加精细,同时也可以将客户端的配置工作转移到 Mock 平台上,客户端使用起来更加方便灵活。

 

综合考虑优缺点后,最终选择代理请求的方案 B 来实现 Mars 平台。

 

Mars 的使命是让设备接入后,从请求发出到接收响应再到 Mars 回显数据,可以清楚的观测到接口信息和 Mock 命中情况,让前端的数据流由原本的黑盒变为白盒,使整个 Mock 流程形成一个闭环。

 

平台的设计中包括两个部分:


一是 GUI 层,负责数据展示和管理用户操作,主要分为实时报文展示,Mock 数据管理以及环境配置等模块,如下图蓝框部分;


二是数据处理层负责处理设备的请求响应,主要分为设备参数解析,Mock 数据筛选以及请求转发等模块,如下图红框部分。



图 1 Mars 框架图

四、功能实现

4.1 数据实时回显

在日常的开发调试中,经常需要查看页面元素对应的接口数据。我们将已发出的请求实时回显到 Mars 页面上,方便观察接口数据变化。


此功能基于 Websocket 实现。用户在 Mars 上选择设备进入设备详情之后,前端通过 Websocket 与平台建立通信链接,这时后端会保存一个以设备号为 ID 的 Websocket 链接实例,之后,平台将该设备的所有请求通过该实例回显到 Mars 前端页面上。



图 2 Mars 数据实时回显图

4.2 Mock 数据控制

Mars 除了支持接口配置固定 Mock 数据以外,还对其他复杂场景进行了支持,例如同一个接口,根据不同的请求参数返回不同的 Mock 数据,即接口与 Mock 数据之间可以分别实现一对一和一对多的关系。

 

此功能主要利用了 Json 报文数据格式化的特性。通过在平台上配置 JsonPath 脚本,让 Mars 对收到的代理请求进行解析,返回相匹配的 Mock 数据。

4.3 网络环境切换

这里的网络环境指的是业务接口的测试,堡垒,生产等环境。

 

当设备需要在指定的网络环境中测试某些功能时,正常情况下前端需要在代码中增加一些配置指向特定的网络环境。在接入 Mars 后,因为使用的代理模式,这些配置工作被转移到平台上,在平台上配置好需要的环境后,在平台上直接切换前端就生效了。

 

在实际应用过程中,我们还遇到了更复杂的业务场景。如后端有多个接口发布在不同的测试环境上:业务需要的接口 1 被发布到测试环境 A,而其它接口在测试环境 B。

这里,我们通过增加子环境的概念,将子环境与设备绑定,实现以接口为维度的环境控制且设备之间相互隔离。回到这个问题,就是针对测试设备在 Mars 中增加一个子测试环境 A,并将设备的基础环境设置为 B。Mars 会将该设备发出的指定接口 1 转发至子测试环境 A,其他请求转发至测试环境 B。具体如下图所示



图 3 Mars 环境切换流程图

4.4 模拟延时

很容易理解,客户端请求被代理后,相当于是与 Mock 平台建立了连接,在平台上为响应设置延时,模拟真实请求返回时间。这样就可以帮助前端轻松构建网络卡顿、超时等各种情况下的表现了。

 

在上述核心功能被实现后,Mars 基本满足了我们对 Mock 平台的核心诉求。Mars 发布上线后,通过收集用户需求和反馈,我们基于核心功能对平台进行了拓展,使 Mars 兼容了更多复杂场景下的问题。主要举例以下两点:


Mock 数据集

上文提到的 Mock 数据控制,主要体现在对单个接口的 Mock 数据上,单接口 Mock 数据与设备绑定,主要适用于开发调试阶段对一些零散接口进行 Mock 调试。


而在集成测试阶段,一个业务场景通常涉及多个接口,不同业务场景下对同一个接口要求的返回数据也不同。如测试预订单程和往返下单流程,同样的查询和政策接口要求返回数据完全不一样,这种情况下操作单接口 Mock 数据费力度很高。


所以我们在单接口 Mock 的基础上拓展了 Mock 数据集的概念,将单个场景中多个接口的 Mock 数据打包成一个集合,设备直接使用集合,极大的提升了 Mock 数据管理效率。

 

后端 Mock 应用

后台服务间的相互调用,调用方实际上也相当于是前端,因此我们将这套代理模式的 Mock 方案也应用到了服务间的调用上,降低了后端对上游服务的依赖。同时,将 Mock 数据集功能与接口自动化测试相结合,为自动化测试平台提供数据支持,使服务端接口自动化测试覆盖率提升至 90%以上。

五、一些问题

基于代理模式的 Mock 方案为实现实时报文显示和子环境切换功能提供了便利,但也引入了一些问题,如:

 

1)内存占用较大

代理模式下客户端的所有请求响应的数据大小对于 Mock 平台来说都是未知的,当遇到数据量大的接口被频繁调用时,会造成应用内存升高,JVM 触发 Full GC 影响性能。需要在申请 Mock 应用内存时对使用量进行合理评估,保证稳定性。

 

2)响应时间增长

代理模式相当于多了一层网络调用,接口的响应耗时会有所增加,在需要测试接口极致性能时,需要评估代理方式是否适用。

六、结语

Mars 平台目前已被多个团队使用,产出近 2W 条 Mock 数据,600 多个 Mock 数据集,平均每天代理 130 个左右设备的流量,基本满足了在开发调试过程中 95%的 Mock 需求。与此同时,我们也一直在使用过程中不断验证、优化,并开始与携程内部其他开发效率工具融合,使 Mars 能为 IBU 机票业务的快速发展保驾护航。


作者介绍:

Chris Xia,携程资深前端开发工程师,关注前端技术更新和研发效率提升。


本文转载自:携程技术中心(ID:ctriptech)

原文链接:干货 | 代理模式Mock平台在携程的应用

活动推荐:

2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。

2021-03-05 13:002013

评论

发布
暂无评论
发现更多内容

数仓发展史:大数据的“底气”来自于哪?

鼎道智联

大数据 数据仓库

远程控制电脑软件哪个好?

RayLink远程工具

远程控制软件 远控软件 远程桌面连接

腾讯首席架构师亲自码出的“Redis深度笔记”PDF版限时分享

开心学Java

Java 数据库 redis 腾讯

天天预约|新功能工具「美团优惠券」上线啦!

天天预约

软件测试/测试开发丨app自动化测试之Capability 使用进阶

测试人

软件测试 自动化测试 测试开发 appium capability

2023 年开源现状报告确认安全是首要问题

开源雨林

统计学 开源软件 开源现状

火山引擎DataTester:抖音的设计团队是如何用A/B测试实现高效优化的?

字节跳动数据平台

大数据 AB testing实战 抖音 A/B 测试 企业号 3 月 PK 榜

宝刀未老?低代码何德何能受大厂们的推崇

这我可不懂

低代码 数字化 大厂 JNPF

云原生月报丨值得开发者关注的最新动态

阿里巴巴中间件

阿里云 云原生 月报

直播|SeaTunnel 与 StarRocks 生态融合--让大数据处理回归「简单」

StarRocks

数据库 数据库·

2023腾讯最新发布JVM调优笔记,轻松拿捏JVM面试,调优

开心学Java

Java JVM GC

你掌握了吗?在PCB设计中,又快又准地放置元件

华秋PCB

模块 元器件 PCB 原理图 PCB设计

MobPush,专业和免费的消息推送SDK

MobTech袤博科技

手把手教小伙伴们使用 Nginx 部署 TienChin 项目!

江南一点雨

Java nginx Vue 前后端分离 springboot

基于ByteHouse构建实时数仓实践

字节跳动数据平台

数据库 云原生 Clickhouse 企业号 3 月 PK 榜

虚拟机专用Win10/win11系统镜像下载(m1/intel合集)

真大的脸盆

Mac win10 Mac 软件 win11 win镜像文件

Github霸榜!由阿里出品的最新java面试极速突击核心讲

Java编程日记

Java 架构 面试 java程序员 java面试

2023年市场快速恢复,社交资讯营销如何把握新机遇

易观分析

社交 资讯

Open-GeoIP:超简单的开源IP地址位置查询服务

冯骐

golang 开源 网络 ip地理定位 geoip

镜舟数据库与用友 YonBIP 完成兼容性认证,携手赋能企业数智化发展

镜舟数据库

数据库

对话 BitSail Contributor | 吴畅:从好奇,到深入

字节跳动数据平台

大数据 开源 开发者 数据集成 企业号 3 月 PK 榜

数字孪生智慧停车场三维可视化管理云平台

2D3D前端可视化开发

智慧停车场 停车场三维可视化 数字孪生智慧停车 无人值守停车场 停车场物联网系统

使用 CnosDB 与 TensorFlow 进行时间序列预测

CnosDB

tensorflow 时序数据库 时间序列预测 CnosDB

对话抖音电商:量级庞大、参差不齐,“数据质量治理”有妙招!

字节跳动数据平台

大数据 数据治理 电商 抖音 企业号 3 月 PK 榜

《流浪地球2》里的机器人企业,如何高质量地交付产品?

万事ONES

最新Github霸榜标星96K!号称Java八股“PLUS”版,限时开源!

Java编程日记

Java 程序员 架构 Java 面试 java程序员

计算界年度大赛“先导杯”再度来袭!

科技热闻

中国券商数字化转型趋势报告2023

易观分析

金融 券商 经济

国内首家!云科通明湖应用交付控制器通过金融信创生态实验室适配验证

云科通明湖

软件测试/测试开发丨app自动化测试之模拟器控制

测试人

软件测试 自动化测试 Android Studio 测试开发 appium

解决方案| anyRTC融合腾讯会议

anyRTC开发者

音视频 视频会议 视频通话 融合会议 腾讯会议

  • 扫码添加小助手
    领取最新资料包
干货 | 代理模式Mock平台在携程的应用_架构_携程技术_InfoQ精选文章