Springboot集成kafka

Springboot集成kafka

环境配置

maven依赖如下 其余依赖根据业务自行配置

xml 复制代码
		<dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
            <version>3.1.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.kafka</groupId>
                    <artifactId>kafka-clients</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
            <version>4.0.1</version> <!-- 与你的 Kafka 服务端版本一致 -->
        </dependency>
        <dependency>
            <groupId>org.jspecify</groupId>
            <artifactId>jspecify</artifactId>
            <version>1.0.0</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-expression</artifactId>
            <version>6.1.4</version> <!-- 3.2.3对应的固定版本 -->
            <scope>compile</scope> <!-- 强制编译+运行时包含 -->
        </dependency>

application.yml

yaml 复制代码
spring:
  kafka:
#    bootstrap-servers: localhost:9092,localhost:9094,localhost:9096
    bootstrap-servers: localhost:9092
    # 生产者配置
    producer:
      # 消息Key/Value的序列化方式(必须和消费者反序列化对应)
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
      # 消息确认机制:all=所有副本确认(最高可靠性,生产环境推荐)
      acks: all
      # 重试次数:发送失败时重试3次
      retries: 3
      # 批次大小:16KB(批量发送提升性能)
      batch-size: 16384
      # 缓冲区大小:32MB
      buffer-memory: 33554432

    # 消费者配置
    consumer:
      # 消息Key/Value的反序列化方式
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      # 消费者组ID(必填,同一组内的消费者负载均衡消费)
      group-id: springboot-kafka-group
      # 消费起始位置:earliest=从最开始消费;latest=从最新消息消费
      auto-offset-reset: earliest
      # 关闭自动提交偏移量(手动提交更安全,避免重复消费)
      enable-auto-commit: true
      auto-commit-interval: 1000

生产者producer

java 复制代码
   @Resource
    private KafkaTemplate<String, String> kafkaTemplate;
/**
     * 异步发送消息(带消息Key:相同Key的消息会进入同一个分区,保证有序)
     * @param topic 主题名
     * @param key 消息Key
     * @param message 消息内容
     */
    public void sendMessageAsyncWithKey(String topic, String key, String message) {
        ProducerRecord<String, String> record = new ProducerRecord<>(topic, key, message);
        CompletableFuture<SendResult<String, String>> future = kafkaTemplate.send(record);
        future.thenAcceptAsync(new Consumer<SendResult<String, String>>() {
            @Override
            public void accept(SendResult<String, String> stringStringSendResult) {
                System.out.println(stringStringSendResult.getProducerRecord());
                System.out.println(stringStringSendResult.getRecordMetadata());
            }
        });
    }

消费者consumer

java 复制代码
@KafkaListener( topics = "test-springboot-topic",
            groupId = "springboot-kafka-group"
           )
    public void consumeMessage(ConsumerRecord<String, String> record) {
        System.out.println("消费到消息:" + record.value() );
    }

创建topic

java 复制代码
import org.apache.kafka.clients.admin.Admin;
import org.apache.kafka.clients.admin.AdminClientConfig;
import org.apache.kafka.clients.admin.CreateTopicsResult;
import org.apache.kafka.clients.admin.NewTopic;

import java.util.Collections;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;

public class AdminTopicTest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        Map<String,Object> configMap = new ConcurrentHashMap<>();
        configMap.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG,"127.0.0.1:9092,127.0.0.1:9094,127.0.0.1:9096");
        Admin admin = Admin.create(configMap);
        //设置topic的名称 分区数 副本数
        NewTopic topic = new NewTopic("test111",3,(short) 3);
        CreateTopicsResult topics = admin.createTopics(Collections.singleton(topic));
        admin.close();
    }
}
相关推荐
huaweichenai40 分钟前
spring boot 实现file文件上传
java·spring boot·后端
VX_bysjlw9851 小时前
数码设备销售网站设计与实现39138-计算机毕设原创(免费领源码+带部署教程)
java·vue.js·spring boot·mysql·tomcat·mybatis·idea
code_slave(码畜)1 小时前
微服务架构落地:消息队列架构设计(下篇)——消息堆积、死信治理与集群监控告警实战
spring boot·spring cloud·微服务·云原生·中间件·架构
霸道流氓气质4 小时前
OpenTelemetry 入门与实战:Java Agent、Spring Boot Starter与LLM调用追踪示例
java·开发语言·spring boot
m0_587383004 小时前
24 小时自助健身房系统软件开发实战指南与案例解析
java·spring boot·spring·系统架构·需求分析
爱编程的小白L4 小时前
基于SpringBoot+Vue的医院门诊排队叫号系统的设计与实现
spring boot
马剑威(威哥爱编程)4 小时前
【AI全栈后端12-12】Spring Boot 3.x 到 4.x 迁移实操:Jakarta 11、Jackson 3 与 AI 2.0
java·开发语言·spring boot·后端
IT研究室4 小时前
最新计算机毕业设计选题推荐-基于spring boot的心桥·心理健康综合服务平台-网站-文档指导-Java-springboot
java·spring boot·课程设计
她的男孩5 小时前
企业接口照样拦得住:独立 Flyway、@RequiresFeature 与离线许可证
java·spring boot·后端
十年Java程序媛5 小时前
Lambda 与函数式接口|别只会复制 ()->{},底层规则和坑一次性讲清
java·spring boot·后端