Page 159 - 《软件学报》2020年第11期
P. 159
丁丹 等:场景驱动且自底向上的单体系统微服务拆分方法 3475
务平台系统作为案例,阐述微服务拆分方法的分析过程.
首先,通过人工分析 Spring JPetStore 的主要功能和流程,我们得出了如表 3 所示的 8 个主要测试场景;然后,
人工为每个场景分配一定的权重,权重的取值范围为[1,2].考虑到“登录”和“下订单”是比较重要的场景,而“浏览
商品”出现频率最高,所以适当地增加了这 3 个场景的权重,其他场景权重均为最小值 1.表 3 同时给出了每个场
景中进行了数据操作的调用链类型和对应的入口方法名,其中重复出现的调用链类型不再标记入口方法名.所
谓的调用链类型是指:如果两条调用链执行的方法、SQL 语句以及执行顺序完全相同,那么这两条调用链的调
用链类型相同.不同的场景可能会包含相同的调用链类型,比如“浏览商品”和“添加购物车”都有 T4 和 T5 这两
种调用链类型.需要说明的是,如果两条调用链的入口方法名相同,即访问的后台接口相同,对应的调用链类型
不一定相同.访问同一个后台接口,传入参数的不同,可能导致调用链执行的方法或执行顺序不完全相同(例如
后台逻辑存在 if-else 分支,根据传入参数的值做不同的操作),但这种情况在 Spring JPetStore 项目中并没有出现.
Table 3 Test scenarios list of Spring JPetStore
表 3 Spring JPetStore 测试场景列表
测试场景 权重 调用链类型编号(调用链入口方法名)
注册 1 T1(newAccount)
登录 1.5 T2(loadUserByUsername)
搜索商品 1 T3(searchProducts)
浏览商品 2 T4(viewCategory),T5(viewProduct),T6(viewItem)
添加购物车 1 T4,T5,T7(addItemToCart)
下订单 1.5 T8(newOrder),T9(viewOrder)
查看订单 1 T10(listOrders),T9
修改个人信息 1 T11(editAccount)
为了直观地展示调用链与数据表的关联,表 4 列出了表 3 中所有调用链类型执行的 SQL 语句编号及每条
SQL 语句操作的数据表(重复出现的 SQL 语句不再标记数据表).同样可以看到,不同的调用链类型可能会执行
相同的 SQL 语句,虽然筛选查询条件(即 WHERE 子句后的条件)的参数传入值会不同,但是它们对应于同一个
数据访问层方法、操作的数据表是一样的.
Table 4 Trace type list of Spring JPetStore
表 4 Spring JPetStore 调用链类型列表
调用链类型 执行的 SQL 语句编号(操作的数据表名)
T1 SQL1(account),SQL2(profile),SQL3(signon)
T2 SQL4(account,profile,signon,bannerdata),SQL5 (product)
T3 SQL6(product)
T4 SQL7(category),SQL5
T5 SQL8(item,product),SQL9(product)
T6 SQL10(product,item,inventory)
T7 SQL11(inventory),SQL10
T8 SQL12(sequence),SQL13(sequence),SQL14(inventory),SQL15(orders),SQL16(orderstatus),SQL17(lineitem)
T9 SQL18(orders,orderstatus),SQL19(lineitem),SQL10,SQL11
T10 SQL20(orders,orderstatus)
T11 SQL21(account),SQL22(profile),SQL23(signon),SQL4,SQL5
使用 MSDecomposer 对 Spring JPetStore 进行监控和分析,从监控到的 12 张表中提取出了一个共享群组,
包含 category(宠物大类,例如猫、狗),product(具体种类,例如斗牛犬、吉娃娃),item(更加详细的体型/年龄/性别
划分,例如成年/未成年、雌性/雄性)和 inventory(每个 item 对应的库存数量)这 4 张和宠物相关的数据表.不对该
共享群组做任何修改,同时也不对微服务数量和拆分代价所占比例(默认为 0,不考虑拆分代价)做任何定制化调
整,即跳过“反馈调整”的步骤,直接生成最终拆分方案.方案共产生 4 个微服务,原系统中的数据表被划分到了 3
个微服务中 MS1~MS13,而 MS4 包含了所有与数据表无关的方法和类.
• MS1 包含 4 张与用户相关的表,分别是 account(账户表,记录用户的姓名、邮件、住址等信息),profile(用
户偏好表,记录用户喜欢的宠物类型),signon(专门记录用户名和密码)和 bannerdata(存储用户偏好的宠