微服务通信协议与工具详解
微服务之间通过两种主要模式交换消息:同步模式通过直接 HTTP 请求调用其他服务的端点,异步模式通过 Kafka 或 RabbitMQ 等消息代理。同步模式下,发送方等待响应,知道接收方的 URL 和端点;异步模式使用主题存储消息,无需直接交互。
同步模式适合请求-响应场景,异步模式则在事件驱动场景中大放异彩,那里可靠投递比速度更重要。
同步 HTTP 客户端
直接调用时,有几款工具脱颖而出:
- RestTemplate:阻塞式客户端,简单但已过时,新项目不推荐,因为会阻塞线程。
- WebClient:基于 Project Reactor 的响应式、非阻塞客户端,适合高吞吐量系统,支持异步处理。
- Feign Client:声明式开发——只需定义带注解的接口,Spring 自动生成 HTTP 客户端实现。支持同步调用和缓存,减少样板代码。
Feign 使用起来很简单:只需在接口上加 @GetMapping 或 @PostMapping 注解即可。WebClient 在吞吐量上更胜一筹,得益于非阻塞 I/O。
WebClient 响应式编程
Project Reactor 的响应式编程使用 Mono(单个值)和 Flux(值流)。与传统异步的主要区别:
- 支持随时间变化的数据流,并带有背压机制:消费者向生产者发出就绪信号。
- 声明式操作符如 map、filter、flatMap 和 buffer,用于数据转换。
- 惰性求值:仅在订阅时才执行操作。
从仓库处理用户数据的示例:
Flux<User> users = userRepository.findAll();
Flux<String> names = users
.filter(u -> u.getAge() > 18)
.map(User::getName)
.take(10);
names.subscribe(name -> {
System.out.println("Received name: " + name);
});
这里,数据库查询仅在 .subscribe() 时启动。Reactor 与 Spring WebFlux 无缝集成,适用于响应式 Web 应用。高负载或流式数据用它,简单 CRUD 则用同步工具。
WebSocket:事件驱动通信
WebSocket 建立持久连接,实现双向事件交换,无需反复请求。没有请求-响应周期:服务通过开放通道推送消息。
特别适合:
- 聊天和实时通知。
- 游戏和股票行情即时更新。
- 时序数据流,无需轮询。
缺点:连接断开时无投递保证。追求速度,而非铁板钉钉的可靠性。
Kafka:异步消息代理
Kafka 是一个分布式事件存储与流式处理系统。生产者向主题(分区日志)发送消息,消费者从分区读取。
投递保证:
- 至少一次:消息至少到达一次(提交失败可能有重复)。
- 精确一次:通过幂等生产者和事务实现。
幂等性确保重复请求产生相同结果。代理复制防止数据丢失。分区内按键(如用户 ID)保持顺序。
消费者组分担负载:多个消费者并行处理分区。
Kafka 典型场景:
- 异步事件,如邮件发送、数据分析或奖金计算。
- 重放历史记录用于重新计算。
- 流处理(Kafka Streams、数据库 CDC)。
缺点:集群配置复杂(KRaft 比 ZooKeeper 简化了),延迟高于 HTTP。
核心要点
- 简单同步调用选 Feign,代码最少。
- 高负载响应式系统用 WebClient,搭配 Flux/Mono。
- 实时双向通信选 WebSocket,无投递保证。
- 可靠异步事件驱动用 Kafka,支持完整历史。
- 混合使用:CRUD 用同步,事件用异步。
— Editorial Team
暂无评论。