Page 108 - 《软件学报》2021年第5期
P. 108
1332 Journal of Software 软件学报 Vol.32, No.5, May 2021
个处理外部请求的方法执行序列.Train-Ticket 系统上共收集到 110 条运行轨迹.
Table 4 Summary of the collected data results
表 4 数据收集结果统计
JPetStore Train-Ticket
微服务个数 4(拆分方案 A),3(拆分方案 B) 37(Java 实现的微服务)
源代码行数 LOC 7 441 270 193
运行轨迹数 47 110
修订历史 commit 数 260 282
3.4 JPetStore实验分析
实验评估方案 A 和方案 B 中候选服务 SC=(E ser ,I,O)的可维护性均值,度量结果见表 5.表中加粗单元表示方
案 B 的相应度量值优于方案 A 的相应度量值.从表格数据可以看出,使用本文的可维护性评估方法得出的结论
是:除了 SMQ 和 ECF 之外,方案 A 推荐的候选服务比方案 B 的结果更易于维护.
Table 5 Average Maintainability measurements of service candidates in two decompositions of JPetStore
表 5 JPetStore 两种拆分方案下候选服务的平均可维护性度量结果
拆分 A B
Modularity:SMQ 0.427 0.450
Modularity:CMQ 0.411 0.338
Functionality:IFN 1.000 1.333
Functionality:CHM 0.640 0.636
Functionality:CHD 0.501 0.486
Modifiability:ICF 0.069 0.025
Modifiablility:ECF 0.042 0.037
Modifiability:REI 0.609 1.486
Interaction complexity:ISG 3.957 3.957
Interaction complexity:ICL 20.361 20.362
Interaction complexity:SCN 0 0
Interaction complexity:IDD 0.462 0.962
Interaction complexity:ODD 0.462 0.481
接下来分析上述结果是否与拆分人员的经验分析结果一致.我们与方案设计者进行了沟通:方案 B 设计者
认为订单的查询、增加、删除操作与用户信息紧密绑定,因此将订单(order)逻辑与账户(account)逻辑拆分到同
一个候选服务中;方案 A 的设计者认为订单逻辑和账户逻辑不同,因而拆分到不同的候选服务.双方讨论后一致
认为:与方案 B 相比,方案 A 推荐的候选微服务更遵循单一职责原则,推荐的微服务更符合高内聚低耦合;候选服
务更易于单独修改;由于方案 B 将两种功能逻辑合并在一起,与其他服务的动态交互都集中在该服务中,因此相
应候选服务的交互复杂性相比于方案 A 偏高.因此,方案 A 比方案 B 推荐的候选服务更易于维护.将此人工经验
分析结果与本文方法度量结果(见表 5)进行对比得出:本文方法的结论与微服务设计者的人工经验分析结果基
本一致,一定程度上说明本文方法有效.
3.5 Train-Ticket实验分析
实验评估 Train-Ticket 系统中每个微服务的可维护性.图 2~图 6 展示了可维护性度量结果,其中,箱线图统
计了度量值的分布,曲线图展示具体的度量结果.在曲线图中,图 2(b)、图 3(b)、图 5(b)的横坐标对应微服务,图
6(b)、图 6(c)的横坐标对应运行轨迹 trace.
图 2(a)可得:除 ts-auth-service 和 ts-food-map-service 的 ifn=2(即对外提供 2 个接口)之外,其他微服务的
ifn=2.在图 2(b)中,chm 和 chd 的中位数位于 0.4~0.5,存在小于 0.2 离散点值.结合图 2(c)得出,微服务 ts-preserve-
service 的 chm 和 chd 度量值低于 0.2.
图 3(a)中 icf 和 ecf 值的分布显示:微服务总体上满足跨服务边界的共同修改频度低于服务内部的共同修改
频度,即 ecf<icf.结合图 3(b)发现,ts-preserve-service 和 ts-travel2-service 的 rei 值大于 1,其他微服务的相应值均
小于 1.这意味着:在所有微服务中,只有这两个微服务会更频繁与其他微服务发生共同修改.