Research on applying cloud service gateway in urban rail transit
-
摘要: 为解决城市轨道交通信息系统中传统ESB架构技术相对封闭、扩展性不强、功能模块复用性不高、运维复杂等问题,研究应用开源软件Nginx+OpenResty+Kong作为企业云服务网关,搭建试验环境对其主要功能进行测试;测试表明,该云服务网关配置管理简便、功能插件丰富、水平扩展灵活,有助于降低企业信息系统运维难度和成本,减少不必要的软件开发。Abstract: To tackle the problems that the traditional ESB technical architecture used in the information systems of urban rail transit remains relatively closed and complex in operation and maintenance with poor scalability and low reusability of function modules, a study was made on how to apply the open source software Nginx+OpenResty+Kong as urban rail transit enterprise’s cloud service gateway and a lab environment was built to learn its deployment and configuration and to test its main functions. The test results show that the cloud service gateway is horizontally scalable and easy for management and configuration with a wide variety of plug-ins available, which is conducive to reduce the difficulty and cost of operation and maintenance of enterprise information systems and avoid unnecessary software development.
-
Keywords:
- cloud service gateway /
- Ngnix /
- OpenResty /
- application research /
- urban rail transit
-
城市轨道交通信息化横跨多个专业,线网环境下众多信息系统之间相互依赖,逐渐形成网状调用关系,不便于管理和维护[1]。作为一种分布式云架构的服务调用模式,云服务网关可将不同系统的调用集中到一个可弹性扩展的公共平台中,支持系统间资源调度、数据交互和业务连接,形成统一的资源与业务共享平台,并提供统一的身份认证、操作鉴权、流量管控、超时熔断、监控告警等功能,有助于提高信息系统的稳定性,促进信息系统开发、运行和集成效率的提升[2]。
针对城市轨道交通信息系统综合集成的发展需求,参考国内外各类开源软件系统[3],对云服务网关进行应用研究。
1 云服务网关简介
云服务网关具备云原生属性,可单独组建集群运行,也可运行Kubernetes集群来解决微服务内部IP暴露的问题,适用于微服务和传统架构并存的环境[4]。云服务网关可封装系统内部结构,实现以1个API网关接管所有入口流量的服务,在网关层处理所有的非业务事务[5]。
参考国内外主流开源软件和应用案例,综合考虑用户活跃度、易用性、扩展性,选取开源软件系统Nginx+Openresty+Kong[6]进行分析研究和应用实践。
Nginx是由俄罗斯团队开发的基于C语言的高性能Web负载均衡开源软件,部署简单,适用于高并发业务场景,如12306互联网售票系统等[7]。
OpenResty是中国团队开发的基于Ngnix和Lua的高性能开源Web平台,支持C语言,内部打包和集成Lua库、第三方模块及其依赖项。OpenResty运行在Ngnix上,支持非阻塞I/O和后端分布式数据库、分布式缓存,能够实现一致的高性能响应;除了继承Nginx的高并发等特点,OpenResty还增强了扩展性和动态网关服务能力,在互联网行业也得到广泛应用[8]。
Kong是1个OpenResty应用,用于管理API。目前,Kong的插件众多,具有工具化和模块化的发展特点,其易用性和可视化管理界面有助于降低企业级应用和扩展性开发的难度[9]。Kong支持容器化部署,提供Docker镜像,可运行于容器之中,也可以运行于虚拟机和物理服务器集群环境。在Kubernetes中,Kong以Pod节点形式运行,所有Kong节点共享1个数据库作为注册中心;在容器的微服务架构中,Kong作为集群的统一入口,通过节点端口映射接入外部流量,集群内的服务间通信通过服务命名调用[10]。如图1所示,按推荐的部署方式,将Kong管理功能独立部署为1个Pod,仅提供配置管理功能,其它Kong容器集群节点专门提供流量转发功能。此外,Kong提供Kubernetes Ingress Controller模块,可实现与Kubernetes Ingress的配置转换。
2 云服务网关的结构与功能
2.1 云服务网关的分层结构
Nginx+OpenResty+Kong云服务网关在访问请求到达后端服务之前,通过Lua插件拦截访问请求并进行处理。如图2所示,云服务网关分5个层次来过滤、转发和处理业务访问请求。
转发层:由Nginx服务器接收API请求,根据负载均衡配置,将请求均匀地分发至各个Server,以及时响应大批量的网络访问。
引擎层:网关引擎OpenResty对客户端请求和后端数据层进行一致的高性能响应,实现请求/响应及Lua处理。
集群与数据存储层:集群是指各个节点使用一致性协议自动发现其它节点,每个节点均缓存全局信息,当某个节点的配置变更时,会通过随机传播机制,将变更泛洪给网络上的全部节点;API注册和管理基于数据库,存储集群节点、API、消费者、插件等信息。在高访问量的应用场景下,可部署PostgreSQL、MySQL、Cassandra等分布式集群来支持负载均衡和高可用,同时还支持Redis缓存数据库集群横向扩展[11]。
插件层:使用Lua脚本语言调用Nginx转发;Lua体积小、启动速度快、嵌入性好、接口易扩展,在工控领域常用作Modbus数据转换。Kong社区提供丰富的Lua插件模板,可提供权限认证、熔断、流量控制等扩展服务,使用时可直接导入加载。
API管理层:基于Kong开源框架,实现API从注册到注销的全生命周期管理,Kong社区提供2种可视化管理平台:Konga和Kong-Dashboard,可使用REST命令或控制台注入和发布网关的配置策略。
2.2 云服务网关的主要功能
如图3所示,Nginx+OpenResty+Kong云服务网关的核心功能包括统一接入、权限认证、流量管理、安全防护、监控日志等模块。
云服务网关负责统一接入,将请求的协议转换成内部的接口协议,调用过程中可采用限流、降级、熔断、容错等方式来保护网关运行稳定;网关具备访问控制、黑白名单等基本安全措施,当作为开放网关使用时,还可嵌入身份认证功能;引入Lua插件模板,还可将一些基本的校验判断逻辑前置于应用系统,便于轻量化地处理接入问题。
(1)负载均衡接入
转发层Nginx实例可以集群方式部署,支持基于策略配置的自动扩容,支持高并发连接,通过重定向或权重策略来实现流量负载相对均衡;API的更改可动态生效,无需重新加载或重新启动。
(2)服务路由
服务路由是REST(表述性状态传递)访问路径以及客户端请求的具体匹配规则;每个路由都与1个服务相关联,而每个服务可能有多个与之相关联的路由。每1个与给定路径匹配的请求都将被提交给与之相关联的服务,可在服务路由中定义细粒度的路由与服务组合的入口点,将请求访问引导至不同的目标IP池和端口,实现路径控制和负载均衡。
(3)服务注册
通过集群和数据库层,可将部署服务的主机地址记录在注册中心,服务消费者查询注册中心可获得所访问服务的地址,以发起调用和监听服务状态。
(4)蓝绿发布
蓝绿发布是一种常用新旧程序切换策略,目的是尽可能避免因发布升级程序导致的服务不可用问题。如图4所示,使用upstream(后端转发策略映射)为服务编排蓝绿部署,通过设置蓝绿环境的转发权重来实现DNS倒换,蓝/绿开关激活可动态更新,若需回退升级程序,恢复配置即可生效。
(5)访问控制
在认证机制的基础上,建立为用户分配API授权的ACL(访问控制列表)策略组,服务与权限是一对一关系,每1个服务或API具有唯一的权限,通过设置用户的权限,限制用户只能访问指定的API。
(6)身份认证
采用令牌、签名与API网关结合的方式实现用户身份验证;在用户授权的情况下,通过服务认证,在资源服务器上安全地获得对应的用户资源;插件提供Basic-Auth、Key-auth、OAuth2.0、HMAC-auth、JWT、LDAP-auth等多种认证方式。
(7)IP黑白名单
Kong提供IP黑白名单控制插件,可从2个维度进行配置—针对所有API接口或特定API接口,针对所有消费方或特定消费方;IP可以设置为1个区段,也可设置为特定IP地址。
(8)流量控制
限流可用于防止恶意攻击行为。结合路由,插件基于自定义响应消息头进行速率限制,可设置秒/分钟/小时不同粒度的请求次数;同时,插件提供数据库、Redis缓存和本地缓存3种方式记录请求频率,大规模集群环境下建议使用Redis缓存。
熔断通过插件定义指定请求或拒绝上层服务,直接返回指定的内容进行熔断,多应用于业务系统版本升级的场景,可对正在升级的业务系统的所有服务进行熔断;启用熔断策略,应根据应用系统的业务特点,充分评估和谨慎使用。
(9)监控与日志采集
基于数据采集的开源监控插件,支持多种数据采集方式,具有Zipkin分布式跟踪能力,可用于监控系统中数据接口时间消耗问题,提供数据收集和查询等功能,可与Grafana集成,实现数据可视化展示。
3 应用测试
使用2台虚拟机搭建实验室测试环境,部署网关服务组件,编写运行Spring boot测试用例,模拟负载均衡、流量控制、安全验证、黑白名单、监控日志等功能。
3.1 测试环境
以虚拟机方式部署2台Centos7.8服务器,其中,192.168.9.135作为网关服务器,以Docker方式构建3个镜像,分别运行云服务网关Server、PostgreSQL数据库和Konga管理控制台;另一台192.168.9.136作为Web服务器,用Spring Boot打包运行Web测试用例,运行端口为9080和9081。
在客户端和网关服务器的本地hosts文件中配置“192.168.9.135 test.ykm.com”域名映射,以模拟DNS转发;客户端浏览器发起访问路径,以域名test.ykm.com请求连接到网关服务器,由网关服务器转发至Web服务器的9080和9081端口,通过网关策略进行多项功能测试,如图5所示。
3.2 功能验证测试
(1)负载均衡测试与URL转换测试
在客户端hosts中增加指向服务网关服务器的设置,即“192.168.9.135 test.ykm.com”,浏览器通过IP地址“192.168.9.136”访问Web服务器时,访问请求会被轮流分发到9081或9080端口,如图6所示。
在配置文件中设置URL替换策略,将所有模糊匹配“test.ykm.com”的域名访问默认指向虚拟目录“test.ykm.com/yankaiming/get”。
(2)IP白名单测试
在服务路由中添加设置IP只允许192.168.9.135访问,客户端IP地址设置为192.168.9.10,浏览器提示IP拒绝访问。
(3)流量控制测试
在服务路由中添加设置每分钟5次请求访问,超过5次后客户端浏览器访问服务时会提示访问超限。
(4)权限认证及访问控制测试
在服务路由中添加设置访问控制插件,设置策略组和Basic-Auth用户名/密码验证方式,当通过浏览器访问时,会弹出登录信息对话框,须验证通过后才能访问服务。
(5)日志监控及管理控制台测试
使用Prometheus开源监控插件捕捉访问请求的返回值次数、处理延迟时间等日志数据;Konga控制台页面可显示基本信息。
(6)插件库功能分析
Kong基于Lua的开源插件库提供权限认证、安全管理、流量控制、分析监控、日志系统和URL转换等30多个模板,涵盖API全生命周期,可通过图形化用户界面来操作和管理,如图7所示。
测试过程中主要对身份认证(Basic auth)、访问控制(ACL)、IP限制(IP restriction)、速率限制(rate limiting)、访问请求转换(request transformer)、日志监控(Prometheus)6个插件展开功能测试和分析。
3.3 测试结果
在实验室环境部署和运行Nginx+OpenResty+Kong开源软件系统,测试表明:该系统的配置与更新简单快捷,权限、监控、日志等功能均利用Lua脚本实现,通过加载和卸载工具菜单即可处理,无需修改配置文件和代码,且无需重新启动系统即可使配置生效。同时,该开源软件系统具有少代码、工具化、开箱即用等特点,方便系统维护管理人员使用。
4 结束语
目前,城市轨道交通企业采用私有云架构已成为趋势。通过构建云服务网关平台,可以适配和集成服务、数据和应用能力,有助于打通内部业务流和数据流,促进企业数字化运营水平提升,助力企业业务创新。
API网关技术体系中有许多优秀的开源和商用软件。在满足城市轨道交通应用需求方面,本文研究的开源软件框架还存在一些欠缺之处;如协议转换只支持HTTP/SOAP/gRPC,城市轨道交通中工控设备较多,目前尚无支持MQTT(消息队列遥测传输协议)、Modbus等协议转换的开源组件;另外,动态路由需要通过Lua+Redis自定义开发实现;尚不能与MQ集成,无法使用订阅发布机制。下一步需结合具体业务场景,在应用实践中进一步研究和解决这些问题。
-
[1] 刘 微,张 铭,刘阳学. 基于云平台的城市轨道交通数据中心应用 [J]. 铁路计算机应用,2016,25(9):72-74. DOI: 10.3969/j.issn.1005-8451.2016.09.018 [2] 钟 华. 企业IT架构转型之道 阿里巴巴中台战略思想与架构实战[M]. 北京: 机械工业出版社, 2017. [3] 中国信息通信研究院. 云原生技术实践白皮书[R]. 北京: 中国信息通信研究院, 2019. [4] Verba, Nandor, Chao, Kuo-Ming. platform as a service gateway for the Fog of Things [J]. Advanced engineering informatics, 2017, 33: 243-257. DOI: 10.1016/j.aei.2016.11.003
[5] 薛 浩. 大型企业微服务架构实践与运营[M]. 北京: 人民邮电出版社, 2019. [6] 京东集团618作战指挥中心. 决战618探秘京东技术取胜之道全[M]. 北京: 电子工业出版社, 2017. [7] 四川长虹电器股份有限公司. 一种基于openresty的日志记录方法: CN201811443778.4[P]. 2019-03-12. [8] Lampesberger, Harald. Technologies for Web and cloud service interaction: a survey [J]. Service-oriented computing and applications., 2016, 10(2): 71-110. DOI: 10.1007/s11761-015-0174-1
[9] 翁湦元,单杏花,阎志远,等. 基于Kubernetes的容器云平台设计与实践 [J]. 铁路计算机应用,2019,28(12):49-53. [10] 熊军军,彭晓刚,郑晓勇,等. 基于“Nginx+Lua”组件的应用系统灰度发布 [J]. 金融电子化,2020(5):92-94. [11] 唐宏伟. 面向重点应用开展云计算关键技术研究与创新—中国科学院计算技术研究所计算机应用研究中心云计算团队成果介绍 [J]. 科技成果管理与研究,2020(5):60-62. DOI: 10.3772/j.issn.1673-6516.2020.05.022