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
   120   121   122   123   124   125   126   127   128   129   130