Page 125 - 《软件学报》2021年第5期
P. 125
贺祥 等:多版本共存的微服务系统自适应演化方法 1349
I
定义 10. O ={Delete(τ(s),flag),Deploy(s,e,flag)},针对服务实例的 DevOps 操作集合,其中,
• Delete(τ(s),flag),删除服务 s 的指定实例τ(s).flag 为标记位,当 flag 为真时,表示若该实例依赖的服务没
有被其他服务使用,则一起删除;当 flag 为假时,表示仅删除指定实例.
• Deploy(s,e,flag),在服务器节点 e 上部署一个服务 s 的实例.flag 为标记位,当 flag 为真时,若系统中的服
务实例无法满足该服务的版本依赖,则部署上相关服务以确保依赖得到满足;当 flag 为假时,表示仅部
署指定实例.
S
定义 11. O ={Upgrade(τ(s),v,flag),Upgrade(s,v,flag)},针对服务的 DevOps 操作集合,其中,
• Upgrade(τ(s),v,flag),将服务 s 的指定实例τ(s)升级到版本 v.flag 为标记位,当 flag 为真时,同时考虑相关
依赖,删除原版本所使用的相关实例并部署新版本缺失的服务;当 flag 为假时,仅进行指定实例的版本
替换.
• Upgrade(s,v,flag),将系统中所有的服务实例 s 升级到版本 v.
D
定义 12. O ={Change(s,P,flag)},针对服务依赖的 DevOps 操作集合,其中,P={p 1 ,p 2 ,…,p n }为新的依赖描述,
表示将系统中的服务 s 的依赖关系更新为 P.flag 为标记位,当 flag 为真时,自动对系统中已存在的服务实例进行
依赖更新以及相关依赖服务的自动部署;当 flag 为假时,仅替换依赖.
2.2.2 支持服务实例相关的 DevOps 操作的自适应算法
针对服务实例的删除操作 Delete(τ(s),flag),当 flag 为真时,算法 2 通过对已有服务实例之间的依赖分析,筛
选出仅被服务实例τ(s)调用的其他实例,并一起删除.该算法的主要时间复杂度集中在判断每个服务实例所依
赖的其他实例有哪些.设系统中实例数量为 m,则该算法的时间复杂度为 O(m(m−1)).
算法 2. 实例删除算法 delete(τ,flag).
Input:实例τ,标记位 flag.
Output:演化操作集合 opList.
1: opList←{deleteJob(τ)}
2: if flag=true then
3: Inst←getDependInsts(τ)
4: for i in Inst do
5: if usedByOtherInst(i)≠true then
6: opList←opList∪delete(i,flag) //迭代删除没有被使用的依赖
7: end if
8: end for
9: end if
10: return opList
针对服务实例的部署操作 Deploy(s,e,flag),当 flag 为真时,算法 3 通过对已有服务实例以及目标服务 s 的版
本依赖分析,对于能够被直接满足的依赖,则直接使用已有实例;否则,从服务集合 S 中选择能够满足依赖的服务
进行部署.设系统中实例数量为 m,则时间复杂度为 O(m).
算法 3. 实例部署 deploy(s,e,flag)算法.
Input:服务 s,服务器节点 e,标记位 flag.
Output:演化操作集合 opList.
1: opList←{deployJob(s,e)}
2: if flag=true then
3: D←getDependencies(s)
4: for d in D do
5: if depSatisfied(d)≠true then