孟永胜 曹海萍
摘要:系统的可扩展性是构建现代软件系统的一个重要课题,微服务架构通过将功能分解到多个独立的服务,以实现对解决方案或者复杂系统的解耦,该文提供一种基于微服务架构动态扩展软件功能的方法。
关键词:微服务;架构;功能扩展
中图分类号:TP311.5 文献标识码:A 文章编号:1009-3044(2018)23-0105-02
随着IT技术的迅猛发展,软件系统架构在发生着重大变化。对软件系统的要求主要有系统可管理性、可靠性、可扩展性、可维护性和安全性等等。系统的可扩展性是构建现代软件系统的一个重要课题。
微服务架构(Micro Service Architecture)是近年来软件体系架构领域出现的一个新名词,它通过将功能分解到多个独立的服务,以实现对解决方案或者复杂系统的解耦,其根本理念是将大型、复杂且历时长久的应用在架构上设计为内聚的小服务,这些服务能够随着时间的流逝而演化。
软件在运行时动态扩展功能的方法一般有以下几种方式:
1)插件方式。首先定义统一接口,基于Liskov替换原则,对扩展点进行扩展,然后加载动态库。如Java的OSGI框架和著名的Eclipse IDE都属于此类扩展方式;
2)打补丁的方式。在运行时动态更换指针所指的函数,如C/C++语言在通信产品上,一般采用打热补丁的方式修复系统错误,也是运行时扩展功能的一种方式;
3)语言层级的自然支持,如Erlang语言的Hot Code Swapping特性支持在运行时替换模块代码,从而实现功能扩展;
4)配置文件。通過在运行时修改配置文件,可以在一定程度上扩展软件处理业务的范围,但在功能扩展的范围也被限制在某种可配参数范围内,无法加载其他新功能。
软件扩展功能的方式很多,有些语言(如Go语言)只支持引用静态代码直接编译,不支持链接静态库和生成、加载动态库。这样在运行时就无法通过更换动态库文件来扩展功能。
1 微服务扩展
针对无法生成并加载动态库的语言,本文提供一种基于微服务架构动态扩展软件功能的方法。基于微服务扩展软件功能的系统包括以下服务模块,如图1所示:
1)全局名字服务:用于存储微服务的名称和网络地址;
2)扫描注册服务:用于实时扫描微服务并向全局名字服务注册信息;
3)转发代理服务:用于转发微服务之间的请求消息。转发规则定义过程如下:首先定义URL的ACL过滤规则,一条规则对应一个目标资源池,资源池中有若干个相同的微服务实例。若匹配该规则就到对应的资源池中取出某个实例地址进行转发。这样只需要定义不同的转发规则,就可以实现请求的定向转发,进而扩展功能;
4)业务功能服务:指以微服务形式部署的功能模块。
基于微服务架构在运行时动态扩展软件功能的具体流程如下图所示:
第一步,定义功能扩展点及接口;
第二步,将该功能的接口实现改变为微服务的方式;
第三步,建立全局名字服务,收集所有待扩展功能的微服务的注册消息,保存这些微服务的相关信息,如名称和网络地址;
第四步,建立转发代理服务,从全局名字服务获取微服务相关信息并生成转发配置文件,提供对请求消息转发服务;
第五步,实现功能扩展,即提供符合扩展接口的新的实现方式,并以微服务的形式部署;
第六步,微服务之间采用轻量级通信协议(如RESTful,RPC等),微服务发送带有特定URL的请求,转发代理根据转发规则将该请求转发到带有扩展功能的微服务上,从而实现功能扩展。
使用微服务架构,原有系统按照领域驱动设计的方法分解成多个微服务独立部署,各微服务之间通过REST接口通信协作,实现整个系统的功能。按照以上的模块划分,系统每个功能模块都是可扩展的。功能模块在部署时,扫描注册模块会自动发现已启动的微服务,注册到全局名字服务模块,名字服务会将发现的微服务信息存储起来。同时,转发代理模块会周期地从全局名字服务查询当前可用的微服务信息,并生成转发代理的配置文件,以便对微服务功能模块的请求进行正确转发。
2 具体实施方式
2.1 人工配置服务方式
1)人工编辑转发代理模块的配置文件;
2)启动各个微服务进程;
3)功能微服务a发出请求消息1到转发代理服务模块,转发代理根据收到的URL地址及配置的转发规则找到对应的功能微服务b,并将消息转发给功能微服务b;
4)需要用新的功能微服务b来扩展或替换原来的功能微服务2,修改转发代理模块的配置文件,增加功能微服务b的相关信息及转发规则;
5)转发代理模块收到微服务模块a的请求消息3时,根据新的匹配规则将消息4转发给功能微服务b处理,从而实现在不中断系统原有服务的情况下,实现系统功能动态扩展。
2.2 自动发现服务方式
自动发现服务方式如图4所示,相比人工配置服务方式,自动发现服务增加了“扫描注册”和“全局名字”两个服务。
1)业务功能微服务a和b启动以后,扫描注册服务通过实时扫描消息1和2,发现当前启动的微服务,将其信息通过消息3发给 全局名字服务 缓存;
2)全局名字服务 通过消息4将当前最新的微服务信息发送给 转发代理服务,生成其配置文件;
3)转发代理服务收到功能微服务a发送的请求消息5以后,根据目标服务信息匹配和转发规则,以消息6转发给微服务模块b进行处理;
4)根据业务功能需求形成增强的功能微服务b,并正常部署启动运行;
5)周期扫描注册服务实时发现新启动的功能微服务b,并将其信息通过消息8发送给全局名字服务;
6)全局名字服务在收到消息8以后更新本地服务缓存,并通过消息9通知转发代理模块,并更新其配置文件;
7)转发代理模块收到消息10时,可以根据当前的最新目标信息匹配和转发规则,经消息11将其转发给功能微服务b,从而实现业务功能自动扩展。
3 小结
采用本文方法,可以让不支持运行时加载动态库的语言达到动态扩展功能的目的,并且在扩展功能或软件升级过程中不中断原有服务,在提高软件系统可扩展性及可用性上取得明显成效。
参考文献:
[1] 崔蔚,李春阳,刘迪,等.面向微服务的统一应用开发平台[J]. 电力信息与通信技术,2016(9).
[2] 郝庭毅,吴恒,吴国全,等.面向微服务架构的容器级弹性资源供给方法[J].计算机研究与发展, 2017(3).
[3] 翟永超.Spring Cloud微服务实战[M].北京:电子工业出版社,2017.
【通联编辑:光文玲】