微服务架构的自然资源外业核查系统设计与实现

2021-05-27 05:14陈德权
地理空间信息 2021年5期
关键词:外业核查网关

陈德权

(1.福建省基础地理信息中心,福建 福州 350002)

随着自然资源管理业务的不断拓展和深入,自然资源外业现场核查已成为业务管理的核心工作之一。近年来,福建省自然资源厅开展的土地利用变更调查、土地整治项目管理[1-2]、移动执法监察[3-4]等自然资源管理业务均在各自业务系统的支持下,以手持GNSS移动设备为外业核查的技术手段,对相关业务进行监管。未来还将在地质灾害点核查、违法用地督察、矿山生态治理等更多的全省自然资源管理业务上进行深入应用。为避免相同业务功能的重复建设,需在现有业务系统的基础上构建统一的自然资源外业核查系统,为各类自然资源管理业务提供统一的外业核查数据来源,因此需要充分考虑跨平台服务接口的兼容性、服务拓展与可扩充性以及全省多业务应用带来的高并发问题。微服务架构[5-7]则可用来解决上述问题。本文设计了基于分布式微服务架构的自然资源外业核查系统,提升了系统的可靠性和稳定性。系统采用领域驱动设计方法将自然资源核查业务划分为细粒度的微服务[6],以实现服务之间的高度解耦;核查终端还可根据实际业务需要,调用微服务进行功能组合,有效应对业务拓展的需要。

1 系统总体架构

系统由支撑层、数据层、微服务层、服务网关和应用层组成,各部分按照一定的标准和协议紧密结合在一起,为自然资源核查业务提供信息化支撑,如图1所示。支撑层依托数字福建云计算平台提供的虚拟化计算资源,形成数据存储集群、应用服务集群以及相关的安全设施服务。数据层根据数据类型分类存储,其中核查业务数据库存储相关的业务数据;空间数据库存储与空间位置相关的数据,如图斑数据、地名点数据、轨迹点数据等;图片数据库存储外业核查的照片;业务系统交换数据存储从第三方自然资源业务系统中生成的核查任务数据;Redis缓存数据库存储缓存数据,可提高微服务获取数据的效率。微服务层由数据仓储接口、微服务和服务注册中心构成,其中数据仓储接口向下与数据层中的各类数据完成数据读写操作,向上为微服务提供统一的数据操作接口;微服务利用领域驱动设计方法将外业核查业务划分为细粒度的服务,并部署在多台服务器的Nginx下,以实现服务的集群[7];服务注册中心负责微服务的注册、发现与管理,通过心跳包监测微服务的运行状态。服务网关将服务注册中心的微服务对外映射,并利用负载均衡调度算法实现前后端路由控制和转发。应用层由核查终端和管理端共同实现对自然资源核查业务的管理,并通过服务接口为其他业务系统提供核查数据来源。

图1 系统总体架构

2 系统设计

2.1 数据层设计

自然资源外业核查系统的主要数据为核查业务数据、与业务紧密结合的空间数据以及外业核查采集的图片数据。为了提高系统查询效率,本文以Redis数据库为系统的缓存数据库,存储系统中被频繁调用的业务数据和统计分析数据。此外,系统需通过服务层的数据接口实现与自然资源管理信息化系统核查业务的数据对接,存储相关数据到业务系统交换数据库中,通过标准化的数据清洗规则,实现各类业务数据向标准核查业务数据的转换。

2.2 领域驱动设计

基于微服务架构的系统需要把业务拆分为多个服务,合理的微服务划分能使系统具备良好的灵活性和扩展性,在演进过程中仍然保持敏捷。领域驱动设计是一种围绕具体业务进行领域建模与分析的方法。首先通过调研收集自然资源外业核查的业务需求,分析得到业务领域事件;再寻找完成该事件所涉及的角色和命令;然后围绕领域事件确定系统的聚合和限界上下文;最后确定系统的领域模型,领域上下文之间的低耦合,便于未来的业务扩展。

在自然资源外业核查业务中,下发核查任务和上报核查任务就是典型的领域事件。任务管理员通过下发指令将任务下发到外业核查员;外业核查员通过上报指令将经过采集的任务信息发送给任务管理员,由此可确定系统的一个聚合是“任务”,由这个聚合来发布领域事件,包括创建、修改、删除、下发、上报等。限界上下文可根据系统的聚合来确定,并建立上下文的映射关系,如任务上下文与图片上下文、地图图斑上下文产生上下游协作关系,限界上下文之间通过系统事件来协作。通过对业务的不断迭代分析,即可形成系统的领域模型。

