返回首页

微服务通信工具 Kafka Feign

本文详解微服务交互工具:同步 HTTP 客户端 WebClient 和 Feign、实时 WebSocket、异步 Kafka 代理。描述 Reactor 响应式、交付保证、Flux 代码示例。根据负载和场景的选用推荐。

微服务如何通信:Kafka vs Feign vs WebClient
Advertisement 728x90

微服务通信协议与工具详解

微服务之间通过两种主要模式交换消息:同步模式通过直接 HTTP 请求调用其他服务的端点,异步模式通过 Kafka 或 RabbitMQ 等消息代理。同步模式下,发送方等待响应,知道接收方的 URL 和端点;异步模式使用主题存储消息,无需直接交互。

同步模式适合请求-响应场景,异步模式则在事件驱动场景中大放异彩,那里可靠投递比速度更重要。

同步 HTTP 客户端

直接调用时,有几款工具脱颖而出:

Google AdInline article slot
  • RestTemplate:阻塞式客户端,简单但已过时,新项目不推荐,因为会阻塞线程。
  • WebClient:基于 Project Reactor 的响应式、非阻塞客户端,适合高吞吐量系统,支持异步处理。
  • Feign Client:声明式开发——只需定义带注解的接口,Spring 自动生成 HTTP 客户端实现。支持同步调用和缓存,减少样板代码。

Feign 使用起来很简单:只需在接口上加 @GetMapping 或 @PostMapping 注解即可。WebClient 在吞吐量上更胜一筹,得益于非阻塞 I/O。

WebClient 响应式编程

Project Reactor 的响应式编程使用 Mono(单个值)和 Flux(值流)。与传统异步的主要区别:

  • 支持随时间变化的数据流,并带有背压机制:消费者向生产者发出就绪信号。
  • 声明式操作符如 map、filter、flatMap 和 buffer,用于数据转换。
  • 惰性求值:仅在订阅时才执行操作。

从仓库处理用户数据的示例:

Google AdInline article slot
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 建立持久连接,实现双向事件交换,无需反复请求。没有请求-响应周期:服务通过开放通道推送消息。

特别适合:

Google AdInline article slot
  • 聊天和实时通知。
  • 游戏和股票行情即时更新。
  • 时序数据流,无需轮询。

缺点:连接断开时无投递保证。追求速度,而非铁板钉钉的可靠性。

Kafka:异步消息代理

Kafka 是一个分布式事件存储与流式处理系统。生产者向主题(分区日志)发送消息,消费者从分区读取。

投递保证:

  • 至少一次:消息至少到达一次(提交失败可能有重复)。
  • 精确一次:通过幂等生产者和事务实现。

幂等性确保重复请求产生相同结果。代理复制防止数据丢失。分区内按键(如用户 ID)保持顺序。

消费者组分担负载:多个消费者并行处理分区。

Kafka 典型场景:

  • 异步事件,如邮件发送、数据分析或奖金计算。
  • 重放历史记录用于重新计算。
  • 流处理(Kafka Streams、数据库 CDC)。

缺点:集群配置复杂(KRaft 比 ZooKeeper 简化了),延迟高于 HTTP。

核心要点

  • 简单同步调用选 Feign,代码最少。
  • 高负载响应式系统用 WebClient,搭配 Flux/Mono。
  • 实时双向通信选 WebSocket,无投递保证。
  • 可靠异步事件驱动用 Kafka,支持完整历史。
  • 混合使用:CRUD 用同步,事件用异步。

— Editorial Team

Advertisement 728x90

继续阅读