Skip to content

Spring Kafka

INFO

Spring for Apache Kafka(以下简称 Spring Kafka)是 Spring 官方对 Kafka Java 客户端的进一步封装, 通过 模板模式KafkaTemplate)与 声明式监听器 (@KafkaListener) 简化了消息的发送与消费流程, 尤其适合在 微服务事件驱动 架构中快速落地 Kafka。

TIP

如果项目已使用 Spring Boot,只需引入 spring-kafka 依赖即可自动获得 KafkaTemplate 与监听容器的 自动配置,无需手动编写大量样板代码。

典型业务场景

场景传统痛点Spring Kafka 解决方案
订单异步处理订单模块和库存模块强耦合,存在性能瓶颈使用 Kafka 作为事件总线,订单模块发布事件,库存模块订阅事件,解耦并提升吞吐量
日志收集多服务分散写文件,集中解析困难利用 Kafka 汇聚日志,通过 Spring Kafka 提供统一的日志 Producer 模板
用户行为埋点高并发写入,业务代码中操作 Kafka 复杂通过 KafkaTemplate 一行代码发送埋点事件,监听器异步消费并统一入库

消息流转时序图

基本代码示例

kotlin
/*
 * 使用 Spring Kafka 发送和消费 “OrderCreated” 事件的最小示例
 */
@Service
class OrderEventService(
    private val kafkaTemplate: KafkaTemplate<String, String>
) {

    /**
     * 发布订单创建事件
     */
    fun publish(orderId: Long) {
        val payload = """{"orderId":$orderId,"status":"CREATED"}"""
        kafkaTemplate.send("order-topic", payload) // 发送消息
    }

    /**
     * 监听并处理订单创建事件
     */
    @KafkaListener(topics = ["order-topic"], groupId = "stock-service")
    fun onMessage(message: String) {
        // 反序列化并冻结库存
        println("收到订单事件: $message")
    }
}
java
// 仅供对比,可跳过
@Service
public class OrderEventService {

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    public void publish(Long orderId) {
        String payload = "{\"orderId\":" + orderId + ",\"status\":\"CREATED\"}";
        kafkaTemplate.send("order-topic", payload);
    }

    @KafkaListener(topics = "order-topic", groupId = "stock-service")
    public void onMessage(String message) {
        System.out.println("收到订单事件: " + message);
    }
}

IMPORTANT

生产环境中务必配置 幂等性事务enable.idempotence=truetransactional.id=), 并使用 DLT(死信主题) 处理异常消息,避免数据丢失。

小结

  • Spring Kafka 通过模板和注解屏蔽了 Kafka 原生 API 的复杂性,使开发者聚焦业务逻辑。
  • 结合 Spring Boot 可以实现 “开箱即用”,极大提升开发效率。
  • 适用于高并发、解耦、异步场景,是构建事件驱动架构的重要基础设施。