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

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


                 3    多版本共存的微服务自适应系统实现

                 3.1   编程框架MF4MS实现
                    为了尽可能地降低开发者地负担,需要尽可能少地对原有代码进行变更.同时,为了方便系统对所包含的版
                 本依赖关系进行自动分析,MF4MS 提供了配置文件、注解以及函数接口相结合的方式.
                    (1)  提供指定格式的配置文件,支持 3 种类型的版本依赖以及多依赖的描述,如图 3(a)所示.
                    (2)  提供@MFuncDescription 注解,用于对功能接口功能以及质量信息的描述,如图 3(b)中(1)所示.
                    (3)  提供 MVerRequestUtils.request 函数,用于携带版本依赖描述的请求,如图 3(b)中(2)所示.
                    (4)  提供@MClient 注解,用于在运行时区分出使用了该框架的服务实例,并提供指定的依赖变更接口,运
                         行在运行时接收相应指令并进行依赖变更.


















                           (a) MF4MS 配置                        (b) 集成了 MF4MS 的 Controller
                                           Fig.3    An example of the MF4MS integration
                                                   图 3   MF4MS 使用实例
                 3.2   系统架构MI4MS实现
                 3.2.1    依赖模型自动构建
                    开发人员在开发微服务时,需要在代码级别与 MF4MS 集成,每个微服务的每个版本的版本依赖应配置到
                 配置 application.yaml 中,如图 3(a)所示.同时,在每个接口函数上,需要通过@MFuncDescription 注解添加该 API
                 的功能和 SLA 描述,如图 3(b)(1)所示.和服务有关的其他信息,如每个版本的资源使用情况,服务的最大用户数
                 量和源代码仓库等,应包含在服务进入系统时的服务描述文件中(第 4.2.2 节).
                    Service Analyzer 组件提供了 getMicroserviceInfo 的 Restful 接口,负责接收从 Control Center 传递的指定代
                 码仓库中解析该服务的依赖以及接口等信息.首先,利用 JGit 将指定的微服务源代码克隆到本地;然后,针对每个
                 版本标签分别进行代码解析.根据 Spring Cloud 框架开发的微服务的特性,通过遍历文件来查找 application.
                 yaml 文件,并使用 Yaml 工具对该文件进行解析文,从而获取其中包含的版本依赖信息(mvf4ms.dependencies).
                 此外,它利用 JavaParser 对代码中所有的控制类(controller)进行语法解析,获取其中包含的@MFuncDescription
                 以及对应的接口名称、路径等信息.最后,将这些信息与配置文件中的微服务的名称、开放端口以及版本号信
                 息一起返回.Control Center 接受到分析结构后,将其中所包含的版本依赖信息记录,并合并到已有的版本依赖模
                 型中.
                 3.2.2    服务注册流程
                    服务开发者主动通过 Control Center 的 register 接口将服务注册到系统中,并提供包括服务名称
                 (serviceName)、源代码仓库地址(gitUrl)、每个版本的服务资源消耗情况(resMap)以及每个版本能同时服务的
                 最大用户数量,具体格式如图 4 所示.Control Center 接受到服务注册请求后,会将该服务的代码仓库地址发送到
   122   123   124   125   126   127   128   129   130   131   132