阿里妹导读:稳定性是历年双11的技术质量保障核心。从 2016 年开始淘宝技术质量部潜心修行,创新地研发了一套实时无侵入的字节码加强框架,因而「JVM-SANDBOX」诞生了,而且顺手在 MTSC 大会上拿了开源贡献奖,今天,咱们来瞅瞅这个拿奖的项目。java
在近日举行的中国移动互联网测试开发大会(简称MTSC大会),来自淘系技术质量开源项目「JVM-SANDBOX」以及淘系同窗参与维护的「 ATX」 包揽了 MTSC 2019 年度开源贡献奖,表彰过去一年在测试领域开源项目中的突出贡献。其中,「JVM-SANDBOX」致力于为服务端稳定性领域提供实时无侵入的字节码加强框架。服务器
功能回归、业务/系统监控、问题排查定位、强弱依赖、故障演练等是阿里 10 年双十一沉淀积累下来的稳定性专项,也是历年双十一质量保障的核心要素。要有效、轻量级地实现这些稳定性专项,都会触及到一块底层技术—— java 字节码加强。若是每一个专项都能本身实现一套字节码加强逻辑,实现的门槛高、投入和维护成本高,且不一样专项间相互影响形成不可预知的风险。如何屏蔽字节码加强技术的高门槛,下降成本,同时又能支持上层多个专项功能的快速实现和动态管理,成为淘宝技术质量部的目标。从 2016 年开始咱们潜心修行,创新地研发了一套实时无侵入的字节码加强框架,因而 「JVM-SANDBOX」 诞生了。架构
对上面提到的专项进行抽象分析:框架
不难发现,要解决这些问题本质就是如何完成 java 方法的环绕管控和运行时行链路的获取,即 AOP 框架的解决方案。目前经常使用 AOP 框架的解决方案有两种:proxy 和埋点。proxy 的优势在于已实现了统一的 API,减小了重复投入,可是不能实时生效,须要系统编译重启。埋点的优势在于动态生效灵活度高,可是没有统一 API。测试
要快速解决上边的三个问题,咱们须要的 AOP 解决方案必须具有两个特性:编码
基于以上需求,咱们研发了 JVM-Sandbox。spa
JVM-Sandbox 由纯 Java 编码完成,基于 JVMTI 技术规范,为观察和改变代码运行结果提供了即插即用模块接口的容器,提供两个核心功能:实时无侵入 AOP 框架和动态可插拔的模块管理容器。code
2.1 JVM-Sandbox的核心功能中间件
2.2 JVM—Sandbox的核心事件模型接口
BEFORE、RETURN 和 THROWS 三个环节事件的正常流转和干预流转。
2.3 总体架构
沙箱一共由三大核心功能组件构成
沙箱的底层提供了一个 HTTP-SERVER(Jetty),经过 HTTP 协议完成 sandbox.sh
和沙箱的控制交互,同时也给各个模块提供了基于 HttpServlet 和 WebSocket 规范的 API,各模块能够复用沙箱完成各自模块的控制与交互。
3.一、线上故障演练
17年故障演练平台在 JVM-Sandbox 基础上仅耗时1周即完成故障注入部分的系统重构。重构后的系统在挂载效率和挂载成功率方面有了明显的提高,极大地缩短故障演练的时间,演练效率提高了数十倍。基于 JVM-Sandbox 改造后的故障演练平台,通用性强,全部基于 JVM 启动的系统均支持,极大地拓展了故障演练的范围,故障演练已达到集团级部署。
与16年故障演练数据对比,17年的故障演练平台,覆盖 BU 提高了1.6倍,覆盖应用提高了5倍,覆盖场景提高了37倍。18年故障演练平台覆盖了阿里集团,并演化为如今的攻防演练。
3.二、依赖检测
17年强弱依赖自动化检测平台诞生。它提供了依赖检测、强弱分析、依赖扫描、故障注入等多种能力,底层能力基于 JVM-Sandbox 在1周内完成功能开发。利用其模块容器的特性,将前人开发的模块与新增模块一块儿挂载共同工做,完成平台功能。
强弱依赖梳理方面,承载了淘宝的系统强弱依赖梳理工做,260+个应用一键接入系统,并实现了0人工成本的自动化、智能化梳理。18年与 Mock 回放相结合,实现写接口依赖自动检测功能,目前正在不断完善。
3.三、服务端录制隔离回放机制
在 JVM-Sandbox 基础上开发了一个 SS 模块,至关于一个录音机+回放机, 在调用中间件的时候, 顺序录制下了咱们的中间件请求,而且存储这份‘磁带’到服务器上。当咱们须要隔离回放的时候, 将这份‘磁带’找到, 而且在须要的时候直接从‘磁带’读取, 并不须要真实地请求咱们的中间件, 这样就保证了咱们的读、写接口也能作到可重复使用,从而实现服务端的隔离回放。线上录制隔离回放不只极大地缩短业务回归的耗时,把业务测试同窗从繁琐的数据准备和接口自动化脚本的编写过程当中解放出来,并且极大地拓展了覆盖范围,使回归的范围更贴近用户,且场景更丰富。
3.四、精准回归
服务端录制隔离回放机制诞生以后,虽然有效地提高了覆盖范围,下降了自动化脚本的人工投入,可是也带来了新的问题。线上录制的场景是海量的,单个系统均可以达到万级、十万级甚至百万级别的录制,这些录制的场景中,存在大量的重复场景,如何识别重复场景,实现有效、精准的回放,成为新的待解决问题。在 JVM-Sandbox的基础上,利用 LineEvnet 实现了行链路识别和标记,有效地提高了回放的精准度和效率。
目前基于 JVM-Sandbox,上层有阿里两个开源的模块:chaosblade——故障演练,Repeater——录制回放,后续还会逐步开源其余模块功能,社区目前已经有900+的人群参与讨论共建,累计得到2000+的star支持,JVM-Sandbox的社区建设也期待您的加入。
咱们的每一步都是为测试领域的标准化建设作努力,但愿更多对测试技术发展感兴趣的小伙伴能够加入社区,一块儿为测试领域的发展作贡献。
若是您有兴趣加入淘系技术质量团队,和咱们一块儿投入到测试领域发展建设中,欢迎投递简历至 taobaoqa2019@list.alibaba-inc.com。
本文来自云栖社区合做伙伴“阿里技术”,如需转载请联系原做者。