微服务间的通信
已发行
本章内容概览:
- 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.3 HTTP 通信的优缺点
优点:
- 简单易理解和实现
- 请求 - 响应模式清晰
- 可以立即获得结果
- 调试方便
缺点:
- 服务间产生直接依赖
- 调用方必须等待响应
- 可能导致级联失败
- 多次 HTTP 调用增加延迟
5.4 消息队列通信
5.4.1 核心概念
- 消息(Message):要传递的数据
- 队列(Queue):存储消息的缓冲区
- 生产者(Producer):发送消息的服务
- 消费者(Consumer):接收消息的服务
- 交换机(Exchange):接收消息并路由到队列
5.4.2 RabbitMQ 简介
开源消息代理,实现 AMQP 协议。
优势:
- 成熟稳定,经过大量生产验证
- 灵活的路由模式
- 可靠性高,支持消息持久化
- 多语言支持
- 易于容器化部署
5.4.3 工作模式
- 直接模式:路由到与路由键完全匹配的队列
- 主题模式:路由到与路由键模式匹配的队列
- 扇出模式:路由到所有绑定的队列
- 头部模式:根据消息头部属性路由

5.5 消息队列的优缺点
优点:
- 服务间不直接依赖
- 不需要立即响应
- 消费者可按自己节奏处理
- 可轻松添加更多消费者
- 消息持久化防止数据丢失
- 可轻松实现重试机制
缺点:
- 系统更复杂
- 消息流难以追踪
- 非实时处理
- 最终一致性而非强一致性
- 需要维护消息队列
5.6 选择合适的通信模式
5.6.1 使用 HTTP 的场景
- 需要实时响应
- 简单的请求 - 响应场景
- 读取操作(查询)
- 服务数量较少
- 需要同步等待结果
5.6.2 使用消息队列的场景
- 不需要立即响应
- 事件驱动场景
- 写操作(命令)
- 需要解耦服务
- 需要广播消息
- 需要保证消息可靠性
- 处理时间变化大
5.6.3 混合模式
实际应用中混合使用:
- 查询:使用 HTTP REST API
- 命令:使用消息队列
- 事件通知:使用消息队列

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 集群。