APP下载

基于Docker技术在CIM平台微服务部署的研究及应用

2022-02-03鹏,邱星,李

现代计算机 2022年21期
关键词:镜像容器部署

周 鹏,邱 星,李 鑫

(1.中国电建集团华东勘测设计研究院有限公司,杭州 311122;2.浙江华东工程数字技术有限公司,杭州 310000;3.陕西省西咸新区沣西新城管理委员会,西安 710000)

0 引言

随着互联网技术不断发展,软件项目在实际使用过程中,面临需求不断增长、用户访问数量不断增多的情况。面对这种情况,传统单体项目需要不断增加代码体量,随着时间推移,会出现代码冗余,部署维护困难,且渐渐无法支撑大量用户同时访问等问题。为解决这些问题,微服务应运而生,其优秀的拓展性和可配置性,使其可以承载更多的用户,成为更多中大型项目的架构选择[1]。

但是微服务部署存在诸多问题,使用传统纯Jar 包部署方式,将后端业务代码打包成Jar包进行微服务项目发布,存在部署操作复杂、流程繁琐、命令复杂、参数配置性差、服务版本兼容性差等问题。采用Docker完成微服务部署工作,本文通过研究Docker在微服务部署中的应用,为微服务部署提供一个完善的解决思路。

1 概念介绍

1.1 Docker简介

Docker 是Go 语言编写的开源应用容器引擎。通过Docker,可将发布包打包到Docker 的可移植容器中,发布到常用的Linux 和Windows系统上[2]。Dokcer通过内核虚拟化技术实现容器的隔离和安全保障。Docker 硬件成本低,虚拟化硬件损耗小、性能好,可做到快速部署,迅速启动,弹性伸缩,且支持打包管理和低成本动态迁移。

Docekr 官方为解决容器编排问题,提供Docker-compose编排工具[3],调用Docker服务提供的API 来实现对Docker 容器集群的快速编排工作,通过配置文件管理多个容器,实现对容器的启动、停止、重启等操作。使用Docker-Compose 不需要shell 脚本进行启动容器,简化微服务部署工作,适合组合使用多个容器进行开发的场景。

1.2 CIM平台简介

城市信息模型(City Information Modeling,CIM)综合建筑模型信息、地理信息系统、物联网等技术,构建三维空间城市,联通城市信息与城市模型信息,实现对城市的数字化、智能化管理,增强城市管理能力,优化城市居住安全和环境。

1.3 微服务简介

微服务是一种架构概念,将单体服务拆分成若干个服务,从而降低系统的耦合性,且这些服务几乎不需要集中式管理,服务可用不同的语言编写,使用不同的数据存储技术。微服务中每个服务都可以独立部署,各服务负责完成各自功能,通过Http 协议交互,形成对外的统一服务。

2 Docker部署方案

2.1 环境搭建

2.1.1 服务器

两台服务器:一个是数据库服务器,主要用于部署平台中数据存储;一个是代码服务器,主要用于部署各类运行服务,提供外部访问端口。因为服务之间需要进行信息通讯,所以服务器之间需保证网络通畅,端口连通,在服务器安装Docker和Docker-Compose工具。

2.1.2 服务

为满足业务需求,平台共计16 个服务。其中5 个基础服务:Nacos 服务用来进行服务发现,保证服务之间的互相通信;Redis 服务作为平台中缓存存储,加快数据读取速度[4];Minio服务保存平台中的文件信息,包括图片、文档、PDF 等信息;Rabbitmq 服务作为消息队列,在平台高并发时,减轻数据库压力;Mysql 服务用来存储平台数据信息[5]。9 个系统服务:网关服务作为后台服务接口统一入口,负责请求分发和鉴权;消息服务,负责消息的接收与转发以及配置功能;存储服务负责文件的上传下载等功能;用户服务提供用户相关信息的管理功能;授权服务负责用户登录相关的功能;系统服务负责管理系统级别的相关功能;推送服务负责站内信的推送;流程服务提供流程相关的功能;监控服务负责日志接收、分析、展示、备份功能;单点登录服务提供单点登录功能,保证用户正常登陆。2个业务服务:前端服务进行前端页面的展示;业务后台服务为实现业务需求的具体逻辑代码。服务关系图如图1所示。

图1 服务关系图

2.2 工作原理

部署使用Gitlab作为代码统一管理仓库,便于浏览源代码,管理缺陷和注释,完成对开发团队的任务代码安排和人员代码管理。使用Jenkins 作为项目持续集成工具,提供友好操作界面,实现持续、自动构建软件项目,监控外部任务运行等功能[6]。使用Harbor 仓库作为Docker 镜像仓库,提供友好的Web Ui 界面,用户和用户权限管理;可通过Tips 标签记录服务镜像版本信息,简化服务镜像版本管理;提供了CVE 漏洞库来获取最新漏洞信息,扫描用户上传容器是否存在漏洞问题,保证代码安全。使用Docker 作为部署工具,Docker 将服务打包成镜像时,Docker 根据DockerFile 文件信息下载并打包该服务所需JDK、Nginx 等运行环境。凭借Docker 在主流操作系统下优秀的兼容性,增强打包后微服务的可移植性。流程引入Dockercompose 工具,编写Yml 文件,记录各服务镜像信息、环境挂载信息、端口信息、账号信息、日志配置信息、网关信息等内容,以提高命令可读性、可重复利用性、各服务网络的可配置性和可连通性。

