【软考论文】论面向服务架构的设计及应用
本文结合笔者实际经验,以该项目为例,讨论微服务架构及其应用,包括微服务的基本概念及特点,如何从单体架构迁移到微服务架构,以及在实现微服务架构的过程中遇到的问题及其解决方案等。
摘要
2021年初,我所在的研发部承担了公司自研XXXX管理平台项目的建设,为客户公司提供一站式的股权管理服务。我在该项目中中承担架构设计师的职务,主要负责该项目的系统架构、技术方案评估与实现、项目立项论证等工作。整个平台以多租户的模式,进行统一的管理及日常运营。平台整体逻辑复杂,对系统的高可用和高扩展能力提出了较高的要求。本文结合笔者实际经验,以该项目为例,讨论微服务架构及其应用,包括微服务的基本概念及特点,如何从单体架构迁移到微服务架构,以及在实现微服务架构的过程中遇到的问题及其解决方案等。
正文
随着国务院发布《关于支持浙江高质量发展建设共同富裕示范区的意见》中提到浙江到2025年和2035年要实现的共同富裕相关目标。越来越多的上市企业选择对员工开展XXXX计划。我所在的某集团公司,为了集团的发展,需要在XXXX这一赛道上保持竞争力,根据这一目标,XXXX管理平台这一项目应运而生。2021年初,我所在的研发部承担了公司自研XXXX管理平台项目的建设,为客户公司提供一站式的股权管理服务。我在该项目中中承担架构设计师的职务,主要负责该项目的系统架构、技术方案评估与实现、项目立项论证等工作。整个平台以为上市公司提供资金管理、财富管理、税务服务等一站式支持,涵盖股权管理、估值管理、多样化激励方案信息化管理、税务与财务咨询服务及系统个性化定制服务等,更高效、更便捷地为企业客户“一篮子”金融解决方案。整个平台涉及证券、税务、银行、电子签署等过个复杂业务逻辑,业务流程复杂、系统可靠性和可扩展性要求较高,响应的范围比较广。
面向服务架构(SOA)是一种松耦合、粗粒度、与语言无关的应用架构,服务之间通过标准化的接口实现交互,不需要了解对方的内部实现细节、具体的技术平台和部署方式,适合于异构系统之间的服务集成。面向服务架构的常用实现方式包括webservice、ESB。webservice包含服务提供者、服务请求者和服务中介者,服务提供者通过发布的WSDL,定义了服务的接口、入参和出参等信息,描述对外提供的服务功能;服务请求者通过SOAP协议访问服务提供者,SOAP主要定义了服务之间如何交互以及消息格式;服务中介者一般采用UDDI实现,UDDI用于描述、发现与集成服务,服务提供者向UDDI发布服务,服务调用者查询UDDI上已发布的服务。ESB采用总线机制,提供了服务的注册、服务路由、消息格式转换、安全认证、服务编排、日志和监控等功能。
微服务架构是SOA的延伸和演化,它强调更轻量级的通信协议,以业务模块划分服务,每个服务可以采用独立的技术栈和存储,可以很方便地水平扩展。相比微服务,传统的单体软件架构在构建部署和扩展伸缩方面有很大的局限性,传统的单体架构系统中任何程序的变更都需要整个应用重新构建和部署新版本。另外传统的单体架构在进行水平扩展时也只能整个系统扩展,而不能针对某一个功能模块进行水平扩展。而微服务架构恰好可以完美地解决传统单体架构所遇到的种种问题。微服务架构将系统以组件化的方式分解为多个服务,服务之间相对独立,单个服务功能的改变只需要重新构建部署相应的服务即可。
笔者带领部门的同事经过一段时间的架构考察和评估,最终决定采用微服务架构建设新系统。采用微服务架构的目的是充分拆分庞大臃肿的系统,以促进软件的敏捷开发和部署。下面主要从服务模块设计规划及服务治理两个方面详细阐述微服务架构在项目中的具体实施过程。
我们深入分析了该系统的核心需求,并根据这些需求将整个系统进行了业务拆分。原则是确保不同服务的业务边界明确、避免重复开发相同的业务功能,这也符合单一职责原则的要求。我们将整个系统拆分成了六个独立的服务:用户权限管理服务、XXXX管理服务、资金归集服务、税务缴纳服务、电子签署服务、消息推送服务。我们对数据库也进行了拆分,每个服务都有自己的数据库,并且不能直接访问其他服务的数据库。在拆分过程中,我们充分考虑了系统的可扩展性和可维护性。每个服务都需要将自己的业务暴露成服务,以便其他模块可以方便地调用和集成。这种方式的实施意味着每个特定的服务都由一个专门的研发团队来负责,因此我们对团队成员以服务维度为基准进行了重新组织,这个团队包括了设计、开发、测试和部署运维等各个环节的专业人员。通过这样的分工,各个服务能够更加独立地进行开发和测试,然而这种方式也会增加整体团队的管理难度。为了解决这个问题,我们在每个小团队中都选出了一个负责人来负责团队的日常管理。这个负责人需要对整个团队的工作有全面的了解,同时也要协调各个小团队之间的工作关系,确保整个团队的顺利运行。
从实践角度来看,微服务的可靠性相较于单体系统更难以处理。这不仅受到服务本身可靠性的影响,还受到网络状况和相关联的微服务运行质量等因素的影响。因此,在设计微服务可靠性时,需要考虑集群容错。集群容错包括路由容错、服务降级和熔断。通过路由容错机制,可以实现微服务的自动容错处理,从而提高系统的整体可靠性。但是直接在代码中引入路由容错,往往需要引入健康检测机制,这无疑会提高代码设计的复杂性。在该项目中,我们使用业内著名的中间件 Consul 对微服务进行治理。通过与 Nginx 相互配合,可以完美实现服务的容错。Consul提供健康检测功能,只要在服务注册的同时,配置相关的检测条件如 HTTP 请求为200,并指定在故障出现多久后自动将服务从注册中心注销。对于那些需要暴露在外网的服务,可以使用 Consul-Template 实例自动监测 Consul 集群的变化。若发现服务实例被注销,则按照事先定义好的 Nginx 配置模板重新生成 nginx.conf 并 reload 本节点的 Nginx,使得失效的服务从 Nginx 中删除,避免开放接口出现故障。对于处于系统内部的微服务,可以直接通过 Consul 提供的服务域名进行互相访问,对删除的服务实例不存在感知。这样一来,代码中也无需添加路由容错逻辑,降低了编码的复杂度。
在服务降级方面,为了确保核心服务的稳定性和可用性,特别是在业务高峰期,有时需要暂时关闭一些非核心或次要的业务。例如,在XXXX管理服务中,晚间通常需要处理大量的报表计算工作,为了更有效地利用资源,我们选择在每天晚上12点至次日早晨6点期间,暂停股权管理服务中的大部分服务,仅开放部分数据查询接口供使用,其余资源则全部用于报表生成。这种服务降级策略能够有效保障复杂业务报表的正常生成。
在微服务架构中,各个服务之间会通过HTTP 方式彼此进行通信,并等待其响应。然而,由于网络故障或其他原因,这个请求可能会失败或者无法得到及时响应。为了防止因这些异常导致请求方资源耗尽,我使用了开源的 Hytrix 框架来进行熔断配置。通过设定熔断参数,当请求错误率达到一定阈值时,断路器就会进入开启状态,所有新的请求都会被短路。一段时间后,断路器会变为半开状态,如果下一个请求成功了,断路器就会关闭;反之,它会继续保持开启状态。Hytrix 将每个微服务的请求放入线程池中,实现资源隔离。即使某个依赖服务出现问题,也不会影响应用程序的其他部分。因此,我在项目中为关键服务都配置了熔断机制,以防止大规模的超时等待情况发生。
微服务架构不是银弹,除了可靠性,它同样也还有一些其他可大可小的问题。比如定位故障困难,以往的单体结构只要日志完备就能快速定位问题。而在微服务中,需要引入链路跟踪才能方便定位问题。其次,一旦微服务数量扩大,服务 数量非常多,部署、管理的工作量很大,这对团队来说也会是不小的挑战。因此 在后续过程中,需要引入更多自动化部署、服务监控等工具来节约部署和监控的成本。所以,在拥抱微服务之前,也需要认清它所带来的挑战。需要避免为了“微服务”而“微服务”。
【软考论文】论面向服务架构的设计及应用