为什么需要事件驱动型微服务
事件驱动型微服务就是在微服务架构中使用事件驱动思想。事件驱动系统的核心结构是事件的捕获、通信、处理和持久化,事件驱动架构的系统可以实现最小耦合,在现代分布式程序架构中尤为有用。
本文从如何在微服务架构中解耦微服务出发,介绍事件驱动型微服务。
微服务架构的特征和挑战
在 2014 年 Martin Flower 和 James Lewis 合写的文章《MicroServices》定义了微服务架构风格。 在该文章中概括了"微服务架构"术语的含义:微服务架构风格是一种通过多个小型微服务组合来构建一个应用的架构风格,这些服务围绕业务能力而非特定的技术构建。每个服务可以采用不同的语言、数据存储技术在独立的进程中运行、自动化部署和运维。 服务间通过轻量级的机制通信。 并且列举了微服务架构应该具备的九大特征:
- 以微服务而不是类库的方式实现程序组件化
- 围绕业务范围搭建团队
- 产品化思维
- 强终端弱管道
- 分散治理
- 数据去中心化
- 基础设施自动化
- 容错性设计
- 演进式设计
微服务架构将应用系统以业务能力拆分为多个高度自治的微服务,降低耦合的同时也带来了一些分布式数据管理的挑战:
- 如何识别每个微服务的边界?
- 如何从多个微服务中检索数据?
- 如何在多个微服务之间保持数据的一致性?
- 如何设计跨微服务边界的通信?
单体应用架构的编程思维不适用于微服务架构上,若将原有的编程思维生搬硬套应用在微服务架构中会带来一些问题。如:在单体应用上不同组件之间通过引用进行方法调用。在微服务世界中,服务间通信必须设计一种通信机制, 传统编程思维设计的通信机制一般是 RPC 或者基于 HTTP 的 REST,它们的优点是简单、没有学习成本;缺点都是同步阻塞的请求,并且跨网络进行通信,因此当部分组件发生故障时会引发服务"雪崩",所有依赖于此组件的服务全部不可用。
因此基于同步调用的服务间的微服务存在以下问题:
- 代码层面存在耦合
- 同步调用的通信机制在分布式系统中不可靠
那么为了解决该问题,可以在微服务架构中使用异步、松耦合的事件驱动架构。