Page 67 - 《软件学报》2021年第5期
P. 67
李杉杉 等:一种优化的数据流驱动的微服务化拆分方法 1291
的轻量级 Java 字节码处理框架,它既可以通过直接产生字节码文件的方式动态生成类,又可以在虚拟机加载类
前,通过修改类行为的方式来增强类的功能.Java 字节码.class 文件通过严格格式定义来描述 Java 类的类名/属
性/方法和指令.ASM 从.class 文件中读入字节码信息后,可以分析类结构,改变类行为,甚至能够生成新的类.
ASM 通过访问者模式实现类信息的获取.访问者模式是一种将数据操作和数据结构分离的设计模式,有一
个元素和一个访问者.元素通过 accept(⋅)方法接受访问者作为参数,并将元素自身传给访问者,在 accept(⋅)方法
中调 用访问者的 visit(⋅) 方法 . 在 ASM 中 ,ClassReader,MethodeNode 等作为被访 问的元素 ,ClassVisitor,
MethodVisitor,FieldVisitor 等是访问者接口.开发者可以使用 ClassReader 类用来解析编译过的 class 字节码文件,
使用 ClassWriter 类用来重新构建编译后的类,通过实现访问者接口的 visit(⋅)方法实现自定义访问.
2.2.2 微服务化拆分算法优化
前面提到,现有的数据流驱动的微服务化拆分算法存在特征分析单一且灵活性不高的问题,本文对于这两
方面的问题从算法层面进行了改进优化.不同于 DFD 方法仅通过交互关系的有无来构建数据流图,并使用有限
的规则来进行拆分,本文增加了两个能反映耦合程度的数据流信息特征收集,即操作之间以及操作和数据存储
之间的交互频率,在此基础上,设计并实现了两阶段的聚类算法(如图 5 所示)来分别支持业务操作拆分和相应数
据库表的分配,两者结合,从而生成候选微服务(业务操作+数据库)的拆分方案.
Fig.5 Microservices-oriented decomposition algorithm of the DFD-A method
图 5 DFD-A 方法的微服务化拆分算法
1) 基于 MST 的业务操作拆分
本文实现了基于最小生成树 MST 的算法来完成业务操作的聚类拆分,该算法依赖的参数是根据第 2.1.1 节
收集的操作间的数据流信息而生成的带权图 G1、预期的微服务个数 m 和每个微服务的类个数阈值 n.其中,图
G1 的结点表示的是类级别的业务操作;边权重表示的是操作结点之间的交互频率,边权重值越大,表示操作之
间的交互越频繁,耦合程度越高,即越倾向于被分到同一个微服务中.该阶段算法的基本原理是:首先,通过
Kruskal 算法生成图 G1 的最小生成树 MST;然后对最小生成树的边权重进行分析和删除,以实现图的拆分.由于