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

贺祥  等:多版本共存的微服务系统自适应演化方法                                                        1357


                 例以及服务 A 的新版本)以及删除 3 个实例(失效依赖实例以及服务 A 的旧版本).而 JRO 由于支持带依赖部署,
                 因此只需要删除失效依赖实例以及服务 A 的旧版本,并部署新版本的 A 及其依赖,共 4 个操作指令.
                    实验 12、实验 13 中,由于 Kubernetes 与 JRO 不具备运行时的依赖变更,因此需要对源码进行修改,停止原
                 实例并部署新的实例.且由于 Kubernetes 不支持依赖关系,JRO 仅支持部署时的依赖关系,因此两种方法均需要
                 多次指令才能够达到最终效果.而本文的方法支持运行时依赖变更且只需要 1 次以及 3 次操作即可.
                    此外,由于 Kubernetes 不支持依赖关系,JRO 在运行时需要用户主动提供依赖信息,因此均需要人工参与;而
                 MI4MS 支持对服务依赖关系的自动分析获取,因此不需要人工参与.从实验结果可以看出:MI4MS 能够主动考
                 虑服务之间的依赖关系,对特定的 DevOps 操作降低开发者的负担.
                    在实验过程中,本文提出的方法需要若干系统相关数据:用户需求分布情况、实例分布情况、服务器节点
                 资源分配情况.其中,实例分配情况与服务器节点资源分配情况均在实例的创建、删除过程中,同步记录到
                 ControlCenter 中,因此无需重复进行实时的信息采集;用户需求分布情况主要由各个 Gateway 实例负责记录,只
                 需保留每种需求的用户数量即可,传输的数据量较少,对系统的性能影响亦较少.

                 5    相关工作

                    近年来研究了多版本共存、演化计划生成和自适应服务系统中的问题,并提出了一些解决方案.
                    对于多版本共存,文献[14]探索了微服务系统中的自主版本管理.它考虑了应用程序级别和公司级别的微
                 服务版本控制,允许服务的热替换、在不干扰其他服务正常运行情况下的服务升级.通过对微服务版本的自动
                 管理,利用服务迁移等手段,确保系统能够从错误状态快速恢复.文献[8]提出了基于微服务依赖关系图进行系统
                 自我修复的工具 APP-bisect,该工具利用不同微服务不同版本的依赖关系,当服务系统发生性能故障时,通过分
                 析微服务之间的依赖关系,寻找各个微服务之间最佳的版本共存模式,移除所有的其他版本实例,来消除性能故
                 障.文献[9]提出了一种名为 VMAMVS 的解决方案,用于分析微服务之间的依赖关系,监视系统并可视化这些依
                 赖关系.该方法通过在源代码层面上自动解析基于 Java 的微服务,利用特定的微服务框架的注解等关键特征,分
                 析不同微服务之间的调用关系,构建出微服务依赖模型.同时,利用微服务的接口信息构建系统监控指标,结合
                 服务日志分析实现运行时的系统监控,并最终进行可视化操作.文献[15]对微服务架构进行了拓展.通过在服务
                 网关中的智能路由算法,允许多版本共存的微服务系统中的客户端和微服务请求指定微服务的特定版本,在满
                 足用户期望的服务质量的情况下,降低了服务的运行代价.文献[16]提出了基于适配器的方法以消除了同一服
                 务的不同版本之间的接口差异问题.通过对不同版本的相同接口进行分析,针对不能直接兼容的接口,通过动态
                 构建不同版本之间的适配器,允许高版本的服务实例响应低版本的接口.文献[13]提出了 JRO 工具,通过用户在
                 配置文件中对服务之间的描述关系的描述,自动在部署服务实例时确保依赖能够得到满足.但是,该种方法不支
                 持多版本共存.尽管这些工作中考虑了微服务之间的依赖关系,它们专注于特定版本的请求路由、监测、问题
                 溯源及恢复,而不是根据用户需求的变化进行自适应演变.本文通过编程框架 MF4MS 以及系统架构 MI4MS 的
                 协作,能够自动进行微服务之间的版本依赖分析以及建模,并能够对已有的版本依赖主动进行兼容拓展,大大降
                 低了微服务之间版本依赖维护的复杂性,满足了快速迭代开发的需求.
                    在演化方案生成方面,文献[17]评估了 3 种雾计算(fog computing)场景下的服务重部署算法,在考虑了服务
                 资源使用、服务传播性(service spread)和延迟的优化目标下,计算服务的重部署方案.文献[18]提出了一种服务
                 放置的优化策略,通过将用户使用的服务尽可能地部署到距离用户较近的边缘节点上,改善网络使用率和服务
                 延迟.然而在当前的工作中,服务之间的依赖关系是固定不变的,与现实中不断变化的服务之间的依赖情况不
                 符,并且没有考虑到用户需求的变化.本文通过基于贪婪的算法,在考虑了服务的版本依赖的情况下,能够针对
                 不同场景下的用户需求变化,快速生成较优的系统演化方案.
                    对于自适应服务系统,文献[10]开发了 MiCADO,通过在服务系统中添加统一的服务编排层,让系统具备根
                 据网络流量变化对系统中的服务进行自动横向拓展以提高系统性能.文献[11,12]使用了 MAPE-K 模型来根据
                 性能自动优化服务部署.通过对系统的运行时监控,根据性能变化来计算出合适的演化方案,并进行方案的自动
   128   129   130   131   132   133   134   135   136   137   138