微服务及其设计模式


微服务是一种架构风格,用于开发作为单独服务运行的软件应用程序,这些服务通过以下方式相互通信

  1. 使用 API 调用的同步通信
  2. 通过发布和订阅/基于事件的机制进行异步通信——即使用消息队列

这些微服务具有以下属性
  • 可独立部署
  • 高度可扩展的负载
  • 可以使用多种编程语言进行开发——即多语言
  • 松耦合
  • 围绕业务领域组织
  • 由小型独立团队拥有
  • 高度可维护和可测试
  • 通过自动化 CICD 管道持续交付和更快的上市时间
  • 故障恢复能力

使用微服务架构,我们可以实现大型复杂应用程序的快速开发和交付,即上市时间

在传统的单体架构中,整个应用程序紧密耦合到单个代码库中,使其紧密耦合。在连接到单个数据库的单个代码库中,将有不同的层,如表示、业务逻辑和数据库持久性。这个应用程序构建为一个单一的 fat jar,其中包含类文件和运行它所需的所有依赖项。

虽然 单体应用程序非常容易构建、测试和部署,但它面临着各种挑战,如紧耦合和可扩展性。单个模块不能在负载上单独缩放,因此我们需要使用称为垂直缩放的技术再次缩放整个应用程序。单体应用程序也是单点故障。

2009 年,Netflix 面临着许多基础设施问题,因为它无法跟上对其快速增长的视频流服务的需求。从那时起,Netflix 决定将其基础设施从其私有数据中心迁移到 AWS 云,并将其单体架构替换为微服务架构。他们是从单体架构过渡到微服务架构的早期先驱。他们甚至开源了自己用于构建微服务的框架和工具,这些框架和工具被称为Netflix OSS Stack,后来更名 为Spring Cloud Netflix。

微服务架构是现代应用程序开发方法,由基于域开发的较小的运行服务组成。这些服务有自己的数据库或模式,并且只包含相关的域数据。

微服务是独立的、松散耦合的,并遵循分布式系统架构,其中每个服务都承担单一职责。这种类型的架构将面临很多挑战,包括通信故障、分布式事务回滚、外部化配置、集中式日志记录等。

这些设计挑战以称为微服务设计模式的解决方案的形式得到解决。如下图所示,微服务有很多设计模式。如果能够接触到所有重要的模式,对于设计微服务架构将非常有帮助。
微服务设计模式通常可以分为以下类型

  1. 分解模式
  2. 集成模式
  3. 数据库设计模式
  4. 可观察性设计模式
  5. 横切设计模式

1. 分解模式
如果我们需要将单体应用程序分解为更小的微服务,分解模式非常有用。这些模式提供了有关如何进行逻辑分解的建议。这些模式有不同类型,而了解该地区的重要模式。

  • 按业务能力分解
  • 按子域分解
  • 按 Strangler 模式分解

2. 集成设计模式
集成设计模式用于处理不同微服务之间的通信,以及如何在保持高性能的同时获取跨服务的响应并将其发送给客户端。重要的集成模式是

  • API网关模式
  • 聚合器模式
  • 代理模式
  • 链式微服务模式

3. 数据库设计模式
数据库设计模式帮助我们为微服务架构设计数据库,例如为每个微服务使用单个共享数据库或单独的数据库,为读写操作使用单独的数据库,跨微服务进行分布式事务管理等。以下这些数据库设计模式非常重要,因为设计数据库可以成就或破坏应用程序

  • 每个服务模式的数据库
  • 每个服务共享数据库模式
  • 命令和查询责任分离 (CQRS) 模式
  • 事件溯源
  • Saga模式

4. 可观察性模式
可观察性模式对于设计用于适当监控和遥测的微服务非常关键,即集中式日志记录、分布式跟踪、性能指标、微服务实例的健康检查等。重要的模式是

  • 日志聚合模式
  • 性能指标
  • 分布式追踪
  • 健康检查

5. 横切关注点设计模式
Cross Cutting 模式用于处理微服务如何相互发现、如何外部化微服务配置、如何使用断路器处理服务故障以及如何部署微服务。重要的模式是

  • 外部配置模式
  • 服务发现模式
  • 断路器模式
  • 蓝绿部署模式