基于SaaS模式的产业经济信息系统的设计与实现
2021-03-14陈家豪刘宇杰宋晖
陈家豪,刘宇杰,宋晖
(东华大学计算机科学与技术学院,上海 201620)
0 引言
随着社会的发展,政府机构产业经济的管理部门需要对所属区域内的企业进行管理并提供相应的服务。但是面对辖区内的所有企业,政府难以及时了解产业细分领域的整体情况以及把握企业发展运行的动态情况和经济运行情况。并且随着经济的快速发展,也暴露了政府在产业政策扶持以及企业帮扶等方面的问题。文献[1]也指出政府在融资、税收等方面存在资源调配先国企后民企的现象,这样就使得民企获得的支持越发显得薄弱。
随着时代的发展与信息技术的进步,云计算技术取得了突飞猛进的发展,SaaS(software as a service:软件即服务)作为云计算中最为成熟、出名的模式,已得到了广泛的应用。与此同时,SaaS 模式的发展使得传统的单体架构开发模式已经逐渐无法满足当前互联网时代的软件开发需求,于是微服务架构应运而生。在传统单体架构开发方式下,应用的开发很简单,测试也相对简单直观,但是单体架构存在很大的局限性,随着时间的推移,开发、测试、部署和扩展都会变得更加困难。而微服务架构在开发过程中不仅拥有更好的容错性,其最大的好处就是可以实现大型复杂应用程序的持续交付和部署[2]。
本文针对政府管理部门为企业提供服务过程中存在的问题,基于SaaS 软件服务模式以及微服务架构设计并实现了产业经济信息的管理,助力政府借此平台增强产业结构调整的准确性,促进产业结构的转型升级[3]。该系统依靠SaaS 的多重租赁的特性[4],完成平台由单一用户到多租户的转变,并且结合微服务架构服务独立扩展、独立部署的优点,灵活的对功能服务进行扩展。
1 关键技术实现
1.1 微服务架构
微服务架构是一种面向服务的架构,可将应用程序构建为松耦合、可独立部署的一组服务,每个服务都是独立的进程,可以由不同团队开发维护,实现团队的自治。通过对当下主流的微服务架构进行对比分析,本文选用Spring Cloud[5]作为系统的微服务架构。Spring Cloud 是若干框架的集合,通过提供一系列开发组件帮助开发者迅速搭建一个分布式的微服务系统,其常用组件包括服务注册和发现、配置中心、路由网关、控制总线、熔断器等。
1.2 多租户技术
为实现系统在只有一个应用实例的情况下能被多区域政府共同使用,本文采用多租户技术对其进行改进。多租户[6]是SaaS 领域的特有产物,是SaaS 服务模式与传统软件模式的重要差别。多租户技术是用于实现在同一环境下多租户可以共用相同的系统或者程序组件,并仍然可以保证租户之间的数据隔离性。多租户数据隔离的方式有以下三种:第一是独立数据库,第二是共享数据库但隔离数据结构,第三是共享数据库和数据结构。本系统中采用的是第一种方式,在创建租户时为其创建专属的数据库并完成数据库的初始化,虽然该方式成本最高,但是数据的隔离级别和安全性也是最高的。采用多租户技术,可以将系统角色分为三种:平台管理员、租户系统管理员以及租户普通管理员。多租户业务流程如图1所示。平台管理员可通过初始化租户组和权限信息完成租户的创建,启用租户后由该租户的租户系统管理员对租用的系统进行管理,租户系统管理员也可以创建普通管理员用户。
图1 多租户业务流程
1.3 动态切换数据库
本文通过动态切换数据库的方式来实现SaaS服务模式并保证多租户之间数据的隔离性,让每个用户在使用本系统的时候,只能访问其所属租户的数据库。动态切换数据库,其本质是通过切换数据源来实现连接不同数据库,最常用的做法是在配置文件中配置多个数据源,在固定数目的数据源之间进行切换连接,但本文所使用的方式可以实现在数目不限的数据源之间进行切换,切换过程如图2所示。具体实现可分为以下3步。
图2 动态切换数据库流程
(1)修改配置文件。在配置文件application.yml中配置数据源时,将JDBC URL 中数据库的IP和名称等信息使用“%s”占位符代替,用于在连接数据库时进行动态填充。租户所对应的数据源信息在创建租户时就已保存于Redis缓存中。
(2)拦截请求。使用Spring 的AOP 特性来拦截用户请求,通过获取用户请求的域名来判断对应的租户,并且对应的租户编码保存至ThreadLo⁃cal线程变量中。
(3)创建并管理数据源。在项目中创建Data⁃SourceConfig 配置类,通过使用由DataSource 派生的子类DynamicDataSource 实现根据配置参数创建数据源,并完成数据库的动态连接。同时增加数据库标识类,从ThreadLocal 变量中获取租户编码,根据此租户编码到Redis 数据库中获取对应的数据源信息。对于配置文件中使用占位符替换掉的数据,则使用该数据源信息进行一一填充,形成完整的数据源,进而连接数据库。同时还可将已建立连接的数据源保存在Map 容器中,提供数据源的查询和删除功能。并且设置定时任务管理数据源,将当前时间与最近使用时间进行比较,若在一个空闲时间周期内没有访问,则将对应的数据库连接关闭,并将数据源从Map容器中删除。
2 服务拆分
将传统的单体应用转变为微服务应用,最重要的就是进行服务的拆分。进行服务拆分有两种方法:第一种是使用领域驱动设计的方法,根据子域进行服务拆分,第二种是根据业务能力进行服务拆分。本文采用第二种方法,根据业务能力来定义服务,同时根据服务属性将其分为辅助型服务和业务型服务,其中辅助型服务是指基于Spring Cloud框架所提供的用于构建分布式微服务系统的常用组件所实现的服务,业务型服务则是指根据系统功能所划分的服务。具体服务划分如下。
辅助型服务主要包含以下4 个服务:①配置管理服务,主要负责对分布式系统的各模块的配置文件进行统一管理。②监控服务,主要负责监控所有服务的健康状况,并可对服务中的请求进行链路追踪。③网关服务,主要负责接收外界所有请求,并将其转发至对应的微服务。④服务注册与发现服务,主要负责提供服务的注册与续约功能。
业务型服务包含以下7 个服务:①产业数据汇集服务,负责将政府提供的产业数据与外部采集的企业数据汇聚于一起,通过智能统计、数据分析等方式为政府制定管理措施、开展企业服务提供数据支撑。②企业管理服务,主要负责提供如企业建议、企业活动、企业支持等政府为企业服务提供的功能。③消息发布服务,主要负责为提供政府发布新闻、政策、知识库等功能,方便企业了解政府的政策法规。④授权与认证服务,负责获取当前登录用户信息并进行用户身份验证,同时还对系统资源进行权限管理。⑤组织管理服务,包括租户管理与用户管理,主要负责租户的创建与权限初始化,以及对各租户下使用该平台的用户进行管理。⑥系统管理服务,主要负责对系统用户组、角色、部门以及权限等信息进行管理。⑦日志服务,负责通过RabbitMQ 接收其他服务所发送的日志信息并对其进行处理。
3 系统架构设计
本系统基于前后端分离开发模式,前端使用Vue 与Element UI 进行开发,后台则采用Spring Boot 作为单个服务的开发框架,使用Spring Cloud架构进行服务治理。系统采用Eureka 作为服务注册与发现中心,给客户端提供一个可用的服务注册列表,负责完成服务的注册、续约功能;使用Ribbon 和Feign 实现服务的调用以及负载均衡的功能;使用Spring Cloud Zuul 作为系统的服务网关;使用Spring Cloud Config 进行分布式配置文件的统一管理。除此之外,还使用Spring Security OAuth2保护微服务系统,并同时使用JWT的方式进行身份认证。系统总体架构设计如图3 所示,自上而下依次分为访问层、网关层、服务层以及数据层。①访问层作为系统的使用入口,负责用户对系统的操作和系统前端界面显示。②网关层选用Spring Cloud Zuul 组件,负责所有服务的API接口统一聚合,并统一对外暴露。来自客户端的所有外部请求在进入系统时,都要通过网关层进行处理,由网关将其转发至对应的服务。③服务层作为系统的核心业务层,负责完成系统的核心功能,各个服务之间通过使用基于同步请求/响应的HTTP REST 机制进行通信,并使用Eureka服务认证与注册中心对所有服务进行统一管理。④数据层负责对底层数据进行访问以及持久化操作,所使用的数据库包括MySQL、Redis 以及Mon⁃goDB。数据层同时还负责对数据源进行动态管理,通过动态切换数据源的方式使得租户只能使用自己的数据源连接自己的数据库,保证数据之间的隔离性。
图3 系统架构
4 系统部署
为使系统后期具有较高的维护和扩展能力,本系统选择使用容器技术在服务端进行项目部署。容器是一种更现代、更轻量级的部署机制,与虚拟机技术相比所消耗的资源更少。本文选用容器中最有代表性的Docker[7]进行项目部署。使用Docker 技术,不仅可以实现系统的快速交付与部署,而且其兼容性与轻量级特性可以轻而易举的实现应用的动态管理。
4.1 准备环境
为完成系统上线,采用四台操作系统为Cen⁃tOS 的Linux 服务器进行项目部署,并在服务器中安装好Docker。每台服务器所肩负的职责各不相同,具体分工如表1所示。
表1 服务器职责分工
4.2 部署上线
Spring Cloud 应用是采用Spring Boot作为单个服务的开发框架,而由于Spring Boot 内置了Tom⁃cat服务器,因此系统的各个服务模块都可以将其以jar 包的方式独立运行。系统部署如图4 所示。将每个服务打包成镜像容器,再按照服务器职责分工将服务部署到对应的服务器上。
图4 系统部署
将服务部署为容器的操作如下:对于系统的每个服务模块,在本地机器上使用Maven 将其打成jar 包,然后将jar 包上传到服务器上,通过编写包含构建镜像所需指令的Dockerfile文件,使用docker build 命令将其构建为镜像并保存在镜像仓库中,最终根据镜像文件生成容器并运行服务实例。
5 结语
为实现政府对其区域内的产业经济发展提供更好的保障,本文设计实现了产业经济数据管理系统,助力政府更好的为企业提供服务。根据业务能力对系统进行服务划分,拆分出多个可执行微服务,并通过使用Spring Cloud作为系统的微服务框架,构建了具有较高扩展性的软件系统。同时基于SaaS 服务模型完成系统的多租户功能,实现对多地政府提供系统租用服务。在以后还可以推出企业画像、资质校验等服务,进一步帮助政府了解企业,并利用微服务架构以及Docker 的特性实现服务的快速上线。