基于Docker 进行微服务部署时,开发人员将代码上传到Gitlab 中,通过配置Webhook,触发Jenkins构建操作,根据DockerFile文件和推送配置,将构建后的镜像包上传到Harbor仓库中进行存储,后登录服务器,运行基于Docker编写的sh 命令,完成停止容器、删除容器、删除镜像、拉取最新镜像、通过配置文件启动容器等操作,成功部署。具体工作流程如图2所示。

图2 工作流程图

3 Docker部署实践

3.1 平台描述

沣西新城CIM 基础平台以BIM+GIS 为核心,以业务流程为驱动,利用三维BIM 技术信息化、数字化的技术优势,处理项目规划设计阶段技术接口问题,提前开展项目实施的施工模拟,来避免工程实施阶段引起的安全、质量风险及投资浪费,对整个项目全生命周期进行管理,提高整个工程项目建设的管理水平。

平台使用SpringCloud 为基础架构,在此基础上根据不同的功能需求,开发出十几个服务。平台初始阶段,采用传统Jar 包部署方案,发现存在操作流程复杂、管理界面杂乱、启动配置冗余、服务辨别度低、系统运行不稳定等问题。平台中,运维人员操作难度大,对于多个微服务,容易出现操作错乱,问题不易定位,管理费时费力。为解决上述问题,简化操作流程,提升平台稳定性,研究Docker部署微服务方案。

3.2 平台部署

为方便平台管理,根据服务的功能将服务分为基础服务、系统服务、业务服务,共编写3个Yml 文件进行管理。根据项目需要,编写管理基础服务的Docker-Compose.yml,管理系统服务的Docker-Compose-System.yml,管理业务服务的Docker-Compose-Product.yml文件内容。

服务间存在依赖关系,需根据上述3 个Yml文件中记录的镜像信息,利用Docker-Compose运行基础服务、系统服务、业务服务的镜像,生成对应容器即可启动成功。为简化服务器服务启动流程,将启动语句编写为sh 脚本,便于后续项目启动。通过Nacos可视化界面可查看服务注册情况,如图3所示。

图3 Nacos中服务启动信息

3.3 部署结果及经验

微服务项目使用Docker 成功部署。后端微服务中Nacos为服务注册中心,其他服务需注册到Nacos 中。通过Nacos 可视化面板查看各微服务注册情况,判断服务是否启动成功;通过检查前端是否正常访问后端接口判断后端微服务部署是否成功。

平台项目共计16 个微服务模块,使用两种方式对所有模块重复部署10 次,具体测试数据如图4所示。Jar包部署时,平均单次需72分钟;Docker部署时,平均单次需13.2分钟,且更加稳定,明显减少人为失误操作,提升项目稳定性能。在实际生产中,Docker部署方式已应用于多个大中型项目,根据上述数据推算,该部署方式已为项目节省部署时间预计300小时。

微服务项目使用Docker 部署,避免纯Jar 包部署时存在的问题,增强项目稳定性。使用该方法相对于纯Jar 包部署微服务,显著节省部署时间,效率对比如图4所示。同时该方法在可移植性、可操作性、可追溯性、参数配置性、统一管理性、网络连通性等方面较传统方法存在优势,具体见表1。

图4 Docker部署和Jar包部署项目时间对比

表1 Docker部署微服务对比传统纯Jar包部署微服务分析

4 结语

本文重点介绍基于Docker 的微服务部署,描述其在CIM 项目中的应用,实际简化运维流程,降低运维成本,提高项目的稳定性,增强项目的用户承载能力。因此,其在CIM 项目微服务部署中具有更广阔前景。其优势主要包括以下几点:

(1)便捷的操作方式,大大缩减了部署时间,减轻运维人员的部署压力。

(2)良好的可移植性,可以快速便捷迁移所需服务。

(3)使用Docker-Comopse 工具进行容器统一编排管理,增强命令的可视化效果,简化部署命令操作。

(4)使用Harbor 仓库,简化镜像历史版本的管理,便于对项目进行回滚操作。

(5)便捷的网络配置方式,使得容器之间更易配置服务发现和服务通讯。

同时,基于Docker 的微服务部署也存在一定不足,它更适合微服务项目部署,初次部署时,需安装配置Gitlab、Jenkins、Docker、Docker-Compose 等相关工具,并做好适配工作,具有一定复杂性,但在后续的部署工作中,对于多个子服务的管理可实现自动化部署,对运维人员十分友好;若为单体Web 项目,由于单体项目服务数量少,不存在微服务不易管理等问题,可选择辛亚宇[7]提到的使用Jar 包部署项目方式。

猜你喜欢

镜像容器部署
容器倒置后压力压强如何变
一种基于Kubernetes的Web应用部署与配置系统
晋城:安排部署 统防统治
镜像
部署
难以置信的事情
镜像
部署“萨德”意欲何为?
取米
镜像