本文结合笔者的实际工作经验,主要论述面向服务的架构在该项目中的具体应用。provider服务提供者主要完成服务的设计、描述、定义和发布等相关工作;registry服务注册中心保证该系统各个模块或服务的相互独立性与松耦合;consumer服务请求者或消费者通过WebService技术调用服务。实践证明,通过以上技术的应用有效实现了资源共享和系统间的互操作性,提高了系统的灵活性,最终系统顺利上线,获得用户一致好评。
在架构工作开始阶段,我们便意识到选择合适的架构技术至关重要。SOA是一种应用程序架构,在这种架构中,所有功能都定义为独立的服务,服务之间通过交互和协调完成业务的整体逻辑。SOA指定了一组实体,包括服务提供者、服务消费者、服务注册表、服务条款、服务代理和服务契约,这些实体详细说明了如何提供服务和消费服务。服务提供者提供符合契约的服务,并将他们发布到服务代理(注册中心)。这些服务是自我包含的、无状态的实体,可以由多个组件组成。服务代理者作为存储库、目录库或票据交换所,产生由服务提供者发布的事先定义的标准化接口,使得服务可以提供给在任何异构平台和任何用户接口使用。这种松耦合和跨技术实现,使各服务在交互过程中无需考虑双方的内部实现细节、实现技术、及部署在什么平台上,服务消费者只需要提出服务请求,就可发现并调用其他的软件服务得到答案。SOA作为一种粗粒度、松耦合的架构,具有松散耦合、粗粒度服务、标准化的接口、位置和传输透明、服务的封装和重用、服务的互操作性等特点。结合这些特点,我们最终采用了这种架构,下面具体论述实施过程和效果。
服务提供者provider,服务提供者主要完成服务的设计、描述、定义和发布等相关工作。经我们内部深入研究讨论,为保证服务自身功能的完整性,尽可能减少服务与系统之间的通信,在实施过程中先行设计,对于急需的服务便于日后集成使用,我们将CMDB资产管理服务作为服务提供者,因为资产管理模块会被各业务系统频繁调用,用来获取到主机信息、应用信息、项目信息后做更一步的操作和处理,而每个业务系统前台访问时又分PC端和移动端,而不同入口的查询参数会有不同,如PC端的url查询参数支持传数组,例如/resource/?other_page=[1,2],而移动端的查询参数不支持数组只能用字符串,这样在后端服务的视图中我们根据请求头信息的user_agent做了不同的设计方案,并且在描述服务和定义服务时作了说明,利用http协议的POST请求将这些服务信息发布至服务注册中心,使用json轻量级数据传输格式,并公布查找和定位服务的方法。
服务注册中心registry,提供位置透明性的消息路由和寻址服务,提供服务注册和命名的管理功能,支持多种消息传递类型,支持多种广泛使用的传输协议,支持多种数据格式及相互转换,提供日志和监控功能。为保证该系统各个模块、服务的相互独立与松耦合,我们使用开源的服务注册中心consul,与Euerka比consul支持更多的接口协议如http和dns,支持多数据中心分布式的部署,支持kv存储,consul上包含有已发布的资产管理服务的描述信息,描述信息主要包括服务功能描述、参数描述、接口定义、信息传递等相关信息。注册中心会对已注册成功的服务进行健康检查,默认间隔时间为10s,一旦服务的某个节点有异常会将其状态置为failed,并将其在临时表temp table中清除,这样就不会给服务请求者分配或路由到有问题的节点上。
服务请求者consumer,通过WebService的RESTful规范调用服务,当服务完成发布,服务请求者即可使用已发布的服务。以CICD服务为服务请求者为例,利用WebService先查询到行者应用下的所有主机,如发送GET请求/api/address?app_name=xingzhe到服务提供者前,会先从注册中心consul中拿到可用服务的temp table,从这个表中取到provider的ip:port后再发送请求/api/address?app_name=xingzhe给provider,之后再根据取到的主机用POST请求将主机地址发送给provider,provider利用ssh协议依次连接到被管理主机根据ansible的task逐一执行部署任务,期间使用websocket连接consumer可获取provider的每一步任务的执行状态,在这期间consumer无需了解服务是如何进行处理的。
项目历时13个月,于2020年6月完成交付,到目前运行稳定。通过在此项目上的一段时间的使用,用户普遍反馈较好。选用SOA有如下优势:1、系统更易维护,当需求发生变化时,不需要修改提供业务服务接口,只需调整业务服务流程即可;2、更高的可用性,服务提供者和请求者的松散耦合关系上得以发挥与体现,松耦合有2个明显的优势,一是它的灵活性,其独立于实现服务的硬件平台、操作系统和编程语言,二是当组成整个应用程序的每个服务的内部结构和实现逐渐地发生改变时,它能继续存在;3、更好的伸缩性,依靠业务服务设计、开发和部署等所采用的架构模型实现伸缩性,使得服务提供者可互相彼此独立地进行调整,以满足新的服务需求。实践证明,SOA技术的使用大大提高了系统开发效率,节省了开发和维护成本,使得系统具有更好的开放性、易扩展性和可维护性,从项目完工后的使用效果看,达到了预期目的。