闫锴明,白 丽,林德辉,肖华平,宗慧曦
(1. 中国铁道科学研究院集团有限公司 电子计算技术研究所,北京 100081;2. 广州地铁集团有限公司,广州 510380)
城市轨道交通信息化横跨多个专业,线网环境下众多信息系统之间相互依赖,逐渐形成网状调用关系,不便于管理和维护[1]。作为一种分布式云架构的服务调用模式,云服务网关可将不同系统的调用集中到一个可弹性扩展的公共平台中,支持系统间资源调度、数据交互和业务连接,形成统一的资源与业务共享平台,并提供统一的身份认证、操作鉴权、流量管控、超时熔断、监控告警等功能,有助于提高信息系统的稳定性,促进信息系统开发、运行和集成效率的提升[2]。
针对城市轨道交通信息系统综合集成的发展需求,参考国内外各类开源软件系统[3],对云服务网关进行应用研究。
云服务网关具备云原生属性,可单独组建集群运行,也可运行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 的配置转换。
图1 Nginx+OpenResty+Kong 云服务网关容器部署
Nginx+OpenResty+Kong 云服务网关在访问请求到达后端服务之前,通过Lua 插件拦截访问请求并进行处理。如图2 所示,云服务网关分5 个层次来过滤、转发和处理业务访问请求。
图2 云服务网关的分层结构
转发层:由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 命令或控制台注入和发布网关的配置策略。
如图3 所示,Nginx+OpenResty+Kong 云服务网关的核心功能包括统一接入、权限认证、流量管理、安全防护、监控日志等模块。
云服务网关负责统一接入,将请求的协议转换成内部的接口协议,调用过程中可采用限流、降级、熔断、容错等方式来保护网关运行稳定;网关具备访问控制、黑白名单等基本安全措施,当作为开放网关使用时,还可嵌入身份认证功能;引入Lua 插件模板,还可将一些基本的校验判断逻辑前置于应用系统,便于轻量化地处理接入问题。
(1)负载均衡接入
转发层Nginx 实例可以集群方式部署,支持基于策略配置的自动扩容,支持高并发连接,通过重定向或权重策略来实现流量负载相对均衡;API 的更改可动态生效,无需重新加载或重新启动。
(2)服务路由
服务路由是REST(表述性状态传递)访问路径以及客户端请求的具体匹配规则;每个路由都与1个服务相关联,而每个服务可能有多个与之相关联的路由。每1 个与给定路径匹配的请求都将被提交给与之相关联的服务,可在服务路由中定义细粒度的路由与服务组合的入口点,将请求访问引导至不同的目标IP 池和端口,实现路径控制和负载均衡。
(3)服务注册
通过集群和数据库层,可将部署服务的主机地址记录在注册中心,服务消费者查询注册中心可获得所访问服务的地址,以发起调用和监听服务状态。
(4)蓝绿发布
蓝绿发布是一种常用新旧程序切换策略,目的是尽可能避免因发布升级程序导致的服务不可用问题。如图4 所示,使用upstream(后端转发策略映射)为服务编排蓝绿部署,通过设置蓝绿环境的转发权重来实现DNS 倒换,蓝/绿开关激活可动态更新,若需回退升级程序,恢复配置即可生效。
(5)访问控制
图3 Nginx+OpenResty+Kong 云服务网关功能框架
图4 蓝绿发布示意
在认证机制的基础上,建立为用户分配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 集成,实现数据可视化展示。
使用2 台虚拟机搭建实验室测试环境,部署网关服务组件,编写运行Spring boot 测试用例,模拟负载均衡、流量控制、安全验证、黑白名单、监控日志等功能。
以虚拟机方式部署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 所示。
图5 测试环境部署
(1)负载均衡测试与URL 转换测试
在客户端hosts 中增加指向服务网关服务器的设置,即“192.168.9.135 test.ykm.com”,浏览器通过IP 地址“192.168.9.136”访问Web 服务器时,访问请求会被轮流分发到9081 或9080 端口,如图6 所示。
图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 所示。
图7 Lua 开源插件库的图形化用户界面
测试过程中主要对身份认证(Basic auth)、访问控 制(ACL)、IP 限 制(IP restriction)、速 率 限 制(rate limiting)、访问请求转换(request transformer)、日志监控(Prometheus)6 个插件展开功能测试和分析。
在实验室环境部署和运行Nginx+OpenResty+Kong 开源软件系统,测试表明:该系统的配置与更新简单快捷,权限、监控、日志等功能均利用Lua脚本实现,通过加载和卸载工具菜单即可处理,无需修改配置文件和代码,且无需重新启动系统即可使配置生效。同时,该开源软件系统具有少代码、工具化、开箱即用等特点,方便系统维护管理人员使用。
目前,城市轨道交通企业采用私有云架构已成为趋势。通过构建云服务网关平台,可以适配和集成服务、数据和应用能力,有助于打通内部业务流和数据流,促进企业数字化运营水平提升,助力企业业务创新。
API 网关技术体系中有许多优秀的开源和商用软件。在满足城市轨道交通应用需求方面,本文研究的开源软件框架还存在一些欠缺之处;如协议转换只支持HTTP/SOAP/gRPC,城市轨道交通中工控设备较多,目前尚无支持MQTT(消息队列遥测传输协议)、Modbus 等协议转换的开源组件;另外,动态路由需要通过Lua+Redis 自定义开发实现;尚不能与MQ 集成,无法使用订阅发布机制。下一步需结合具体业务场景,在应用实践中进一步研究和解决这些问题。