Spring Boot集成Kafka完整版

Spring Boot集成Kafka完整版

一、为什么选择Spring Boot + Kafka?

Spring Boot与Spring Kafka的整合,让开发者能够以声明式、低代码的方式实现生产者和消费者,无需关注底层连接和线程管理。

Spring Kafka提供:

  • KafkaTemplate ------ 像JdbcTemplate一样发送消息
  • @KafkaListener ------ 注解驱动、异步消费
  • KafkaTransactionManager ------ 实现精确一次(Exactly-Once)语义

二、版本兼容性说明

根据Spring官方文档,下表为推荐版本组合(以Spring Boot 3.x为例):

Spring Boot Spring Kafka kafka-clients
3.4.x 4.0.x 4.1.2
3.3.x 3.3.x 3.8.0 ~ 3.9.0
3.2.x 3.2.x 3.7.0
3.1.x 3.1.x 3.6.0

客户端版本必须与Kafka broker兼容。例如kafka-clients 4.x可与broker 3.x及更高版本通信,但建议使用官方Kafka兼容性矩阵

三、实战:从零搭建Kafka消息系统

1. 初始化Spring Boot项目

通过 Spring Initializr 添加依赖:

  • Spring Web (便于测试REST触发消息)
  • Spring for Apache Kafka

或在pom.xml中手动添加:

xml 复制代码
<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>

2. 配置Kafka连接

编辑application.yml

yaml 复制代码
spring:
  kafka:
    bootstrap-servers: localhost:9092
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
    consumer:
      group-id: my-group
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
      properties:
        spring.json.trusted.packages: "*"

3. 创建消息实体

java 复制代码
public class OrderEvent {
    private String orderId;
    private double amount;
    // 构造函数、getter/setter ...
}

4. 生产者:使用KafkaTemplate发送消息

java 复制代码
@Service
public class OrderProducer {
    @Autowired
    private KafkaTemplate<String, OrderEvent> kafkaTemplate;

    public void sendOrder(OrderEvent order) {
        kafkaTemplate.send("order-topic", order.getOrderId(), order);
        System.out.println("订单已发送: " + order.getOrderId());
    }
}

5. 消费者:使用@KafkaListener接收消息

java 复制代码
@Component
public class OrderConsumer {
    @KafkaListener(topics = "order-topic", groupId = "order-processor")
    public void processOrder(OrderEvent order) {
        System.out.println("处理订单: " + order.getOrderId() + ", 金额: " + order.getAmount());
        // 执行业务逻辑...
    }
}

6. 在Controller中触发发送

java 复制代码
@RestController
public class OrderController {
    @Autowired
    private OrderProducer producer;

    @PostMapping("/order")
    public String createOrder(@RequestBody OrderEvent order) {
        producer.sendOrder(order);
        return "订单已提交";
    }
}

四、进阶配置与最佳实践

1. 事务性发送(Exactly-Once)

java 复制代码
@Transactional
public void sendWithTx(String topic, OrderEvent order) {
    kafkaTemplate.executeInTransaction(t -> {
        t.send(topic, order);
        // 若抛出异常则事务回滚
        return true;
    });
}

同时需配置spring.kafka.producer.transaction-id-prefix=tx-

2. 消费时的错误处理与重试

java 复制代码
@KafkaListener(topics = "order-topic")
@RetryableTopic(attempts = "4", backoff = @Backoff(delay = 2000))
public void processWithRetry(OrderEvent order) {
    // 可能失败的业务逻辑
}

需要额外依赖spring-retry

3. 配置多个消费者容器工厂

java 复制代码
@Bean
public ConcurrentKafkaListenerContainerFactory<String, String>
  customContainerFactory(ConsumerFactory<String, String> consumerFactory) {
    var factory = new ConcurrentKafkaListenerContainerFactory<String, String>();
    factory.setConsumerFactory(consumerFactory);
    factory.setConcurrency(3); // 并发数
    factory.getContainerProperties().setAckMode(ContainerProperties.AckMode.MANUAL);
    return factory;
}

然后在@KafkaListener中指定containerFactory

五、测试你的集成

推荐使用spring-kafka-test中的嵌入式Kafka:

xml 复制代码
<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka-test</artifactId>
    <scope>test</scope>
</dependency>

编写测试用例时可用@EmbeddedKafka启动测试broker。

六、常见问题排查

现象 可能原因 解决方案
生产者超时 Broker不可达 检查bootstrap-servers及网络防火墙
消费不到消息 groupId不同或未提交offset 重置offset或用@KafkaListenerautoStartup
序列化异常 信任包未配置 设置spring.json.trusted.packages
版本冲突 kafka-clients与broker不匹配 参考兼容性矩阵升级客户端或broker

七、总结

通过Spring Kafka,可以用少量注解和配置,就将Kafka的强大消息能力集成到Spring Boot应用中。本文涵盖了从基础配置、发送接收、事务保证到生产级错误处理的全流程。

相关推荐
2601_963870182 小时前
【计算机毕业设计】基于Vue + Spring Boot的社区养老服务管理平台设计与实现
spring boot·后端·课程设计
乐观的Terry3 小时前
11、发布系统-用户认证与权限体系
java·spring boot·spring·spring cloud·mybatis
William Dawson3 小时前
【踩坑实录|Hive1\.2\.1数据服务接口5大疑难问题调试与全方位优化方案】
java·hive·spring boot
闲猫3 小时前
LangChain4j / Introduction
java·人工智能·spring boot·langchain4j
CodeHackerBhx5 小时前
Spring Boot 4 防重复提交:从接口幂等到 Redis 分布式锁的完整实践
java·数据库·spring boot·redis·分布式
用户3126874877207 小时前
Spring Bean 生命周期到底经历了什么?从实例化到销毁的全链路拆解
java·spring boot
Flittly7 小时前
【我的手搓轮子日记】(2)handmade-ioc 手搓 IOC 容器
java·spring boot·spring
AlunYegeer8 小时前
Spring Boot 多模块服务间 API Token 鉴权排查记录
java·spring boot·后端
paopaokaka_luck8 小时前
基于springboot3+vue3的乡村医生诊疗管理系统(AI助手、协同过滤算法、webSocket实时聊天、Echarts图形化分析)
前端·网络·人工智能·spring boot·websocket·网络协议·echarts
vx-程序开发8 小时前
【java项目分享】springboot农产品销售平台14952
java·javascript·spring boot·python·eclipse·django·php