首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

系统架构设计师:面向服务架构设计理论与实践--微服务模式

SOA的架构中,复杂的ESB企业服务总线依然处于非常重要的位置,整个系统的架构并没有实现完全的组件化以及面向服务,它的学习和使用门槛依然偏高。而微服务不再强调传统SOA架构里面比较重的ESB企业服务总线,同时S0A的思想进入到单个业务系统内部实现真正的组件化。

1.微服务架构概述

微服务架构将一个大型的单个应用或服务拆分成多个微服务,可扩展单个组件而不是整个应用程序堆栈,从而满足服务等级协议。微服务架构围绕业务领域将服务进行拆分,每个服务可以独立进行开发、管理和迭代,彼此之间使用统一接口进行交流,实现了在分散组件中的部署、管理与服务功能,使产品交付变得更加简单,从而达到有效拆分应用,实现敏捷开发与部署的目的。Amazon、Netf1ix等互联网巨头的成功案例表明微服务架构在大规模企业应用中具有明显优势。单体架构与微服务架构如图15-8所示。

1)复杂应用解耦

微服务架构将单一模块应用分解为多个微服务,同时保持总体功能不变。应用按照业务逻辑被分解为多个可管理的分支或服务,避免了复杂度的不断积累。每个服务专注于单一功能,通过良好的接口清晰表述服务边界。由于功能单一、复杂度低,小规模开发团队完全能够掌握,易于保持较高的开发效率,且易于维护。

2)独立

微服务在系统软件生命周期中是独立开发、测试及部署的。微服务具备独立的运行进程,每个微服务可进行独立开发与部署,因此在大型企业互联网系统中,当某个微服务发生变更时无需编译、部署整个系统应用。从测试角度来看,每个微服务具备独立的测试机制,测试过程中不需要建立大范围的回归测试,不用担心测试破坏系统其他功能。因此,微服务组成的系统应用具备一系列可并行的发布流程,使得开发、测试、部署更加高效,同时降低了因系统变更给生产环境造成的风险。

3)技术选型灵活

微服务架构下系统应用的技术选型是去中心化的,每个开发团队可根据自身应用的业务需求发展状况选择合适的体系架构与技术,从而更方便地根据实际业务情况获得系统应用最佳解决方案,并且每个微服务功能单一、结构简单,在架构转型或技术栈升级时面临较低风险,因此系统应用不会被长期限制在某个体系架构或技术栈上。

4)容错

在传统单体应用架构下,当某一模块发生故障时,该故障极有可能在整个应用内扩散,造成全局应用系统瘫痪。然而,在微服务架构下,由于各个微服务相互独立,故障会被隔离在单个服务中,并且系统其他微服务可通过重试、平稳退化等机制实现应用层的容错,从而提高系统应用的容错性。微服务架构良好的容错机制可避免出现单个服务故障导致整个系统瘫痪的情况。

5)松耦合,易扩展

传统单体应用架构通过将整个应用完整地复制到不同节点,从而实现横向扩展。但当系统应用的不同组件在扩展需求上存在差异时,会导致系统应用的水平扩展成本很高。微服务架构中每个服务之间都是松耦合的,可以根据实际需求实现独立扩展,体现微服务架构的灵活性。

2.微服务架构模式方案

微服务是一种软件架构演变后的新型架构风格,是系统应用开发的一种设计思想,没有固定开发模式。开发团队可根据企业实际业务场景进行架构设计,体现了微服务架构的灵活性。常见的微服务设计模式有聚合器微服务设计模式、代理微服务设计模式、链式微服务设计模式、分支微服务设计模式、数据共享微服务设计模式、异步消息传递微服务设计模式等。

1)聚合器微服务

