基于“微服务+容器化”实现空间规划应用平台快速搭建
2015年极海云上线,不久便得到一家国字头单位合作的机会,需要把极海云部署在离线环境。为了保障顺利部署,大家做了周全的准备,把各种依赖库全部下载打包,模拟用户服务器环境部署测试。万事俱备,我们兴奋地哼着小曲来到用户机房。然后,噩梦开始了... 由于服务器环境的差异,要么缺少基础库,要么需要安装的依赖库和现有库有冲突。因为服务器完全离线,我们不得不数次往返于公司和用户机房,该下载的下载,该编译的编译... 最终我们用了一周的时间,才让极海云在用户服务器上运行起来。
这一次难忘的软件部署经历之后,我们开始研究如何提升软件交付效率。借助“微服务+容器化”技术,极海云已形成具备云原生能力的地理大数据云平台架构(如下图所示),可以在30分钟内完成对不同规模服务器集群的自动化部署。这背后其实是微服务架构的落地和容器技术的崛起。微服务和容器技术以一种自然而优雅的方式结合在一起,重新定义了软件交付的方式。这篇文章将阐述我们如何利用“微服务+容器化”重构极海云架构,以及如何更好地服务于如火如荼的国土空间规划平台建设。
从早期传统的单体架构,到后来的SOA(面向服务架构),再到现在的微服务架构,软件架构在不断的发展迭代。随着软件规模越来越庞大,处理的业务越来越复杂,人们总能发现当前架构的不足并试图给出新的解决方案。微服务虽然是2014年才开始流行的概念,但其实是软件规模和软件架构长期持续演进的结果。微服务架构的出现,对当前互联网和云计算环境下的软件开发和交付形式,产生了深远的影响。
简单来说,微服务就是一些协同工作的小而自治的服务。微服务是一种架构风格,一个大型复杂软件由多个微服务组成。微服务可被独立部署,各个微服务之间是松耦合的。每个微服务仅关注完成一件任务,每个任务代表着一个小的业务能力。微服务的概念是相对于传统的“单体架构”的概念提出的,微服务具有以下特点:
- 耦合程度。微服务架构开发人员只需处理小型代码库,程序之间更容易松耦合。
- 成员职责。可按照微服务分配团队工作,开发人员职责更加明确。
- 技术堆栈。微服务可根据实现功能选择更合适的不同的开发语言和库。
- 持续交付。单体程序要更新整个应用,微服务可独立部署,持续交付更加容易。
- 可伸缩性。单体程序需要多个副本,微服务可根据所需资源扩展各自数量。
微服务的价值在于把软件系统按照业务划分成粒度适中的功能模块,彼此独立松耦合,通过相互调用实现完整的业务逻辑。对于开发企业来说,微服务带来团队更明确的分工、更快速的开发效率、更高效的持续交付。很有趣的一个现象是,我们发现最终用户对微服务也很在意,他们更倾向于采用微服务架构的软件。对于最终用户来说,微服务架构保证了对用户需求的快速响应和及时交付。
当然这世界上没有银弹,微服务架构也是一把双刃剑,不是所有软件都适合微服务,实施过程中也面临新的挑战。首先微服务架构是一种分布式架构,服务之间的调用由单体架构下的引用调用变成远程调用,开发和调试都带来复杂性;其次,因为服务之间的依赖,测试微服务也变得复杂;再者,一个软件系统会有几十甚至上百上千个微服务,每个服务都有多个实例,如何配置、部署、监控、发现微服务并实现高度自动化,需要有新的方法和工具来支撑。接下来要介绍的容器技术,为微服务架构的落地提供了解决方案。
容器技术由来已久,最早可追溯到1979年贝尔实验室尝试用“容器”的概念,在操作系统环境下“隔离”出一个可供软件构建和测试的环境,以此提升软件测试效率。2008年,LXC(Linux Container)作为完整的容器技术出现在Linux内核中。而容器技术真正被大众所熟知并大规模应用,要等到2013年开源项目Docker发布。以至于很多人认为容器就是Docker,Docker就是容器。而Docker其实是在LXC基础上,用一套漂亮的设计让Linux容器技术具备了大规模应用的可能性。Docker和LXC的关系,可以理解为GitHub与Git的关系。Torvalds花两周时间写出来的Git,专业而小众,而GitHub让全世界程序员都用上并爱上了Git。事实上,Docker的镜像设计确实也从GitHub的设计上受益良多。
容器技术(Linux Container,LXC)是一种内核轻量级的操作系统层虚拟化技术。容器提供了将应用程序的代码、运行时、系统工具、系统库和配置打包到一个实例中的标准方法。一个宿主机上的所有容器共享一个内核(操作系统)。容器化就是把应用程序打包成容器运行,是应用程序级别的虚拟化。容器具有以下特点:
- 极其轻量。容器仅打包应用程序、配置和依赖库,所占存储少,一般为MB级别。
- 秒级启动。容器启动时间为秒级,虚拟机为分钟级,可大大减少开发、测试、部署的时间。
- 易于移植。一次构建、随处部署,完全离线的环境也是如此。
- 接近原生。在容器内运行的应用程序,性能接近原生,远高于虚拟机内运行的程序。
容器技术的价值在于重新定义了软件交付的方式,让微服务架构落地。分层的概念、一次编译随处部署的特性,使得Docker在容器技术的竞争中胜出。Docker通过容器镜像,直接将一个应用运行所需的完整环境,即整个操作系统的文件系统打包进去。镜像一旦编译完成,可以在任何Docker环境中运行,我们再也不用面对文章开篇描述那样的窘境。Docker容器镜像已经成为了现代软件交付与分发的事实标准。
容器技术实现了应用的微服务化和单一职责化。但真实的软件系统,是由很多微服务构成的。这些服务的应用和管理具有复杂性,又需要灵活性,尤其是在云计算环境中。其中最为重要的是如何解决容器编排问题,这成为Docker的大规模应用的最大障碍。Docker在取得了容器技术的胜利后,却在容器编排竞争中失利。这一次,在容器技术方面有着深厚积累的Google(LXC就是Google贡献到Linux内核的)推出Kubernetes并占得先机。Kubernetes提出一套容器化设计模式和对应的控制模型,让软件程序具备了云原生的能力。
那次难忘的软件部署经历之后,我们开始对软件架构和交付形式进行渐进式调整。一是实施微服务架构,把软件程序按照功能模块划分为粒度适中的微服务,提升迭代效率;二是通过Docker技术,以容器镜像的方式交付分发微服务,提升交付效率;三是采用Kubernetes作为容器编排和管理工具,实现整个平台的云原生能力。Kubernetes是整个“云原生”理念落地的关键与核心所在,Kubernetes架构如下图所示。
极海云架构如下图所示。用户可直接通过浏览器访问前端应用,开发者通过API做定制化应用开发,统一由后端服务输出能力。前端应用、各种API、后端服务都以微服务的形式运行。目前极海云内部运行着几十个微服务,不同的微服务分配不同的资源,运行不同的实例数量,达到硬件资源的最大化利用。“云原生”能力让极海云脱离了对具体硬件环境的依赖,可以部署在阿里云这样的IaaS环境,也可以部署在由物理机或虚拟机组成的服务器集群环境。极海开发团队,针对微服务有着明确的分工,内部通过实施DevOps对微服务快速迭代,对用户需求快速响应并及时交付。
随着国家和地方机构改革方案落地,自然资源部及各地方自然资源和空间规划部门相继成立,空间规划进入新时代。而“规划编制”是规划工作的首要环节,是构筑智慧国土空间规划的先发基础。伴随“大智移云”技术逐渐成熟,如何将其与规划编制业务流程有效融合,用以匹配支撑“可感知、能学习、善治理、自适应”的数据驱动的“智慧规划”不同深度的业务要求,是推动国土空间治理体系和治理能力现代化的重要起点。
智慧国土空间规划编制工作,如何能优质快速地实现数字化工作状态,成为当前时间紧、任务重的工作要求。极海快速响应,以极海云为基础,基于“微服务+容器化”,已经研制并建立了一套集数据管理、空间数据分析、专题图制作为一体的空间规划辅助编制平台。目的是为规划编制人员优化规划编制工作流程,打造高效协同工作模式,从根本上满足和保障智慧规划编制质量和效率要求。