微服务间的通信

已发行

本章内容概览:

  • HTTP 直接通信
  • RabbitMQ 异步消息传递
  • 同步与异步通信对比
  • 消息队列最佳实践

微服务之间的通信是构建完整应用的关键。

5.1 通信模式

5.1.1 同步通信

发送方发送请求后等待响应。

特点:

  • 简单直观
  • 调用方必须等待响应
  • 适合请求 - 响应模式
  • 可能导致级联失败

HTTP REST 是最常见的同步通信方式。

5.1.2 异步通信

发送方发送消息后不需要立即等待响应。

特点:

  • 解耦发送方和接收方
  • 提高系统弹性
  • 支持事件驱动架构
  • 需要处理消息可靠性

消息队列(如 RabbitMQ)是实现异步通信的常用工具。

5.2 HTTP 直接通信

5.2.1 RESTful API 设计原则

  • 资源导向:使用名词而非动词(如 /users
  • 统一接口:使用标准 HTTP 方法(GET、POST、PUT、DELETE)
  • 无状态:每个请求包含所有必要信息
  • 分层系统:客户端不需要知道是否直接连接到服务器

5.2.2 HTTP 客户端实现

使用 fetch:

const response = await fetch('http://video-storage:4001/videos');
const videos = await response.json();

使用 Axios:

const response = await axios.get('http://video-storage:4001/videos');
const videos = response.data;

5.2.3 服务发现

环境变量方式(推荐):

const videoStorageUrl = process.env.VIDEO_STORAGE_URL || 'http://video-storage:4001';
图 5.1 微服务间的 HTTP 直接通信
图 5.1 微服务间的 HTTP 直接通信

5.3 HTTP 通信的优缺点

优点:

  • 简单易理解和实现
  • 请求 - 响应模式清晰
  • 可以立即获得结果
  • 调试方便

缺点:

  • 服务间产生直接依赖
  • 调用方必须等待响应
  • 可能导致级联失败
  • 多次 HTTP 调用增加延迟

5.4 消息队列通信

5.4.1 核心概念

  • 消息(Message):要传递的数据
  • 队列(Queue):存储消息的缓冲区
  • 生产者(Producer):发送消息的服务
  • 消费者(Consumer):接收消息的服务
  • 交换机(Exchange):接收消息并路由到队列

5.4.2 RabbitMQ 简介

开源消息代理,实现 AMQP 协议。

优势:

  • 成熟稳定,经过大量生产验证
  • 灵活的路由模式
  • 可靠性高,支持消息持久化
  • 多语言支持
  • 易于容器化部署

5.4.3 工作模式

  • 直接模式:路由到与路由键完全匹配的队列
  • 主题模式:路由到与路由键模式匹配的队列
  • 扇出模式:路由到所有绑定的队列
  • 头部模式:根据消息头部属性路由
图 5.2 使用 RabbitMQ 的异步消息传递
图 5.2 使用 RabbitMQ 的异步消息传递

5.5 消息队列的优缺点

优点:

  • 服务间不直接依赖
  • 不需要立即响应
  • 消费者可按自己节奏处理
  • 可轻松添加更多消费者
  • 消息持久化防止数据丢失
  • 可轻松实现重试机制

缺点:

  • 系统更复杂
  • 消息流难以追踪
  • 非实时处理
  • 最终一致性而非强一致性
  • 需要维护消息队列

5.6 选择合适的通信模式

5.6.1 使用 HTTP 的场景

  • 需要实时响应
  • 简单的请求 - 响应场景
  • 读取操作(查询)
  • 服务数量较少
  • 需要同步等待结果

5.6.2 使用消息队列的场景

  • 不需要立即响应
  • 事件驱动场景
  • 写操作(命令)
  • 需要解耦服务
  • 需要广播消息
  • 需要保证消息可靠性
  • 处理时间变化大

5.6.3 混合模式

实际应用中混合使用:

  • 查询:使用 HTTP REST API
  • 命令:使用消息队列
  • 事件通知:使用消息队列
图 5.3 混合使用 HTTP 和消息队列
图 5.3 混合使用 HTTP 和消息队列

5.7 在 Docker Compose 中使用 RabbitMQ

services:
  rabbitmq:
    image: rabbitmq:3-management
    ports:
      - "5672:5672"   # AMQP 端口
      - "15672:15672" # 管理界面端口
    environment:
      - RABBITMQ_DEFAULT_USER=admin
      - RABBITMQ_DEFAULT_PASS=admin

  video-upload:
    environment:
      - RABBITMQ_URL=amqp://admin:admin@rabbitmq:5672
    depends_on:
      - rabbitmq

访问 http://localhost:15672 查看管理界面(admin/admin)。

总结

  • 微服务通信主要有两种模式:同步(HTTP)和异步(消息队列)
  • HTTP REST 简单直接,适合请求 - 响应场景
  • 消息队列解耦服务、提高弹性,适合事件驱动场景
  • RabbitMQ 是成熟的消息代理,支持多种路由模式
  • 实际应用中通常混合使用两种模式
  • 查询操作用 HTTP,命令操作用消息队列

下一章学习部署微服务到 Kubernetes 集群。

创建于 2026/01/06 更新于 2026/01/06 1210 字 阅读约 3 分钟

提交勘误/建议