当前位置:

首页 > 编程开发 > SpringBoot怎么集成Kafka配置工具类

SpringBoot怎么集成Kafka配置工具类

Kafka Assistant
Kafka Assistant

Kafka Assistant 是一款可视化监控、管理工具,支持 GPU 渲染和实时监控。它更适合把零散的小功能集中起来使用,处理高频琐碎任务时会更省事。

立即下载
¥19
Windows/macOS/Linux 2026-08-22
正版软件 Windows macOS软件 Linux kafka

spring-kafka是基于java版的kafkaclient与spring的集成,提供了KafkaTemplate,封装了各种方法,方便操作,它封装了apache的kafka-client,不需要再导入client依赖org.springframework.kafkaspring-kafkaYML配置kafka:#bootstrap-servers:server1:9092,server2:9093#kafka开发地址,#生产者配置producer:#Kafka提供的序列化和反序列化类key-seri

本文目录

    spring-kafka 是基于 java版的 kafka client与spring的集成,提供了 KafkaTemplate,封装了各种方法,方便操作,它封装了apache的kafka-client,不需要再导入client依赖

    
            
                org.springframework.kafka
                spring-kafka
            

    YML配置

    kafka:
        #bootstrap-servers: server1:9092,server2:9093 #kafka开发地址,
        #生产者配置
        producer:
          # Kafka提供的序列化和反序列化类
          key-serializer: org.apache.kafka.common.serialization.StringSerializer #序列化
          value-serializer: org.apache.kafka.common.serialization.StringSerializer
          retries: 1 # 消息发送重试次数
          #acks = 0:设置成 表示 producer 完全不理睬 leader broker 端的处理结果。此时producer 发送消息后立即开启下 条消息的发送,根本不等待 leader broker 端返回结果
          #acks= all 或者-1 :表示当发送消息时, leader broker 不仅会将消息写入本地日志,同时还会等待所有其他副本都成功写入它们各自的本地日志后,才发送响应结果给,消息安全但是吞吐量会比较低。
          #acks = 1:默认的参数值。 producer 发送消息后 leader broker 仅将该消息写入本地日志,然后便发送响应结果给producer ,而无须等待其他副本写入该消息。折中方案,只要leader一直活着消息就不会丢失,同时也保证了吞吐量
          acks: 1 #应答级别:多少个分区副本备份完成时向生产者发送ack确认(可选0、1、all/-1)
          batch-size: 16384 #批量大小
          properties:
            linger:
              ms: 0 #提交延迟
          buffer-memory: 33554432 # 生产端缓冲区大小
        # 消费者配置
        consumer:
          key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
          value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
          # 分组名称
          group-id: web
          enable-auto-commit: false
          #提交offset延时(接收到消息后多久提交offset)
          # auto-commit-interval: 1000ms
          #当kafka中没有初始offset或offset超出范围时将自动重置offset
          # earliest:重置为分区中最小的offset;
          # latest:重置为分区中最新的offset(消费分区中新产生的数据);
          # none:只要有一个分区不存在已提交的offset,就抛出异常;
          auto-offset-reset: latest
          properties:
            #消费会话超时时间(超过这个时间consumer没有发送心跳,就会触发rebalance操作)
            session.timeout.ms: 15000
            #消费请求超时时间
            request.timeout.ms: 18000
          #批量消费每次最多消费多少条消息
          #每次拉取一条,一条条消费,当然是具体业务状况设置
          max-poll-records: 1
          # 指定心跳包发送频率,即间隔多长时间发送一次心跳包,优化该值的设置可以减少Rebalance操作,默认时间为3秒;
          heartbeat-interval: 6000
          # 发出请求时传递给服务器的 ID。用于服务器端日志记录 正常使用后解开注释,不然只有一个节点会报错
          #client-id: mqtt
        listener:
          #消费端监听的topic不存在时,项目启动会报错(关掉)
          missing-topics-fatal: false
          #设置消费类型 批量消费 batch,单条消费:single
          type: single
          #指定容器的线程数,提高并发量
          #concurrency: 3
          #手动提交偏移量 manual达到一定数据后批量提交
          #ack-mode: manual
          ack-mode: MANUAL_IMMEDIATE #手動確認消息
            # 认证
        #properties:
          #security:
            #protocol: SASL_PLAINTEXT
          #sasl:
            #mechanism: SCRAM-SHA-256
            #jaas:config: 'org.apache.kafka.common.security.scram.ScramLoginModule required username="username" password="password";'

    简单工具类,能满足正常使用,主题是无法修改的

    @Component
    @Slf4j
    public class KafkaUtils {
        @Autowired
        private KafkaTemplate kafkaTemplate;
        @Value("${spring.kafka.bootstrap-servers}")
        String[] servers;
    
        /**
         * 获取连接
         * @return
         */
        private Admin getAdmin() {
            Properties properties = new Properties();
            properties.put("bootstrap.servers", servers);
            // 正式环境需要添加账号密码
            return Admin.create(properties);
        }
    
        /**
         * 增加topic
         *
         * @param name      主题名字
         * @param partition 分区数量
         * @param replica   副本数量
         * @date 2022-06-23 chens
         */
        public R addTopic(String name, Integer partition, Integer replica) {
            Admin admin = getAdmin();
            if (replica > servers.length) {
                return R.error("副本数量不允许超过Broker数量");
            }
            try {
                NewTopic topic = new NewTopic(name, partition, Short.parseShort(replica.toString()));
                admin.createTopics(Collections.singleton(topic));
            } finally {
                admin.close();
            }
            return R.ok();
        }
    
        /**
         * 删除主题
         *
         * @param names 主题名字集合
         * @date 2022-06-23 chens
         */
        public void deleteTopic(List names) {
            Admin admin = getAdmin();
            try {
                admin.deleteTopics(names);
            } finally {
                admin.close();
            }
        }
    
        /**
         * 查询所有主题
         *
         * @date 2022-06-24 chens
         */
        public Set queryTopic() {
            Admin admin = getAdmin();
            try {
                ListTopicsResult topics = admin.listTopics();
                Set set = topics.names().get();
                return set;
            } catch (Exception e) {
                log.error("查询主题错误!");
            } finally {
                admin.close();
            }
            return null;
        }
    
        // 向所有分区发送消息
        public ListenableFuture> send(String topic, @Nullable V data) {
            return kafkaTemplate.send(topic, data);
        }
        
        // 指定key发送消息,相同key保证消息在同一个分区
        public ListenableFuture> send(String topic, K key, @Nullable V data) {
            return kafkaTemplate.send(topic, key, data);
        }
    
        // 指定分区和key发送。
        public ListenableFuture> send(String topic, Integer partition, K key, @Nullable V data) {
            return kafkaTemplate.send(topic, partition, key, data);
        }
    }

    发送消息 使用异步

    @GetMapping("/{topic}")
        public String test(@PathVariable String topic, @PathVariable Long index) throws ExecutionException, InterruptedException {
    
            ListenableFuture future = null;
            Chenshuang user = new Chenshuang(i, "陈爽", "123456", new Date());
            String s = JSON.toJSONString(user);
            KafkaUtils utils = new KafkaUtils();
            future = kafkaUtils.send(topic, s);
            // 异步回调,同步get,会等待 不推荐同步!
            future.addCallback(new ListenableFutureCallback() {
                @Override
                public void onFailure(Throwable ex) {
                    System.out.println("发送失败");
                }
                @Override
                public void onSuccess(Object result) {
                    System.out.println("发送成功:" + result);
                }
            });
            return "发送成功";
        }

    建立主题

    如果broker端配置auto.create.topics.enable为true(默认为true),当收到客户端的元数据请求时则会创建topic。

    向一个不存在的主题发送和消费都会创建一个新的主题,很多时候,非预期的创建主题,会导致很多意想不到的问题,建议关掉该特性。

    Topic主题用来区分不同类型的消息,实际也就是适用于不同的业务场景,默认消息保存一周时间;

    同一个Topic主题下,默认是一个partition分区,也就是只能有一个消费者来消费,如果想提升消费能力,就需要增加分区;

    同一个Topic的多个分区,可以有三种方式分派消息(key,value)到不同的分区,指定分区、HASH路由、默认,同一个分区内的消息ID唯一,并顺序;

    消费者消费partition分区内的消息时,是通过offsert来标识消息的位置;

    GroupId用来解决同一个Topic主题下重复消费问题,比如一条消费需要多个消费者接收到,就可以通过设置不同的GroupId实现,

    实际消息是存一份的,只是通过逻辑上设置标识来区分,系统会记录Topic主题下–》GroupId分组下–》partition分区下的offsert,来标识是否消费过。

    发送消息的高可用—

    集群模式,多副本方式实现;一条消息的提交,可能通过设置acks标识实现不同的可用性,=0时,发送成功就OK;=1时,master成功响应才OK,=all时,一半以上的响应才OK(真正的高可用)

    消费消息的高可用—

    可以关闭自动标识offsert模式,先拉取消息,消费完成后,再去设置offsert位置,来解决消费高可用

    import org.apache.kafka.clients.admin.NewTopic;
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    @Configuration
    public class KafkaTopic {
        // yml自定义主题,项目启动就创建,
        @Value("${spring.kafka.topic}")
        String topic;
        @Value("${spring.kafka.bootstrap-servers}")
        String[] server;
        /**
         * 项目启动 初始化主题,如果存在不会覆盖主题的
         */
        @Bean
        public NewTopic batchTopic() {
            // 最大复制因子 <= 经纪人broker数量.
            return new NewTopic(topic, 10, (short) server.length);
        }
    }

    监听类 ,一条消息,各分组内的消费者只有一个消费者消费一次,如果消息在1区,指定分区1监听也会消费
    也可以同个方法监听不同的主题,指定位移监听
    同组会均匀消费,不同组会重复消费。

    1、单播模式,只有一个消费者组

    (1)topic只有1个partition,该组内有多个消费者时,此时同一个partition内的消息只能被该组中的一 个consumer消费。当消费者数量多于partition数量时,多余的消费者是处于空闲状态的,如图1所示。topic,test只有一个partition,并且只有1个group,G1,该group内有多个consumer,只能被其中一个消费者消费,其他的处于空闲状态。

    SpringBoot怎么集成Kafka配置工具类

    图一

    (2)该topic有多个partition,该组内有多个消费者,比如test 有3个partition,该组内有2个消费者,那么可能就是C0对应消费p0,p1内的数据,c1对应消费p2的数据;如果有3个消费者,就是一个消费者对应消费一个partition内的数据了。图解分别如图2,图3.这种模式在集群模式下使用是非常普遍的,比如我们可以起3个服务,对应的topic设置3个partiition,这样就可以实现并行消费,大大提高处理消息的效率。

    SpringBoot怎么集成Kafka配置工具类

    图二

    SpringBoot怎么集成Kafka配置工具类

    图三

    2、广播模式,多个消费者组

    如果想实现广播的模式就需要设置多个消费者组,这样当一个消费者组消费完这个消息后,丝毫不影响其他组内的消费者进行消费,这就是广播的概念。

    (1)多个消费者组,1个partition

    该topic内的数据被多个消费者组同时消费,当某个消费者组有多个消费者时也只能被一个消费者消费,如图4所示:

    SpringBoot怎么集成Kafka配置工具类

    图四

    (2)多个消费者组,多个partition

    该topic内的数据可被多个消费者组多次消费,在一个消费者组内,每个消费者又可对应该topic内的一个或者多个partition并行消费,如图五:

    SpringBoot怎么集成Kafka配置工具类

    注意: 消费者的数量并不能决定一个topic的并行度。它是由分区的数目决定的。
    再多的消费者,分区数少,也是浪费!
    一个组的最大并行度将等于该主题的分区数。

    @Component
    @Slf4j
    public class Consumer {
        // 监听主题 分组a
        @KafkaListener(topics =("${spring.kafka.topic}") ,groupId = "a")
        public  void  getMessage(ConsumerRecord message, Acknowledgment ack) {
            //确认收到消息
            ack.acknowledge();
        }
        // 监听主题 分组a
        @KafkaListener(topics = ("${spring.kafka.topic}"),groupId = "a")
        public  void getMessage2(ConsumerRecord message, Acknowledgment ack) {
            //确认收到消息
            ack.acknowledge();
        }
        // 监听主题 分组b
        @KafkaListener(topics = ("${spring.kafka.topic}"),groupId = "b")
        public  void getMessage3(ConsumerRecord message, Acknowledgment ack) {
            //确认收到消息//确认收到消息
            ack.acknowledge();
        }
        // 监听主题 分组b
        @KafkaListener(topics = ("${spring.kafka.topic}"),groupId = "b")
        public  void getMessage4(ConsumerRecord message, Acknowledgment ack) {
            //确认收到消息//确认收到消息
            ack.acknowledge();
        }
    
        // 指定监听分区1的消息
        @KafkaListener(topicPartitions = {@TopicPartition(topic = ("${spring.kafka.topic}"),partitions = {"1"})})
        public void getMessage5(ConsumerRecord message, Acknowledgment ack) {
            Long id = JSONObject.parseObject(message.value().toString()).getLong("id");
            //确认收到消息//确认收到消息
            ack.acknowledge();
        }
        
        /**
         * @Title 指定topic、partition、offset消费
         * @Description 同时监听topic1和topic2,监听topic1的0号分区、topic2的 "0号和1号" 分区,指向1号分区的offset初始值为8
         * 注意:topics和topicPartitions不能同时使用;
         **/
        @KafkaListener(id = "c1",groupId = "c",topicPartitions = {
                @TopicPartition(topic = "t1", partitions = { "0" }),
                @TopicPartition(topic = "t2", partitions = "0", partitionOffsets = @PartitionOffset(partition = "1", initialOffset = "8"))})
        public void getMessage6(ConsumerRecord record,Acknowledgment ack) {
            //确认收到消息
            ack.acknowledge();
        }
        
        /**        
         * 批量消费监听goods变更消息
         * yml配置listener:type 要改为batch
         * ymk配置consumer:max-poll-records: ??(每次拉取多少条数据消费)
         * concurrency = "2" 启动多少线程执行,应小于等于broker数量,避免资源浪费
         */
        @KafkaListener(id="sync-modify-goods", topics = "${spring.kafka.topic}",concurrency = "4")
        public void getMessage7(List> records){
            for (ConsumerRecord msg:records) {
                GoodsChangeMsg changeMsg = null;
                try {
                    changeMsg = JSONObject.parseObject(msg.value(), GoodsChangeMsg.class);
                    syncGoodsProcessor.handle(changeMsg);
                }catch (Exception exception) {
                    log.error("解析失败{}", msg, exception);
                }
            }
        }
    }
    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 kafka
    相关文章 更多
    Kafka在Python中的应用与使用详解
    Kafka在Python中的应用与使用详解

    Kafka是一个高吞吐量分布式发布-订阅消息系统,用于实时数据流处理;Python通过kafka-python等第三方库实现消息生产与消费,支持微服务通信、日志聚合和实时处理等场景。

    Spring Boot整合Kafka消息发布教程
    Spring Boot整合Kafka消息发布教程

    SpringBoot整合Kafka实现消息发布的步骤包括:1.添加Maven或Gradle依赖;2.配置Kafka生产者参数;3.编写服务类使用KafkaTemplate发送消息;4.创建Controller暴露接口;5.注意Kafka服务状态、Topic管理及序列化一致性等问题。具体操作上,首先在pom.xml或build.gradle中引入spring-kafka依赖,然后配置bootstrap-servers、key和value的序列化方式,接着创建KafkaProducerService注入Kaf

    Python流数据处理:Kafka与Spark实战指南
    Python流数据处理:Kafka与Spark实战指南

    Kafka是流数据处理的首选消息队列,1.因为其高吞吐量与低延迟,能应对每秒数百万条消息;2.具备分布式、持久化的提交日志设计,支持数据回溯与多消费者独立消费;3.分区机制实现横向扩展,适应大规模数据;4.提供可靠的数据存储层,增强系统容错性与灵活性。PySpark在流数据处理中扮演“大脑”角色,StructuredStreaming相较于SparkStreaming具有优势:1.采用持续增长无限表模型,简化编程逻辑;2.统一批处理与流处理API,降低学习曲线;3.支持精确一次语义,确保数据一致性;4.内

    在Rocky Linux中安装Apache Kafka的步骤
    在Rocky Linux中安装Apache Kafka的步骤

    在RockyLinux上安装ApacheKafka可以按照以下步骤进行操作:更新系统:首先,确保你的RockyLinux系统是最新的,执行以下命令更新系统软件包:sudoyumupdate安装Java:ApacheKafka依赖于Java,因此需要先安装JavaDevelopmentKit(JDK)。可以通过以下命令安装OpenJDK:sudoyuminstalljava-1.8.0-openjdk-devel下载和解压:访问ApacheKafka官方网站()下载最新的二进制包。选择一个稳定版本并下载压缩

    Kafka 丢消息原因及解决方案
    Kafka 丢消息原因及解决方案

    Kafka是一种高效的分布式消息队列系统,广泛应用于大规模数据处理和流式计算。然而,消息丢失问题是Kafka使用过程中一个严重的隐患,因为它可能导致数据的不连续性和计算结果的准确性下降,从而影响系统的整体功能和运行效率。本文将从多个角度探讨Kafka消息丢失的原因,并简要介绍相应的解决方案和优化策略。硬件故障是导致Kafka消息丢失的常见原因之一。Kafka集群由多个节点组成,每个节点都有自己的硬件设备,如CPU、内存和磁盘。当某个节点发生硬件故障,如电源故障或硬盘损坏,存储在该节点上的

    如何在PHP中使用Apache Kafka函数
    如何在PHP中使用Apache Kafka函数

    ApacheKafka是一个开源的、分布式的流处理平台,也是一种分布式消息系统,可以实现高吞吐量、可靠的数据传输和处理。在网络应用开发中,很多场景都需要使用消息队列来进行异步处理,而Kafka就是消息队列中的一种,由于其高性能、高可靠性、可扩展性等特点,越来越被广泛应用于各种领域。在PHP中使用Kafka,需要通过PHP扩展库librdkafka进行操作。

    springBoot项目常用目录有哪些
    springBoot项目常用目录有哪些

    springBoot项目常用目录springBoot项目的目录结构及名规范介绍基于SpringBoot开发时的目录结构及命名规范,通过介绍能够为你解决,在实际项目中如何规划目录结构?如何命名目录更规范?各个目录分别代表什么含义?等三个问题。目录说明servicex//项目名|-admin-ui//管理服务前端代码(一般将UI和SERVICE放到一个工程中,便于管理)|-servicex-auth//模块1|-servicex-common//模块2|-servicex-gateway//模块3|-serv

    如何使用PHP和Kafka实现实时工业数据采集和分析
    如何使用PHP和Kafka实现实时工业数据采集和分析

    在当今工业领域中,数据采集和实时分析已经成为了企业竞争力的重要组成部分。而PHP和Kafka是两个非常常见的实现实时工业数据采集和分析的技术。本文将介绍如何使用PHP和Kafka实现实时工业数据采集和分析。一、Kafka基础Kafka是一种分布式流式处理平台,它可以将实时数据流进行高效的持久化和分发,同时也支持高容错性。Kafka存储和处理流数据时,采用

    如何使用PHP和Kafka实现实时游戏数据分析
    如何使用PHP和Kafka实现实时游戏数据分析

    随着游戏市场的蓬勃发展,游戏数据分析逐渐成为了游戏开发者和运营者必不可少的环节。实时游戏数据分析的重要性在于能够帮助开发者和运营者在第一时间内了解游戏的表现和玩家行为,及时发现问题并采取有效的解决方案。为了实现实时游戏数据分析,我们可以使用PHP和Kafka这两个工具。PHP作为一种流行的后端编程语言,具备很高的灵活性和可扩展性,实现起来也很简单。而Kafk

    学习如何使用PHP和Kafka进行消息传递
    学习如何使用PHP和Kafka进行消息传递

    PHP是一种流行的编程语言,常用于服务器端开发和Web应用程序开发。Kafka是一种分布式消息系统,可用于管理大规模的消息传递。本文将介绍如何使用PHP和Kafka进行消息传递。首先,我们需要安装一些必要的工具和库。在Linux上,我们可以使用以下命令:sudoapt-getinstallphp-zmqlibrdkafka-dev如果您使用的是Win

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程
    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    Mac软件 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    Aperty macOS版
    Aperty macOS版
    macOS

    Aperty 是 Skylum 推出的 AI 人像修图软件,支持自然肤质修饰、瑕疵处理、面部与身体调整、预设及批量同步。

    WINDOWS 更多
    讯飞智作 网页版
    讯飞智作 网页版
    Windows/ macOS/ Linux

    讯飞智作是一款基于语音合成技术、虚拟人驱动技术与数字人形象声音构建能力的 AI 数字人音视频创作平台。

    火山引擎 网页版
    火山引擎 网页版
    Windows/ macOS/ Linux

    火山引擎是字节跳动旗下企业级云与AI服务平台。聚焦大模型核心能力,依托字节自研豆包多模态大模型,凭借火山方舟一站式平台,提供模型精调、推理部署、智能应用搭建等全链路服务,结合高性能AI算力,助力各行业快速落地大模型数字化与智能化应用。

    PixTV 网页版
    PixTV 网页版
    Windows

    PixTV 是一款在浏览器中使用的 AI 视觉内容创作平台,提供图片、视频、音频、文字生成、AI 分镜、局部重绘、提示词反推和无限画布等工具,适合短剧、漫剧、广告及社交媒体内容制作。

    即将离开本站
    您即将前往第三方网站,请确认是否继续?