在聚合器微服务中,聚合器调用多个微服务实现系统应用程序所需功能,具体有两种形式,一种是将检索到的数据信息进行处理并直接展示;另一种是对获取到的数据信息增加业务逻辑处理后,再进一步发布成一个新的微服务作为一个更高层次的组合微服务,相当于从服务消费者转换成服务提供者。与普通微服务特性相同,聚合器微服务也有自己的缓存和数据库。作为聚合器模式的一个变种,在代理微服务器中,客户端并不聚合数据,只会根据实际业务需求差别选择调用具有不同功能的微服务,代理微服务器仅进行委派请求和数据转换工作。同样地,代理微服务器也有自己独立的缓存和数据库。分支微服务器模式是聚合器微服务模式的一种扩展,在分支微服务器模式下,客户端或服务允许同时调用两个不同的微服务链。两个微服务调用链相互独立,互不影响。

2)链式微服务

客户端或服务在收到请求后,会返回一个经过合并处理的响应,该模式即为链式微服务设计模式。例如,服务A收到请求后会与服务B建立通信,服务B收到请求后会与服务C建立通信,依次往下游发送请求,并对结果进行合并处理后作为请求响应返回上游服务调用者。显然,该模式下的所有服务调用都采用同步消息传递方式,在一条完整的服务链调用完成之前,客户端或调用服务会一直阻塞。因此,在使用该模式过程中,服务调用链不宜过长,以避免客户端处于长时间等待状态。

3)数据共享微服务

运用微服务架构重构现有单体架构应用时,SQL数据库反规范化可能会导致数据重复与不致现象。按照微服务的自治设计原则,在单体架构应用到微服务架构的过渡阶段,可以使用数据共享微服务设计模式。在该模式下,当服务之间存在强耦合关系时,可能存在多个微服务共享缓存与数据库存储的现象。

4)异步消息传递微服务

目前流行开发RESTful风格的API,REST使用HTTP协议控制资源,并通过URL加以实现。REST提供了一系列架构系统参数作为整体使用,强调组件的独立部署、组件交五的扩展性,以及接口的通用性,并且尽量减少产生交五延迟的中间件数量。但是REST设计模式是同步的,容易造成阻塞,从而耗费大量时间。消息队列将消息写入一个消息队列中,实现业务逻辑以异步方式运行,从而加快系统响应速度。因此,对于一些不必要以同步方式运行的业务逻辑,可以使用消息队列代替REST实现请求、响应,加快服务调用的响应速度。但该模式可能会降低系统可用性,并增加系统复杂性,因而在使用过程中,要做好消息队列的选型。常用消息队列有ActiveMQ、RabbitMQ、RocketMQ、Kafka等。

3.微服务架构面临的问题与挑战

微服务架构在规模较大的应用中具有明显优势,但其优势也是有代价的,微服务架构也会给人们带来新的问题和挑战。其中一个主要缺点是微服务架构分布式特点带来的复杂性,开发过程中,需要基于RPC或消息实现微服务之间的调用与通信,使服务发现与服务调用链跟踪变得困难。另一个挑战是微服务架构的分区数据库体系,不同服务拥有不同数据库。

受限于CAP原理约束以及NoSQL数据库的高扩展性,使人们不得不放弃传统数据库的强一致性,转而追求最终一致性,因此对开发人员出了更高要求。微服务架构给系统测试也带来了很大挑战,微服务架构可能涉及多个服务,传统的单体Web应用只需测试单一API即可,然而对于微服务架构测试,需要启动其依赖的所有服务,该复杂性不可低估。在大规模应用部署中,在监控、管理、分发及扩容等方面,微服务也存在着巨大挑战。

因此,对于微服务架构的取舍,要考虑企业开发团队规模、业务需求变化以及系统用户群体规模等诸多因素。使用微服务架构主要是为了降低应用程序开发、维护等方面的复杂性,如果系统程序架构已无法再扩展,或数据库增长速度过快,并且整个团队(包括产品、设计、研发、测试、运维)都具备微服务思维,采用微服务架构的收益会大于成本。但如果系统现有程序架构还能很好地工作,不需要有太大改动,采用微服务架构则不会有太多收益。综上所述,尽管微服务架构有很多优势,但在使用微服务架构之前要结合系统自身特点,综合评估后再决定是否采用微服务架构。

整理不易动动你发财的小手点个“在看”哦!

您的支持是我坚持的动力,谢谢

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OVWJLxr0mlVuKIXWVq5rlOIQ0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券