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

1344                                     Journal of Software  软件学报 Vol.32, No.5,  May 2021

                                                                                                in
                        功能接口 i i 所提供的非结构化文本形式的功能语义描述,l i 表示接口所提供的质量约束, d 和 d                        i out  分
                                                                                               i
                        别表示接口输入参数和输出参数的大小(单位 KB).
                    •   c 表示服务器运行服务 s 所需的计算资源(如 CPU、RAM、存储空间、网络带宽总量等).
                    •   m 表示服务 s 在资源 c 的情况下,能够在保证服务质量前提下的最大用户数量.
                    •   v=〈MAJOR,MINOR,PATCH〉表示服务的版本号.采用了广泛使用的 Semantic Version 定义:MAJOR 变化
                        表示发生了不能向前兼容的 API 变化,MINOR 变化表示以向前兼容的方式修改、增加了功能,PATCH
                        表示修复了漏洞且保持向前兼容(https://semver.org/).
                    现有的大多数微服务框架如 SpringCloud 中的传统调用依赖关系可以描述为〈s,i〉,通过对服务名称和接口
                 构建相应的路由表以达到服务之间的相互调用,不具备对指定版本的定向请求.且一旦将某些微服务升级到具
                 有不兼容更改的新版本,其他服务就需要在代码级别上对其进行修改,这增加了开发人员的负担.此外,开发人
                 员必须注意系统中越来越复杂的版本依赖,以确保系统中请求的正确路由.为了达到在不进行代码修改且不重
                 启服务实例的情况下,在运行时对依赖关系进行修改,对传统的依赖关系类型进行了拓展:
                    定义 2.  D={p v ,p i ,p f }为服务系统中的 3 种依赖类型的集合,表示一个服务对其他微服务接口或者功能的具
                 体调用关系,其中,
                    •   p v (s,i,v)=〈s,i,v〉,表示一个服务对服务版本在集合 V 中的服务 s 的功能接口 i 的依赖关系,V={v 1 ,v 2 ,…,
                        v n }.即调用版本集合 V 中任意版本的服务 s 的接口 I.
                    •   p i (s,i,L)=〈s,i,L〉,表示一个服务对服务 s 的功能接口 i,且其质量约束在集合 L 中的依赖关系,L={l 1 ,l 2 ,…,
                        l n }.即调用服务 s 任意一个质量约束在 L 中的接口 I.
                    •   p f (f,L)=〈f,L〉,表示一个服务对任意具备功能 f 且质量约束在集合 L 中的接口的依赖关系.即表示调用任
                        意一个功能为 f 的接口,且该接口的服务质量约束在 L 中.
                    在诸如 OpenFeign(https://spring.io/projects/spring-cloud-openfeign)等现有的微服务框架中,微服务之间的
                 API 调用通常是硬编码在代码中,当出现由于错误修复而导致被调用的微服务发生不兼容升级时,如果不进行
                 代码修改,则无法变更微服务之间的依赖关系,进而导致现有方式无法适应快速迭代开发.而通过 3 种微服务依
                 赖类型,可以灵活地对微服务之间的依赖关系进行刻画,并在处理请求定向时,由于可以不与具体版本的服务进
                 行绑定,有着更广泛的定向选择,能够更好地调整实例的部署情况.此外,针对调用关系 p v ,允许开发者通过版本
                 号表示服务的向前兼容性,从而让系统能够按照版本号进行依赖判断,从而为用户需求选择更加合适的服务.
                    定义 3. VDM={〈s,v,p〉|s∈S},微服务系统中的版本依赖模型 VDM 刻画了微服务系统中所有微服务每个版本
                 的依赖关系.P={p 1 ,p 2 ,…,p n },p i ∈D.表示每个服务可能有着多个依赖.〈s,v,p〉表示 v 版本的服务 s 对其他服务的依
                 赖关系为集合 P.
                    VDM 通过 p v 在传统的服务之间的依赖描述上增加了版本集合,对 SDG 进行了拓展,允许系统将指定版本
                 范围的请求重定向到兼容版本.此外,VDM 还提供了另外两个新的依赖类型 p i 和 p f .当尝试请求具有特定 SLA
                 的服务接口时使用 p i ,系统可以自动将具备 p i 依赖的请求路由到具有期望 SLA 的实例上,无需指定服务的具体
                 版本,即使微服务经常升级,也能够主动定向到符合的实例上.而 p f 允许开发人员按功能和预期 SLA 进行功能请
                 求,这进一步分离微服务之间的依赖关系,服务系统可以将请求重定向到具有最佳 SLA 和性能的实例.开发人员
                 无需在微服务的独立迭代开发过程中修改源代码,降低了开发人员的负担.
                 1.2   自适应系统设计
                    多版本共存的微服务自适应系统由两部分构成:支持多版本的微服务编程框架 MF4MS 以及微服务系统架
                 构 MI4MS.其中,MF4MS 负责在代码层级对多版本共存提供支持,提供对 3 种依赖关系的配置以及对具备指定
                 依赖关系请求的支持;MI4MS 负责在服务实例层面对服务部署进行针对用户需求变化的自动调控.
                 1.2.1    编程框架设计
                    编程框架 MF4MS 需要具备以下功能.
                    (1)  提供对 3 种版本依赖关系的配置功能,开发者可以通过编写指定格式的配置文件表示该服务的版本
   115   116   117   118   119   120   121   122   123   124   125