SpringBoot集成Kafka

1、maven依赖

xml 复制代码
<!-- 无需指定版本,跟随springboot版本自动引入适配版本 -->
<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>

2、application.yml 配置

yaml 复制代码
spring:
  kafka:
    bootstrap-servers: 10.10.62.32:31175,10.10.62.32:31032,10.10.62.32:32224
    consumer:
      group-id: 'default-group-id'
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      enable-auto-commit: false
      max-poll-records: 100
      auto-offset-reset: latest
    listener:
      ack-mode: manual
      type: BATCH
    properties:
      security.protocol: PLAINTEXT
      #sasl.mechanism: PLAIN
    #jaas:
      #config: #config: 'org.apache.kafka.common.security.scram.ScramLoginModule required username="admin" password="Wt1g2+UNRPnV";'

3、消息生产者Producer

java 复制代码
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.support.SendResult;
import org.springframework.stereotype.Service;
import org.springframework.util.concurrent.ListenableFuture;


@Service
public class KafkaProducerService {

    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;

    public void sendMessage(String topic, String message) {
        //异步消息
        ListenableFuture<SendResult<String, String>> asyncResult = kafkaTemplate.send(topic, message);
        asyncResult.addCallback(
                success -> {
                    String topic1 = success.getRecordMetadata().topic();
                    int partition = success.getRecordMetadata().partition();
                    long offset = success.getRecordMetadata().offset();
                    System.out.println("异步发送成功: topic=" + topic + ", partition=" + partition + ", offset=" + offset);
                },
                failure -> {
                    System.out.println("异步发送失败: " + failure.getMessage());
                    // 可以记录日志、重试、告警等
                }
        );

        //同步消息
        try {
            SendResult<String, String> syncResult =  kafkaTemplate.send(topic, message).get();
            System.out.println("同步发送成功: " + syncResult.getRecordMetadata());
        } catch (Exception e) {
            System.out.println("发送失败: " + e.getMessage());
        }
    }
}

4、消息消费者Consumer

java 复制代码
import org.example.springboot.starter.common.User;
import org.springframework.stereotype.Service;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.support.Acknowledgment;

import java.util.List;

@Service
public class KafkaConsumerService {

    @KafkaListener(topics = "my-topic", groupId = "policy-sr-group")
    public void listen(String message, Acknowledgment ack) {
        try {
            System.out.println("消费者Received Message: " + message);
            // 处理业务逻辑
        } finally {
            // 手动提交 offset
            ack.acknowledge();
        }
    }

    @KafkaListener(topics = "user-topic", groupId = "policy-sr-group")
    public void listenUser(List<User> user, Acknowledgment ack) {
        System.out.println("消费者Received User: " + user);
        ack.acknowledge();
    }

}

🧩 @KafkaListener 核心属性一览

属性 类型 说明
topics String[] 监听的 topic 名称
topicPattern String 正则表达式匹配 topic(动态监听)
id String 消费者 ID(用于日志、管理)
groupId String 消费者组 ID(覆盖配置文件)
concurrency String 并发线程数(控制吞吐)
containerFactory String 指定 KafkaListenerContainerFactory
errorHandler Class 自定义错误处理器
ackMode String 手动提交模式(配合 Acknowledgment)
clientIdPrefix String 客户端 ID 前缀
batch boolean 是否启用批量消费
properties String[] 动态设置消费者属性
相关推荐
Aric_Jones7 小时前
从实战理解异步、并发并行与GIL:FastAPI vs SpringBoot
java·spring boot·fastapi
林木887 小时前
Druid Kafka 数据源消费到 Segment 生成全链路深度分析
后端
摇曳的精灵7 小时前
Spring boot注解实现信息脱敏
java·spring boot·后端·注解脱敏·信息脱敏
程序猿大帅7 小时前
记一次线上翻车:加了Redisson分布式锁,数据还是被并发打穿了
后端
weixin_704266057 小时前
项目总结一
java·前端·spring boot·后端·spring
JimmtButler7 小时前
一台电脑,两个 Git 身份:公司 GitLab + 个人 GitHub 共存
后端
全栈王校长7 小时前
Nest 中间件 Middleware - 就像 Vue 的路由守卫
后端·nestjs
全栈王校长7 小时前
Nest ValidationPipe 参数验证 - 就像前端的表单校验
后端·nestjs
猫咪老师7 小时前
Day11 Python 关于线程和进程的最详细介绍!
后端·python
林木887 小时前
Druid 实时数据摄入与持久化全链路深度分析
后端