Page 68 - 《软件学报》2021年第5期
P. 68

1292                                     Journal of Software  软件学报 Vol.32, No.5,  May 2021

                 G1 的边权重越大表示结点间的距离越近,因此在计算最小生成树之前需要对边权重值取倒数;所生成的 MST
                 中包含了关系最为紧密的业务操作结点和边,对 MST 涉及的边权重值进行排序和反转操作,依次删除权重值越
                 高的边来实现耦合度较低的业务操作的拆分,并通过深度优先搜索算法(depth-first-search,简称 DFS)遍历剩余
                 边组成的子图.本文通过预期的微服务个数和每个微服务类个数阈值这两个参数作为算法的终止条件,不同的
                 参数设置可以产生不同的微服务化拆分结果,用户可以根据自己的需求进行设置,一定程度上保证了方法在使
                 用过程中的灵活性.
                    2)  基于 K-means 的数据库表拆分
                    Database per Service 原则倡导每个服务维护自己的数据库,其他的微服务通过向外暴露的接口来访问服务
                 私有的数据,因此在向微服务架构迁移时,需要对数据库表进行拆分.现有的 DFD 方法中涉及了数据库表的拆
                 分,但与业务操作拆分类似,其仅考虑了操作与数据存储之间有无数据交互关系,使用预先定义的简单规则来实
                 现拆分;其他工作集中在通过设计阶段数据库实体的结构分析以及其被系统访问的特征来进行拆分.然而一般
                 情况下,单体系统,尤其是复杂单体系统中使用的集中式数据库中,数据库表之间存在耦合和粘连性,设计阶段
                 单一特征分析和简单的规则无法全面解决该问题,有可能会造成拆分的粒度过细或过粗,从而导致后期微服务
                 之间的频繁交互而影响性能.
                    本文在前一阶段业务拆分结果的基础上,依据第 2.1.1 节收集的类级别的业务操作与数据存储之间的交互
                 关系来分析其在运行时对数据的访问特征,通过 K-means 算法来实现数据库表的有效拆分.K-means 算法依赖的
                 参数是上一阶段聚类产生的业务操作集合为结点、集合中操作与数据库表交互关系为边所生成的带权图 G2,
                 以及根据数据库实体关系分析初步设定的数据库表中心点集合.具体实现过程中,由于操作对数据的访问频率
                 越高同样代表其之间的关系越紧密,因此以图 G2 边权重值倒数计算结点到中心点的 Dijkstra 最短路径,将结点
                 放到与之路径最短的中心结点簇中;然后在每个中心点的簇中选出结点度最大的结点为该簇的中心点(如果度
                 相同,则选取权重最大的),直至中心点不再发生变化或迭代次数为 0;最后输出中心点与其簇中结点,其代表了
                 包含数据库表的微服务候选集.
                 2.3   原型工具

                    本文设计并实现了原型平台来支撑优化的数据流驱动的微服务化拆分方法,平台的架构设计如图 6 所示.
                 平台采用了前后端分离的分层架构,包含了与用户直接交互的展示层、提供业务接口的服务层和存储数据的数
                 据存储层.展示交互层使用 Vue 和 Element 实现,给用户提供方便易用的可视化页面.用户可以在系统管理页面
                 完成对拆分项目和项目执行任务的管理,在数据收集页面对拆分项目的系统数据进行收集,在服务拆分页面执
                 行拆分算法生成微服务候选集并查看该拆分方案的详情,在评估对比页面比较各个划分方案的指标变化.服务
                 层通过 SpringBoot 来实现,向展示层暴露 RESTful API 来提供服务.在服务层中又分为核心业务层和基础服务
                 层:核心业务层是用来实现平台的主要功能,包括系统管理模块、数据收集模块、服务拆分模块和结果评估模
                 块;而基础服务层是由职责较为单一的基础功能模块组成,考虑到平台后期的可扩展性,这些基础功能模块以插
                 件的形式提供服务,平台用户可根据所收集的信息或算法的不同来进行功能扩展.目前包含的插件服务中,数据
                 流信息收集服务主要为微服务化拆分提供了基于 Pinpoint 的项目运行时数据信息收集和基于 ASM 的静态源
                 码数据信息收集的功能,基于数据流的拆分服务是基于本文优化提出的两阶段的聚类算法的实现,指标评估服
                 务给出了微服务化拆分方案的评判指标,任务管理服务负责调度系统中的插件运行,插件管理服务帮助系统组
                 织具体插件的注册和卸载.其中,平台通过数据流信息收集服务插件远程连接经过本文改造后的 Pinpoint Web
                 暴露的接口获取系统的数据流信息.具体来讲,改造后的接口首先通过 appName 找到与目标项目有关的运行时
                 的信息,然后使用 SpanService 获取 SpanResult 列表,每一个 Span 代表事务经过单个逻辑结点的跟踪,Span 记录
                 了重要的类调用及其相关数据,最后根据需要的项目业务结点对 SpanResult 的数据进行筛选和整理,返回目标
                 系统类级别的调用关系.数据存储层使用了 MySql 数据库,通过与服务层 MVC 模型中的 Dao 层通信进行数据
                 持久化的工作.
                    原型工具核心的服务拆分模块的实现效果如图 7 所示,该页面中展示了拆分方案的参数信息、拆分后的评
   63   64   65   66   67   68   69   70   71   72   73