【架构学习】微服务架构模式的分析

215 阅读7分钟

「这是我参与2022首次更文挑战的第41天,活动详情查看:2022首次更文挑战

微服务架构模式

微服务架构正在业界迅速普及,她是单个应用的代替品,特点是面向服务. 微服务架构还在发展中,这次只是提及关键的概念.

模式描述

不论是何种拓扑何种实现,有几个概念是通用的.

独立部署单元,第一个概念. 微服务的每个组件都是一个独立的部署单元, 简化交付,高可伸缩性,高级别应用,组件松耦合,都是其特点.

服务组件是最核心的概念.组件可以大到一个程序, 可以小到一个模块,颗粒度很自由. 服务组件可以包含一个或多个模块,模块可以是单个功能函数, 也可以是大型业务程序中的一部分.

服务组件的颗粒度是微服务设计架构的挑战问题, 近期的说法是尽量小且独立.

分布式架构是另一个概念.意味着服务组件的松耦合, 意味着可扩展性和某些部署特性.

微服务架构是从问题演变而来,不是先有解决方案后有问题. 微服务架构来至两方面:单应用使用分层架构模式; 分布式程序使用面向服务的架构模式.

单应用到微服务是cd(持续交付)的促进, 单应用普遍是紧凑的,单个部署单元, 变更/测试/部署麻烦且困难,"月级部署"就是说的这种窘境. 这些因素会导致脆弱的程序,每次部署一些新东西都可能中断. 微服务通过将程序分为多个部署单元来解决这个问题, 额外的好处是开发/测试/部署独立.

面向服务的架构 service-oriented architecture pattern(SOA), soa提供了强大的抽象/异构连接/服务编排/并承诺业务目标和it能力一致, 除了这些,还有复杂/昂贵/无处不在/难以理解和实现, 多大多数程序来说,体量过大了. 微服务针对问题,简化了很多,具体是提出了服务的概念, 消除了服务编排需求,简化了服务组件的连接和访问.

服务拓扑

微服务的实现方式有几十种,有3种拓扑是最常见也是最受欢迎的:

  • 基于rest api的拓扑
  • 基于rest 应用的拓扑
  • 集中式消息拓扑

rest api拓扑,非常适合网站站点,尤其是站点需要暴露的服务是较小, 且自包含时,在微服务架构模式中,将组件都称为微服务.

在rest api拓扑下,微服务(就是组件)的颗粒度都非常小, 一个微服务包含1-2个模块(模块会执行指定的业务功能, 且模块和剩下的服务是独立的).细颗粒度非常适合基于rest. 要访问微服务,需要通过基于web的api层.

rest api拓扑和rest 程序拓扑的区别在于通过何种方式接收客户端请求: 一个是通过简单的api层;一个是通过传统的基于web/胖客户端的业务程序, 英文是user-interface layer,也就是用户交互层.

用户交互层是作为一个独立的web程序去部署的,用户交互层会访问微服务, 方式也是基于rest的.

rest api拓扑和rest 程序拓扑中的微服务(组件)也是有区别的: api拓扑中的微服务趋向于细颗粒度,一个微服务表示的是一个动作; rest 程序拓扑的微服务趋向于粗颗粒度,更多的是代表业务程序中的一个小部分. rest 程序拓扑适合中小型程序,且程序的复杂度不高的那种.

最后一种拓扑是集中式消息拓扑.相比前两种拓扑,集中式消息拓扑更小, 没有使用rest来访问微服务,而是更加轻量级的集中式消息协调者. 不能将集中式消息拓扑和"面向服务的架构"/"阉割版soa"混淆.

集中式消息拓扑的客户端请求先到用户交互层,再到轻量级的消息协调者, 最后到微服务.

集中式消息拓扑内的消息协调者并不执行编排/转换/复杂路由, 她只做传输,客户端的请求到远端微服务的传输.

大型程序,或程序对"用户交互层到微服务的传输"需要更复杂的控制时, 多使用集中式消息拓扑.相比基于rest,集中式消息拓扑的优势如下: 消息队列机制/异步消息的传递和监控/错误处理/更好的负载均衡和可伸缩性. 缺点也有的,单点故障和架构瓶颈问题均涉及消息协调者, 这点可通过将消息协调者部署为集群来解决.(按系统功能将协调者拆为多个).

避免依赖和服务编排

微服务架构模式第一个挑战就是组件(微服务)颗粒度的划分. 颗粒度太粗不会体现出微服务架构的优势(部署/可伸缩/测试性/松耦合). 颗粒度太细就需要服务编排,服务编排的出现意味微服务架构 正在向重型面向服务的架构转变,慢慢soa的特征就出现了: 复杂/混乱/昂贵/无处不在.

如果在用户交互层或web api层需要用到服务编排,说明颗粒度小了; 如果在一个请求中,需要处理服务间的交互,说明颗粒度大了, 或者说明从业务功能的角度看,没有划分正确.

服务间的交互,会导致耦合性,通过共享数据库可解耦. eg:处理订单的微服务可以去数据库获取用户信息,而不是去掉用户服务.

共享数据库是推荐的,那么共享功能呢? dry: don't repeat yourself.微服务架构中,对于公用功能,推荐拷贝, 共享不适合微服务架构.为了独立部署,少量的冗余是可接受的.

如果最终还是发现无法避免服务编排,说明架构模式没有选择正确. 分布式导致在跨微服务的情况下,很难维护事务. 如果使用某种事务补偿框架来回滚事务,那就让简单优雅的微服务架构变得 非常复杂了.

注意事项

微服务架构模式解决了单体应用和面向服务架构的很多问题. 程序被拆分成小片,单独部署,更强的健壮性,更高的可伸缩性, 对持续交付的天然支持.

微服务架构模式解决的另一个领域是部署. 组件独立表示隔离,隔离意味易部署,意味整体灵活性. 单体程序的更新部署意味热部署,微服务则可在部署周期内可实时部署.

微服务架构是分布式架构,分布式架构的坑一个也没落下: 约定的创建和维护;远端系统可用性;远程身份认证和授权.

架构模式分析

具体可查看附录

整体灵活性

高,组件独立,变更不会影响其他组件.松耦合就是灵活性高.

部署难度

低,和微服务的颗粒度有关.

可测试性

高,拆分的更小,更易于测试.

性能

低,微服务架构是分布式架构,特征中没有高性能.

可伸缩性

高,每个组件都可单独部署,单独扩展.

开发难度

低,组件独立,功能隔离,每个组件的功能和范围都很小, 开发难度低.单个组件的修改不会影响其他组件.