戴云鹏,乔运华,周文坤,张宵铭
(1.北京机械工业自动化研究所,北京 100120;2.北京机械工业自动化研究所有限公司,北京 100120)
RS10系统作为一个面向集团型企业管理的大型信息系统,已经经历了十几年的发展。在十几年间,RS10系统不断发展和壮大,功能不断增多、增强。尤其是近年来,MES系统的飞速发展,对底层架构的冲击非常大,原有的单体式架构已经无法满足RS10系统对性能的需求。微服务架构将大型的系统拆解成为分散的、可以单独部署的服务,并且每个服务都可以有自己的数据库,新扩展一个功能,可以增加一个新的微服务。这样的架构特点,无疑满足了RS10系统对底层架构的性能需求,对扩展业务系统功能的需求。
单体式架构易于部署,在系统功能比较简单时运行的很好。但是历经十几年时间的发展,为了满足客户日益多样化的需求,RS10系统经过一次又一次的扩展,变得越来越庞大、复杂。单个开发者已经越来越难以了解透彻整个系统,系统维护过程中需要接受的挑战越来越多,往往一个错误的修改就会耗费很长时间,而且由于系统耦合度高,一个旧有错误的修改往往会带来很多新的错误,这给系统的维护带来了很多不便,在原有系统上开发新功能也变得越来越困难,越来越复杂。同时新员工对系统的学习也变得越来越困难,往往为了解自己负责的部分而不得不了解整个系统,这对新员工快速进入工作不利,降低了工作效率的同时变相增加了人工成本。
微服务是一种面向服务的架构风格,应用程序被构建为多个不同的小型服务的集合而不是单个应用程序[1]。相比于单体式架构,微服务架构的部署比较复杂,但是系统各模块之间的耦合度很低。微服务架构将整个系统以业务功能为基础进行划分,将单个的系统服务拆解成不同的服务。微服务架构具有以下特点:
在传统开发模式下,程序的多个功能会统一到一个项目里面,开发时必然会伴随着代码冲突,开发人员沟通困难等诸多问题,这个问题会随着团队人数增多,软件复杂度提高变得越来越突出[2]。但是在微服务架构下,系统的不同功能被拆分成了单独的服务,服务之间耦合度很小,每个服务作为一个项目组,每个项目组的人员只需要负责自己项目组的代码即可,开发始终是简洁高效的。同时在交付阶段,传统的项目组必须等到所有功能全部检测完毕之后才可以交付,某一个地方的错误会拖累整个项目组的进度。而微服务是独立部署和运行的,每项服务的检测和交付都是独立的,因此可以持续交付,这样持续交付的方式提高了交付的速度。
每项微服务可以有自己的编码方式,甚至是独立的数据库,这样就使得系统的维护和升级难度大大降低,开发和维护团队只需要了解自己负责的服务即可,不需要了解整个系统,每个服务都是单独部署,单独升级的。这样使得系统的升级变得轻松,不需要像单体式架构一样升级需要考虑整个系统,降低了系统升级的难度。
系统在开发完成之后并不是一成不变的,为了满足客户的需求,增加新功能不可避免,在传统模式下每增加一个新功能,都要考虑对其他功能的影响,但是在微服务模式下,可以将新功能开发成一个新的微服务,由于独立开发和部署的原因,和其他功能的关联很小,可以保证原有功能不会受到影响,这样就很大的提升了系统的扩展性。
图1 单体架构和微服务架构[3]
RS10云平台是系统底层技术架构的核心,RS10系统的所有服务都运行在云平台上。云平台采用了docker容器引擎和Kubernetes容器集群管理系统[4]。
docker是一个开源的容器引擎,docker容器本质上是一个进程,容器之间相互隔离,保证了容器的独立运行。这符合微服务架构要求的服务独立运行和部署的理念。docker建立容器需要以镜像为模板,因此docker需要一个镜像仓库来存储和管理镜像。出于安全因素的考虑,公共的镜像仓库不符合系统的需要,因此建立私有的harbor镜像仓库。这样不但可以存储和管理镜像版本,还可以保证内部开发环境的安全。镜像在仓库内部按照项目的不同进行分组,同一个项目的镜像放在一起,管理十分方便。
Kubernetes是google公司推出的开源容器集群管理系统,它支持多种语言,Java、Python等语言都可以使用,这是RS10云平台采用Kubernetes的原因之一。Kubernetes集群的节点分为master节点和node节点,其中master节点主要负责调度集群的资源,无论是资源的建立、删除还是停止,都需要通过master节点来控制,是重中之重。Master节点一旦出现故障,整个集群都会瘫痪,因此RS10云平台要求最少有两个master节点,确保集群不会因为一个节点的故障影响整个系统。node节点负责工作资源的运行,部署的服务都会运行在node节点上。Node节点的故障不会影响整个集群,无论是哪个节点停止工作,master节点都会将故障节点负责的工作转移到其他节点。因此node节点的数量是不固定的,一般会根据集群运行资源的需要进行调整。
Kubernetes不但可以通过命令控制资源,还可以通过可视化工具来管理系统资源。Kubernetes使用dashboard作为可视化工具,无论是节点,还是名称空间、存储类、控制器等资源,都可以通过dashboard进行管理。dashboard将用户分为管理用户和普通用户,管理用户可以对资源进行编辑、删除等操作,普通用户只能浏览页面,查看集群情况,没有修改的权限。另外Kubernetes不但可以扩充节点,还可以实现pod资源的扩容。传统单体式应用的集群如果资源紧张,需要扩容,那么整个系统的所有功能都需要重新部署在一个新的节点上。但是大部分时候系统的资源紧张仅仅是其中某一个功能使用频繁,并不是所有功能都使用频繁,并且这样的资源紧张在经过一个高峰期后会迅速回落,盲目增加节点的方式造成了资源的浪费。Kubernetes系统可以针对某个服务进行扩容,将资源紧张的微服务对应的pod节点进行扩容,这样只针对某个服务进行扩容的方式无疑比起增加一个节点来说不仅节省了大量的资源,而且节省了大量的时间。等到服务使用的高峰期过去,还可以恢复原来的pod节点数量,这样的工作机制,对用户来说无疑是高效而又简便的。
图2 Kubernetes集群节点关系简单示意图
图3 用可视化工具进行编辑、删除操作
RS10系统将服务分为三种,分别是基础服务,业务系统服务和第三方服务。
基础服务包括安全认证、搜索服务、存储服务、资源管理服务、业务元数据服务、信息推送服务、日志、监控等服务。这些服务是RS10系统运行所必需的服务,例如日志服务统一记录应用程序产生的各种信息,包括服务的部署、运行、停止过程中产生的信息和记录。维护和部署人员统一通过调用服务,来查看系统是否报错,并对报出的错误进行处理;监控服务可以监控系统的软硬件资源,硬件方面主要监控内存、硬盘、CPU等资源是否充足,一旦硬件资源剩余量过低,就会通知维护人员,通过增加集群工作节点的方式对系统硬件资源进行扩充,或者关闭不必要的微服务,减少硬件资源的使用。软件资源方面主要监视pod、service等资源是否正常运行,如果资源没有正常运行,就需要对没有正常运行的资源进行维护,确认资源没有正常运行的原因,并修改,记录。通过软硬件资源的监视,可以很方便的看出RS10系统的运行状态,出现错误可以及时改正,减轻了系统维护人员的负担;安全认证服务主要用于安全验证。服务与服务之间,业务系统与服务之间的通信,都存在着网络数据被窃取的风险,所以需要通过安全认证服务进行安全验证,通过验证之后进行安全有效的交互,屏蔽过滤掉恶意、不安全的请求,这样增加了系统的安全性,确保系统数据不会被窃取。这些服务提供了对RS10系统业务的支撑。
业务系统服务包括EIP门户服务、公文服务、合同服务、财务流程服务、MES服务、工作流服务、移动端服务、邮件服务等。业务系统服务是对业务系统中存在的标准业务流程进行抽取,抽取成标准服务,例如EIP门户服务是对EIP系统中公共部分抽取服务,包括一些标准化的流程和页面动态布局提供支持;公文服务是对公文的流程,包括公文创建、发起、查看、撤销等抽取出标准的流程服务,对公文系统进行更好的服务支撑;工作流服务主要对工作流系统进行支撑,可以进行行政事务的审批和业务申请的审批。如请假申请,程序错误提交申请等;邮箱服务可以用于企业内部的邮件的接收、发送;移动端服务可以让企业人员在移动设备上进行办公,方便出差人员的使用,提高企业的办公效率。
第三方服务是与第三方插件或工具集成的服务,包括报表和打印服务、ireport服务、语音服务、图像识别服务、人工智能服务等。客户的需求是多种多样的,因此在系统中集成一些第三方服务变得不可避免。原来的单体式架构集成需要考虑第三方插件与系统的冲突,导致系统对第三方插件选择的余地很小,需要多次测试才能够确定是否可以采用第三方插件。但是在微服务架构下,系统的选择范围大了很多,可以更多的侧重插件的性能。随着人工智能和大数据的发展,图像识别、人工智能等已经逐渐应用到了很多领域,对这些服务的集成,可以更好地适应时代的发展,满足客户的需求。
结合当前用户越来越多的需求和单体式RS10系统越来越复杂的现状,基于微服务架构的RS10系统的开发已经成为了当前迫切的需求。微服务架构具有的低耦合特性符合RS10的发展需要。将庞大的RS10系统拆解成一个个的微服务,解决了RS10系统当前系统复杂,学习入门难,升级难的问题,每个微服务的升级与其他微服务无关,这样使得团队之间的分工明确,每个团队只需要维护自己所负责的服务即可,不用为了维护或者升级一个服务,必须将整个系统都了解一遍,极大地节约了人力资源。RS10系统从单体式架构升级为微服务架构,可以有效降低RS10系统的开发难度,提升RS10系统的开发效率。