标题 | 基于微服务的多租户城镇人口住宅管理系统的设计与实现 |
范文 | 陈榆中 马镇 宋晖 摘? 要: 随着应用复杂度和租户数量的不断增加,对应用功能的横向扩展及解耦合等需求提出了更高的挑战。本文基于领域驱动设计原则构建了服务分割模型以辅助分布式应用的设计,结合微服务架构利用Spring Cloud实现了城镇人口住宅管理的SaaS系统。本文还采用容器编排技术实现了服务的多实例化和动态扩缩容,为系统提供了服务实例的智能维护功能。 关键词: 微服务;SaaS;服务分割模型;多租户;城镇人口住宅 【Abstract】: As the complexity of applications and the number of tenants increase, the requirements for horizontal expansion and decoupling of application functions pose higher challenges. Based on the domain-driven design principle, this paper constructs a service segmentation model to assist the design of distributed applications. Combined with the micro-service architecture, Spring Cloud is used to implement the SaaS system for urban population housing management. This paper adopts container orchestration technology to realize multi-instantiation and dynamic expansion and contraction of services, and provides intelligent maintenance functions for service instances. 【Key words】: Micro-service; SaaS; Service segmentation model; Multi-tenant; Urban population housing 0? 引言 随着云计算平台的日益普及,从政府到私人企业都感受到了它所带来的便利和实惠。云计算平台支持高性能、高可靠、高可用和可伸缩的SaaS(软件即服务)应用,而微服务架构作为软件开发架构的演进方向之一,已成为一种SaaS应用在云平台的可行落地方案。 传统的MVC架构在后续的功能更改、系统发布和版本维护上成本昂贵,微服务架构与其它軟件架构相比,拥有更好的功能扩展能力和系统稳定性。SOA架构关注的是业务流程与企业目标的实现,而微服务架构关注的是企业级应用如何在云平台上持续集成与部署。 从前的城镇人口住宅管理系统是面向单独城镇开发的MVC系统,现在需要为多个城镇提供独立的服务,因此需要将为单一用户设计的系统转变为一个SaaS(软件即服务)应用,以便充分利用云平台的资源来进行租户和功能扩展。为了解耦合应用功能,本文提出了服务分割模型来辅助设计应用,结合微服务架构和容器技术来实现系统的开发和发布。 本文后续章节组织如下,第2章节详细介绍了本文所提出的服务分割模型;第3章节描述了该模型在城镇人口住宅管理系统的应用;第4章节给出了微服务架构下的服务实例的智能维护在系统中的实现方式;第5章节展示了微服务实现结果;第6章节对工作进行了总结。 1? 相关工作 文献[1]中表示将传统架构的应用程序部署到云中时,随着时间的推移通常很难保持良好的模块化结构,因此导致了微服务架构风格在云平台的应用。微服务架构允许以不同的语言编写不同的服务,在相应的云平台环境中发布部署。 微服务架构是由Martin Fowler在前几年给出的定义[1],它的主要特征是服务组件化、通信轻量级、功能解耦合和去中心化等。微服务架构的核心思想是单个应用作为一组小的服务,它的接口是一组服务,服务之间以轻量级的协议进行通信;拆分出来的部件或者服务可以采用不同的技术栈,使用不同的数据存储技术;最后这些服务不能直接通信(即不存在依赖),需要通过一个服务注册中心通讯,应用与服务注册中心是解耦合的。 文献[2]分析和对比了微服务架构与其他软件架构之间的异同。微服务架构因其高可用性、高扩展性和易于维护的特点,在保持了SaaS(软件即服务)应用功能完整性的同时,又解决了传统软件架构的复杂性,因此逐渐成为热门的软件架构风格之一。 微服务架构的特点满足了开发分布式、易维护、易扩展的SaaS(软件即服务)应用的条件。文献[3]将微服务应用于数据服务框架中;文献[4]重点讨论了在校车安全管理中微服务的应用;文献[5]将分布式测距系统以微服务的形式展现;文献[6]将安全服务也以微服务的形式提供;文献[7]介绍了农业信息化管理平台的SaaS方案设计。 2? 服务分割模型 为了将传统软件应用转变成分布式应用或者直接设计一个具有较高扩展性的系统,其思路不是设计一个巨大的单体式应用,而是将应用分割为小的、互相调用的组件,然后单个组件完成某个特定的功能需求,最后由服务管理与注册中心来发现和调度它们。本文根据微服务在系统中所担当的功能角色进行了四类分类: (1)复用性微服务指可以被多个不相关应用所调用的微服务,其提供了API接口供其他微服务使用。例:大数据计算微服务。 (2)辅助性微服务指提供了非业务逻辑功能的微服务。例:网关微服务、前端显示微服务等。 (3)业务逻辑微服务指提供了业务逻辑的微服务,面向业务进行编码。 (4)管理监控微服务指对整个SaaS系统实现租户管理、权限分配、应用分配和监控等功能的微服务。 基于领域驱动设计原则[8]分析传统应用软件的各项功能,把应用分割为复用性微服务、辅助性微服务和业务逻辑微服务(如图1所示),然后将其构建为分布式应用。 从上图1中看出,复用性微服务可以被多个不相关应用所使用,如图1中的传统软件应用B、C,从而提高了代码维护性和复用性;辅助性微服务可以是前端展示微服务,从而解耦合了前后端;业务逻辑微服务根据业务的使用频率、业务的相关性和业务的性质进行划分,从而易于系统的开发和维护;管理监控微服务对整个系统进行租户管理、应用分配等操作。通过服务分割模型可以设计出一个具有较高扩展性的分布式应用。 3? 城镇人口住宅管理服务架构设计 基于微服务架构和服务分割模型,對城镇人口住宅管理系统的功能进行服务架构设计,如图2所示。根据系统的功能需求,四类微服务分别包括以下模块。 复用性微服务包含了Spark服务和GIS服务。它们分别提供了大数据统计与分析、百度地图绘制等功能,这些功能均提供了Restful API接口,在未来新增的功能模块需要这些底层支持时,可以复用这些服务,从而提高系统的可维护性。 辅助性微服务包含了城镇人口住宅信息Edge Service和网关服务,它们分别提供了城镇人口住宅应用的前端展示和域名解析等功能。 业务逻辑微服务包含了民宅管理服务、小区管理服务、民宅信息查询服务等。这些服务都是面向业务进行编码的,首先对使用频率较高的业务需求进行分割;其次对不同性质的业务进行拆分,例:小区和民宅;最后对具有较强关联性的业务进行合并分割,例:房屋信息和户主信息查询。 管理监控微服务包含了多租户信息管理服务。它提供了租户管理、权限分配和应用管理等功能;它通过Redis缓存实现了应用之间的单点登录。 从上图2中看出,当进行功能横向扩展时,只需要编写新的服务实例而无需修改不相关服务,然后相关服务通过服务注册与发现中心调度新增服务,较好的解耦合了功能之间的依赖关系。比如新增一个其它应用的服务,只要让多租户信息管理服务调度它的接口即可。由于每个服务只完成特定的功能需求,可以轻易定位功能的实现位置,从而提高系统的可维护性。比如当民宅租赁合同无法下载或者上传时,可以去民宅租赁合同管理服务中定位错误位置,从而修复系统错误。 4? 系统智能维护 SaaS(软件即服务)应用相较于传统应用的一大优势是服务或组件的独立部署能力。系统智能维护是指在某些服务崩溃时,系统自我恢复相应服务实例;当服务的流量增加或减少时,系统对相应服务实例进行动态扩缩容来提高系统的负载能力。基于服务分割模型切分多租户城镇人口住宅管理系统,对这些服务进行多实例化部署和动态扩缩容部署,从而实现系统的智能维护。系统部署如下图3所示。 由于服务之间不能直接通讯,因此需要一个服务注册与发现中心作为中间件,该中心被部署到Kubernetes[9]集群中,利用Kubernetes集群的自我修复功能,实现在容器死亡时重新启动失败的容器或者替换新的容器,确保了服务注册中心的稳定性。 复用性微服务、辅助性微服务、业务逻辑微服务和管理监控微服务,都被打包成Docker[10]镜像,利用Kubernetes集群的多实例化部署和动态扩缩容部署,实现系统在高低流量下的服务实例的智能维护功能,从而提高了系统的健壮性和稳定性。 5? 应用的微服务实现 5.1? 服务分割结果 通过服务分割模型把多租户城镇人口住宅管理系统拆分成多个原子服务,这些服务会被注册到服务注册与发现中心Eureka中。当服务实例运行之后,服务注册中心将显示服务的名称、状态、实例个数、可用个数、IP地址和端口等服务信息。 在完成服务的分割与开发之后,将各个服务打包成Docker镜像,发布到私人的镜像仓库中,如图5所示。通过镜像仓库中的镜像文件,Kubernetes集群会拉取其中的文件,生成pod组件,然后通过Service的虚拟IP实现服务实例的动态扩缩容和自我恢复。 5.2? 智能维护结果 在Kubernetes集群中设置Service的资源(例:内存、CPU使用率等)使用率阙值为50%,通过Shell脚本来增加访问流量之后,资源使用率增加,从而让实例的个数由1增加到4,分担了服务实例的负载压力,实现了系统的智能维护,从而提高了系统的健壮性和稳定性。 6? 总结 本文构建了用来辅助设计分布式应用的服务分割模型,利用该模型可以设计出具有较高扩展性的应用系统。其次本文基于该模型和微服务架构实现了多租户城镇人口住宅管理系统,解耦合了功能应用,提高了该系统的可维护性和扩展性。最后采用容器技术和容器编排框架完成了系统服务实例的智能维护功能,让系统在高低流量下具有较好的稳定性。 参考文献 Lewis J, Fowler M. Microservices[OL]. (2018-12-20) [2019- 01-16]. http://martinfowler.com/articles/microser -vices.html Catalin Strimbei,Ocatavian Dospinescu, Roxana-Marina Strainu, et al. Software architectures-present and visions[J]. Informatica Economica, 2015, 19(4): 13-26. 欧阳荣彬, 王倩宜, 龙新征. 基于微服务的数据服务框架设计[J]. 华中科技大学学报(自然科学版), 2016, 44(S1): 126-130. 周丹, 雷晓玲, 章民融. 基于微服务架构的校车安全管理系统设计与应用[J]. 计算机应用与软件, 2018, 35(8). 向彬彬, 马明星, 童茂林, 等. 基于微服务架构的分布式测距系统的研究与设计[J]. 计算机应用与软件, 2018, 35(5). Sun Y, Nanda S, Jaeger T. Security-as-a-Service for Microservices-Based Cloud Applications[C]//IEEE International Conference on Cloud Computing Technology & Science. IEEE Computer Society, 2015. 林少普, 倪礼豪. 温州农业科技园信息化管理平台SaaS 方案设计[J]. 软件, 2015, 36(8): 67-70. Evans E. Domain-Driven Design: Tackling Complexity in the Heart of Software[J]. Domain-driven design: tackling complexity in the heart of software, 2002. Kubernetes. Open source communication[OL]. (2018-12-20) [2019-01-16]. https://kubernetes.io/docs/concepts/ Docker. Open source communication[OL]. (2018-12-20) [2019-01-16]. https://docs.docker.com/engine/reference/builder/ #format. |
随便看 |
|
科学优质学术资源、百科知识分享平台,免费提供知识科普、生活经验分享、中外学术论文、各类范文、学术文献、教学资料、学术期刊、会议、报纸、杂志、工具书等各类资源检索、在线阅读和软件app下载服务。