2.3 微服务设计

通过领域驱动设计,明确了系统微服务的边界,每个服务可独立开发、测试、部署与维护,各服务之间高度解耦。微服务的设计充分考虑了移动终端和第三方应用系统跨平台调用的需要,采用基于REST风格的服务接口,消息通信协议支持JSON和Protobuf两种轻量级格式,服务请求者可根据自己的需要灵活设置。一般来说,移动终端的应用适合采用比JSON更轻便更高效的Protobuf数据格式[8]。

为了更好地满足业务扩展需要,系统采用业务逻辑与数据操作解耦的方式来实现微服务。在服务接口内部不直接与数据层交互,而是通过开发统一的数据仓储接口来完成相关数据的读写操作。数据仓储接口可根据业务需要不断扩展丰富,服务内部只需根据领域事件发送相关命令,调取对应仓储接口中的信息即可完成业务操作。

2.4 服务注册中心设计

微服务的架构决定了整个系统的业务功能是由大量的服务接口支撑的,若采用手动管理和维护服务目录的方式则无法保证系统的稳定运行,因此需要引入服务注册中心。面向服务发布者提供服务注册接口,微服务运行时通过注册接口向服务注册中心登记该服务,并将服务健康检查的入口写入注册中心,在注册中心运行过程中自动将心跳包发送至健康检查的入口,以检测服务的运行状态。

系统采用Consul开源的服务注册中心,提供了服务注册与发现、服务配置、服务监测等一体化的解决方案,并有配套的开源二次开发工具包,可方便地实现服务的注册与监听。Consul采用去中心化的部署方式,可在多台服务器上安装部署,形成服务注册中心的集群。单个服务注册中心的故障不会影响整个系统的运行。自然资源外业核查系统的微服务在服务注册中心的注册情况如图2所示。

图2 服务注册中心

2.5 网关设计

一个完整的业务被拆分为多个微服务集,每个微服务均会配置相应的接口说明,而这些服务直接对外向应用层提供接口则显得杂乱无章,且无法实现服务的访问控制,服务的鉴权也无法集中统一控制,每个服务都要单独进行身份验证,因此需要设计一个服务网关,自动从服务注册中心中获取所有注册的微服务,集成在线接口说明文档,实现服务的负载均衡和路由控制,并在此基础上构建微服务鉴权,实现服务的统一身份认证。

系统采用Ocelot开源的API网关,支持从Consul服务注册中心自动获取已注册的服务。网关设计如图3所示。在服务网关内部采用IdentityServer实现服务的身份验证,通过验证后,网关根据所发起的HTTP请求去Consul服务注册中心匹配相应的微服务的完整地址;再通过Ocelot组件提供的动态路由机制转发到下游的微服务中,并得到相应的数据。在进行路由转发时,网关会根据配置的负载均衡策略选择从负载相对较低的服务器上请求微服务。当请求的微服务出现异常时,Ocelot会根据配置的QoS信息做相应的处理;若异常次数超出设置,则自动熔断该服务,直接在网关生成异常信息并返回请求终端,避免反复调用服务出错而占用系统资源和网络资源。

图3 服务网关架构

3 关键技术

3.1 微服务的负载均衡

在高并发的微服务架构中,通过服务的负载均衡技术可实现系统的高可用性和服务集群。本文通过Ocelot网关提供的负载均衡组件来实现微服务的软负载。Ocelot框架内置RoundRobin(轮询)、LeastConnection(最少连接数)等多种负载均衡策略。当网关收到服务请求时,将先调用内部的负载均衡组件,负载均衡组件根据负载均衡算法从可用的微服务列表中选择一个负载相对较低的服务进行转发,从而降低系统的压力。系统利用Consul配合Ocelot能较好地满足微服务的负载均衡需求。

3.2 分布式多级缓存

微服务采用分布式集群部署,在微服务调度策略的支撑下能有效降低系统的响应时间。由于每个微服务接口均需与数据库进行交互,因此数据库的I/O操作也是影响系统性能的主要因素之一,在高并发情况下将引起数据库的I/O堵塞,增加客户端请求时间,严重时可能直接导致数据库宕机。为了有效降低数据库的读写操作,系统采用分布式多级缓存技术,将频繁使用的业务数据建立动态缓存,下次访问时即可直接从缓存中获取数据,减少数据库的I/O操作,从而提高系统的性能。

