Page 66 - 《软件学报》2021年第5期
P. 66
1290 Journal of Software 软件学报 Vol.32, No.5, May 2021
权图,并实现第 2 和第 3 阶段的图聚类算法以来进行业务微服务和数据存储的拆分:第 2 阶段中,对于第 1 阶段
追踪到的动静态交互信息中操作与操作的调用关系生成带权图,使用基于最小生成树 MST 的算法进行聚类,得
到业务操作的聚类集合,即业务服务的拆分方案;第 3 阶段以第 2 阶段聚类后的业务操作集合为结点,并结合第
一阶段追踪的动静态交互信息中操作与数据库表的交互关系生成带权图,使用 K-means 算法进行聚类,得到数
据库表对应操作结合的拆分结果.综合第 2 和第 3 阶段的聚类结果,输出微服务的候选,包括业务服务集合和相
应的数据库表分配方案.
2.2.1 数据流信息收集过程与分析过程优化
本文首先从效率的角度对现有的数据流驱动的微服务化拆分方法 DFD 进行了优化,基于动态链路追踪技
术与静态字节码解析技术相结合的自动化方式来代替手动的数据流图分析与构建,实现数据流信息的自动收
集,以供后期分析业务操作的数据交互关系信息进行聚类分析,以支持候选微服务的识别.
1) 基于 Pinpoint 的动态链路追踪
本文选择了开源工具 Pinpoint(https://github.com/naver/pinpoint),并对其进行封装和改造,以支持单体系统
运行时的动态链路分析.Pinpoint 本身是一个应用性能管理(application performance management,简称 APM)工
具,其具备分析系统的整体结构以及追踪其内部不同服务之间通信链路的功能.Pinpoint 可以通过分布式事务
跟踪,实现跨应用的消息定位,同时能够自动检测系统的拓扑结构,提供代码级别的可见性;此外,该工具主要通
过 Java 探针技术实现客户代码无侵入的链路分析,即在使用 Pinpoint 收集运行时信息时,无需改写应用代码,无
需增加锚点.
基于 Pinpoint 进行数据流信息的过程如图 4 所示,流程中主要涉及了代理 Agent、日志收集器 Collector 和
控制台 Web 这 3 个组件.其中,代理 Agent 组件用于数据采集,通过打成 JAR 包的形式和软件系统一起启动且与
其共享 JVM,并且可以将运行时代码级别的调用关系数据定时发送给日志收集器 Collector,以供后期的链路特
征分析;Collector 组件接收到代理 Agent 发送的数据,会将其存储到 Hbase 中;最后由控制台 Web 组件从 Hbase
中读取数据,并展示到自带的前端页面.
Fig.4 Process of dynamic tracing using Pinpoint
图 4 基于 Pinpoint 的动态链路追踪过程
通过 Pinpoint 进行服务链路日志采集需要自行实现代理 Agent 插件,为了降低该步的复杂度并减少出错的
可能性,本文使用 pinpoint-plugin-generate(https://github.com/bbossgroups/pinpoint-plugin-generate)帮助快速生
成目标系统的 Pinpoint 代理插件;然后将目标系统生成的代理插件加入到 Pinpoint plugins 包中,并在目标系统
启动时,通过“java agent”启动 pinpoint 代理;最后,Pinpoint 会根据插件所指定的数据进行跟踪,从而实现对目标
项目数据的采集.为了在本文实现的方法中无缝集成 Pinpoint 的分析结果,本文改造了 Web 模块,使其暴露出以
供本文基于优化方法实现的原型工具平台查询的接口,实现了该平台基于 Pinpoint 对于待拆分系统动态运行数
据流信息的自动收集(详见第 2.2 节).
2) 基于 ASM(https://asm.ow2.io)的静态字节码解析
为了解决动态链路追踪覆盖率不全、无法获得未执行到的链路问题,本文结合使用了基于 ASM 的静态字
节码解析技术来补充系统的类、方法等的静态关联信息,保证所收集的数据流信息的全面性.ASM 是一个通用