Keynote 原件地址

帮助架构师使用微服务构建应用程序的一组模式

模式应用过程

1. 需求分析

  1. 确定必须要解决的问题
  2. 并按优先级进行排序

注意:并不是所有需求都必须要解决,可能有些需求之间是有冲突的,此时优先解决高优先级的需求

2. 候选模式

根据需求分析结果,结合各个模式所适用的上下文场景,选择合适的模式。作为进一步评估的候选项。

软件模式:通过定义一组互相协作的软件元素来解决软件架构或设计问题

3. 评估结果

对候选模式进行评估:

  • 好处:这个模式的好处和它解决了什么需求
  • 弊端:这个模式的弊端和它没有解决哪些需求
  • 问题:使用这个模式所引入的新问题

4. 确定模式

结合评估结果和模式关系,确定最终(一组)模式

模式关系:

  1. 前导:催生当前模式需求的模式
  2. 后续:解决当前模式引入的新问题的模式
  3. 替代:当前模式的替代模式
  4. 泛化:针对某个问题的一般性解决方案
  5. 特化:针对特定模式的具体解决方案

微服务架构设计模式

如何拆分服务?

拆分方法:

  1. 识别系统操作
  2. 根据业务能力/子域进行服务拆分
  3. 定义服务API

根据业务能力进行服务拆分

  • 描述:定义与业务能力相对应的服务
  • 业务能力:能够为公司产生价值的商业活动

根据子域进行服务拆分

  • 描述:根据DDD的子域设计服务

服务间如何进行通信?

同步远程过程调用模式

  • 通信方式:REST、gRPC
  • 配套设施:断路器,服务发现

异步消息模式

  • 通信方式:点对点、发布订阅
  • 配套设施:消息代理
  • 弊端:需要保障顺序;处理重复消息、事务

如何管理事务?

分布式事务

  • 描述:基于二阶段提交的XA
  • 弊端:不支持NoSQL,降低可用性

Saga事务

  • 描述:通过使用异步消息来协调本地事务
  • 弊端:缺少默认隔离性,需要额外实现。例如:语义锁、交换式更新、悲观视图、重读值、版本文件、业务风险评级

如何组织业务逻辑?

事务脚本模式

  • 描述:将业务逻辑组织为面向过程的事务脚本的集合,每种类型的请求都有一个脚本
  • 弊端:仅适用于简单的业务逻辑

领域模型模式

  • 描述:将业务逻辑组织为由具有状态和行为的类构成的对象模型
  • 弊端:适用较复杂业务;高复杂业务需要借助DDD

如何持久化数据?

传统持久化

  • 描述:将类与数据表进行映射
  • 弊端:类模型与表模型不匹配、缺乏历史、审计繁琐、不支持发布领域事件

事件溯源

  • 描述:使用一系列表示状态改变的领域事件来持久化聚合
  • 弊端:实现复杂,学习难度高
  • 前导模式:DDD中的领域事件

如何查询数据?

API组合

  • 描述:查询每个服务的API并组合结果
  • 弊端:额外开销,降低可用性,缺少事务

CQRS

  • 描述:适用事件来维护多个服务复制数据的只读视图
  • 弊端:架构复杂、数据复制导致延迟
  • 前导模式:事件溯源

如何对外提供服务?

API网关

  • 描述:针对API的外观模式。提供路由、API组合、协议转换、专用API、边缘功能(身份认证、访问授权、速率限制、缓存、指标收集、请求日志)
  • 弊端:可能成为瓶颈

如何部署服务?

编程语言特定的发布包格式

  • 描述:例如Java中的Jar、War

虚拟机

  • 描述:作为虚拟机镜像部署

容器

  • 描述:作为容器镜像部署,例如:Docker

Serverless

  • 描述:使用公共云提供的Serverless部署

如何进行测试?

消费者驱动的契约测试

  • 描述:验证服务是否满足它的消费者的期望

如何保障非功能性约束?

安全性

  • 描述:基于安全令牌实现安全性

可配置性

  • 描述:基于推送/拉取实现可配置性

可观测性

  • 描述:基于健康检查API日志聚合、分布式跟踪、异常跟踪、应用程序指标、审核日志记录实现可观测性

如何将单体重构为微服务?

绞杀者应用

  • 描述:在遗留系统周围逐步开发新的(绞杀)应用