本文采用Redis分布式缓存和内存缓存相结合的多级缓存技术来提高数据访问速度,以分布式缓存为缓存数据的蓝本,在此基础上建立服务器的内存缓存,服务接口直接从内存中读取使用频率高的数据。分布式多级缓存的技术架构如图4所示。由于内存缓存设置在各服务器内部,使用缓存时可能出现数据不一致的情况,如一个微服务接口在服务器A中更新了一个缓存数据,但在服务器B的内存缓存中仍为旧的缓存数据。因此,在分布式缓存和服务器内存缓存之间需建立缓存控制总线,用于同步分布式缓存与各服务器内存缓存的数据,时刻保持系统缓存数据的一致性。

图4 分布式多级缓存架构

微服务启动时会向缓存控制总线发送订阅命令,总线就会自动记录该服务器的信息。当服务器中的内存缓存更新时,首先向Redis分布式缓存写入数据,再向缓存控制总线发布缓存更新消息,总线通知其他服务器需要更新缓存数据,服务器收到通知后从分布式缓存中获取相应的数据并更新到本地的内存缓存中,这样就保证了所有服务器缓存数据的一致性。

3.3 微服务鉴权

微服务部署在服务网关的下游,专注于实现自然资源外业核查相关业务,若每个微服务在调用时均需进行身份认证,将会带来资源的浪费,且服务内部都要完成同一套认证逻辑也不利于后期的系统维护,因此需在微服务的上游网关层实现服务鉴权,而各微服务实例只需专注各自的业务逻辑即可。

Ocelot为IdentityServer提供了很好的支持,在网关内部统一实现基于IdentityServer的服务认证鉴权,采用JWT[9]的无状态验证机制实现客户端和服务端的身份认证与权限控制。用户首次登录系统时,网关的服务鉴权模块将根据用户名和密码进行身份验证,形成Token密钥返回给服务请求方。在后续服务请求的Head中加入Token信息,网关的鉴权模块首先验证该Token的有效性,验证通过后再判断该用户是否具备所请求的微服务的权限,通过后才将请求的信息转发到下游对应的微服务接口中,处理完成后将结果返回给服务请求方。

系统利用分布式多级缓存技术提高微服务鉴权的效率,将用户登录信息进行多级缓存,同时设置过期时间,到期后自动删除对应的缓存。在服务鉴权模块进行身份验证时,首先从缓存中查询该用户是否存在登录信息,若存在则直接从缓存中获取Token返回给服务请求方;若不存在则通过数据库验证用户信息,通过后再生成Token返回给服务请求方,同时将登录信息通过缓存总线缓存到Redis以及各集群服务器中以备下次验证使用。

4 系统性能测试

为了检验基于微服务架构的自然资源外业核查系统是否能满足全省自然资源管理的业务需要,本文采用开源的wrk性能测试工具对系统进行并发测试。wrk专门用于测试基于HTTP协议的服务端性能,可充分利用单机多核CPU性能,通过线程和事件的模式对服务端产生大量的负载。本次测试通过编写lua脚本模拟客户端发起的请求数据,利用wrk调用脚本,并开启8线程分别模拟100 个、200 个和500个并发,每次持续测试30 s,测试结果如图5所示。

由压力测试结果可知,在同一个网络环境下,系统的平均响应时间并没有随着并发数的增加而出现较大幅度的增长,平均响应时间约增长20 ms,总体响应时间约为120 ms,系统一直保持较平稳的状态,说明基于微服务架构的自然资源外业核查系统可解决全省大规模使用时带来的性能问题。

5 结 语

本文基于微服务架构设计并实现了面向全省应用的自然资源外业核查系统,可为全省自然资源各业务系统提供统一的外业核查数据来源,解决了传统单体应用开发模式带来的负载不均衡和不易扩展等问题。微服务采用分布式集群部署方式,在服务网关和服务注册中心的支持下实现了服务的负载均衡和性能优化,能满足一定的高并发和高可用的性能要求。

图5 压力测试结果

猜你喜欢
外业核查网关
对某企业重大危险源核查引发的思考
关于设计保证系统适航独立核查的思考
基于无人机影像的营造林核查应用研究
基于移动 GIS 的公路工程外业调查系统研究
基于市政管线外业采集命名规则和辅助软件开发
天津市第一次全国地理国情普查外业调绘核查
公路外业测量中GPS RTK测量技术的应用探究
LTE Small Cell网关及虚拟网关技术研究
应对气候变化需要打通“网关”
逾六千家政府网站关停整改核查再升级