kafka + springboot快速入门

1. Docker 快速搭建

bash 复制代码
# docker-compose.yml
version: '3.8'
services:
  zookeeper:
    image: confluentinc/cp-zookeeper:7.5.0
    ports:
      - "2181:2181"
  kafka:
    image: confluentinc/cp-kafka:7.5.0
    ports:
      - "9092:9092"
    environment:
      KAFKA_BROKER_ID: 1
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
bash 复制代码
docker-compose up -d

2. Spring Boot 集成

2.1 添加依赖

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

2.2 配置

yaml 复制代码
spring:
  kafka:
    bootstrap-servers: localhost:9092
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
    consumer:
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      group-id: my-group
      auto-offset-reset: earliest

3. 生产者

java 复制代码
@Service
public class KafkaProducerService {

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    public void sendMessage(String topic, String message) {
        kafkaTemplate.send(topic, message).addCallback(
            result -> log.info("发送成功"),
            ex -> log.error("发送失败", ex)
        );
    }

    public void sendWithKey(String topic, String key, String message) {
        kafkaTemplate.send(topic, key, message);
    }
}

4. 消费者

java 复制代码
@Service
public class KafkaConsumerService {

    @KafkaListener(topics = "my-topic", groupId = "my-group")
    public void consume(ConsumerRecord<String, String> record) {
        log.info("收到消息: {}", record.value());
    }

    @KafkaListener(topics = "my-topic", groupId = "my-group", concurrency = "3")
    public void consumeMulti(ConsumerRecord<String, String> record) {
        log.info("收到消息: {}", record.value());
    }
}

5. 消息序列化

5.1 JSON 序列化

yaml 复制代码
spring:
  kafka:
    producer:
      value-serializer: org.springframework.kafka.support.serializer.JsonSerializer
    consumer:
      value-deserializer: org.springframework.kafka.support.serializer.JsonDeserializer
      properties:
        spring.json.trusted.packages: com.example.*
java 复制代码
// 发送对象
kafkaTemplate.send("order-topic", order);

// 消费对象
@KafkaListener(topics = "order-topic")
public void consumeOrder(Order order) {
    log.info("收到订单: {}", order);
}

6. 常见问题

6.1 消息丢失

yaml 复制代码
spring:
  kafka:
    producer:
      acks: all  # 必须等所有副本确认
    consumer:
      enable-auto-commit: false  # 手动提交
java 复制代码
@KafkaListener(topics = "my-topic")
public void consume(ConsumerRecord<String, String> record, Acknowledgment ack) {
    try {
        processMessage(record.value());
        ack.acknowledge();  // 手动提交
    } catch (Exception e) {
        log.error("处理失败", e);
    }
}

6.2 消息重复

业务层面实现幂等:

java 复制代码
@KafkaListener(topics = "order-topic")
public void consume(ConsumerRecord<String, String> record) {
    String id = record.key();
    if (redis.setIfAbsent(id, "1")) {
        processMessage(record.value());
    }
}

6.3 消息顺序

相同 key 发送到相同分区:

java 复制代码
kafkaTemplate.send("order-topic", orderId, message);

7. 总结

  • Docker 一键搭建 Kafka 环境
  • 生产者 通过 KafkaTemplate 发送消息
  • 消费者 通过 @KafkaListener 监听消息
  • 序列化 支持 String 和 JSON
  • 可靠投递 生产者 acks=all + 消费者手动提交
相关推荐
invicinble1 小时前
这里对java的知识体系做一个全域的介绍
java·开发语言·python
wbs_scy1 小时前
【Linux 线程进阶】进程 vs 线程资源划分 + 线程控制全详解
java·开发语言
ss2732 小时前
食谱推荐系统功能测试如何写?
java·数据库·spring boot·功能测试
2301_811274312 小时前
基于SpringBoot的智能家居管理系统
spring boot·后端·智能家居
毕设源码_古学姐2 小时前
计算机毕业设计springboot智能家居项目管理系统 基于SpringBoot的智能家居项目管理平台设计与实现 SpringBoot技术驱动的智能家居项目管理系统开发
spring boot·智能家居·课程设计
毕设源码-张学姐2 小时前
计算机毕业设计springboot智能家居设备信息管理系统 基于SpringBoot的智能家居设备全生命周期管理平台 面向智慧家庭的SpringBoot设备资产与场景运营系统
spring boot·智能家居·课程设计
AI人工智能+电脑小能手2 小时前
【大白话说Java面试题】【Java基础篇】第15题:JDK1.7中HashMap扩容为什么会发生死循环?如何解决
java·开发语言·数据结构·后端·面试·哈希算法
try2find2 小时前
打印ascii码报错问题
java·linux·前端
014-code2 小时前
CompletableFuture 实战模板(超时、组合、异常链处理)
java·数据库
Nicander2 小时前
多数据源下@transcation事务踩坑
java·后端