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 接受到服务注册请求后,会将该服务的代码仓库地址发送到