springboot2.x +kafka使用和源码分析二(topic配置)

部署kafka集群后创建主题超时Timed out waiting for a node assignment. Call:createTopics (kafka.admin.TopicCommand 代理将向生产者和消费者发布主机名和端口。 如果没有设置,则使用“listeners”的值。 否则,它将使用从java.net.InetAddress.getCanonicalHostName()返回的值。 阅读详情

 上一章我们了解到KafkaAutoConfiguration自动初始化依赖Bean,如下图所示若应用中不包含kafkaAdmin对象,KafkaAutoConfiguration为我们应用创建一个,那么kafkaAdmin这个类的作用是什么呢?

        @Bean
	@ConditionalOnMissingBean
	public KafkaAdmin kafkaAdmin() {
                //初始化kafkaAdmin对象用于管理topic等元数据
                KafkaAdmin kafkaAdmin = new KafkaAdmin(this.properties.buildAdminProperties());
                //如果为ture 初始化期间无法连接到代理时无法加载应用程序上下文的情况下检查/添加主题
                kafkaAdmin.setFatalIfBrokerNotAvailable(this.properties.getAdmin().isFailFast());
		return kafkaAdmin;
	}

在kafka应用由consumer角色负责消费数据,producer角色负责生产消息。那么KafkaAdmin(父类AdminClient)的作用就是对于topic的一些列管理包括topic的新增(partition,replicas分配),删除,修改(查看源码可以知道真正的执行者是KafkaAdminClient类)

springboot2.x中如何去创建topic呢,提供了多种方式。

/**
 *
 *@author fangyuan
 * 构建kafka topic如果topic已经存在,忽略Bean
 */
@Configuration
public class TopicConfigure {

    @Bean
    public KafkaAdmin kafkaAdmin() {
        //这里没有使用spring boot 提供的yml的方式注入到properties中
        Map<String, Object> props = new HashMap<>(1);
        //配置Kafka实例的连接地址
        props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, "localhost:9092");
        //设置配置文件
        KafkaAdmin admin = new KafkaAdmin(props);

        admin.setFatalIfBrokerNotAvailable(false);

        return admin;
    }
    
    @Bean
    public NewTopic createSpringboot_test_topic(){
    
        //可以直接指定分区数和副本数,副本数的分布由kafka集群自动分配
        return TopicBuilder.name("springboot_test_topic")
                .partitions(3)
                .replicas(1)
                //设置是否日志清除策略 compact 压缩 delete
                .compact()
                .build();
    }

    /**
     * 
     * @return
     */
    @Bean
    public NewTopic createPersonTopic(){
         //手动分配不同partition的副本分布情况,如下所示我们指定该topic
         //存在3个分区,并指定各分区副本数指定落到指定的broker中,其中0,1,2为brokerid
        return TopicBuilder.name("personTopic")
                .assignReplicas(0, Arrays.asList(0,1,2))
                .assignReplicas(1, Arrays.asList(1,2,0))
                .assignReplicas(2, Arrays.asList(2,0,1))
                //设置是否日志清除策略 compact 压缩 delete
                .compact()
                .build();
    }
}

那么springboot2.x如何创建呢,我们来追踪源码分析:

当我们通过上述初始化KafkaAdmin,NewTopic后。因为KafkaAdmin实现SmartInitializingSingleton接口如下图所示:

 

//KafkaAdmin 默认实现ApplicationContextAware 容器启动会自动注入ApplicationContext spirng核心上下文类 已经指定KafkaAdmin 为单列
public class KafkaAdmin implements ApplicationContextAware, SmartInitializingSingleton {
.....
}

spring容器执行SmartInitializingSingleton中的回调方法afterSingletonsInstantiated(SmartInitializingSingleton实现该接口后,当所有单例 bean 都初始化完成以后, 容器会回调该接口的方法 afterSingletonsInstantiated),

    @Override
	public void afterSingletonsInstantiated() {
           
		this.initializingContext = true;
            //autoCreate默认为true 随容器自启动
		if (this.autoCreate) {
            
			initialize();
		}
	}

        //初始化
	public final boolean initialize() {
        //获取系统中已被初始化NewTopic集合
		Collection<NewTopic> newTopics = this.applicationContext.getBeansOfType(NewTopic.class, false, false).values();
            //如果系统有指定新topics
		if (newTopics.size() > 0) {
			AdminClient adminClient = null;
			try {
                 //获取真正执行器KafkaAdminClient对象 
				adminClient = AdminClient.create(this.config);
			}
			catch (Exception e) {
				if (!this.initializingContext || this.fatalIfBrokerNotAvailable) {
					throw new IllegalStateException("Could not create admin", e);
				}
				else {
					LOGGER.error(e, "Could not create admin");
				}
			}
			if (adminClient != null) {
				try {
                     //如果kafka不存在中对应topic添加topic
					addTopicsIfNeeded(adminClient, newTopics);
					return true;
				}
				catch (Exception e) {
					if (!this.initializingContext || this.fatalIfBrokerNotAvailable) {
						throw new IllegalStateException("Could not configure topics", e);
					}
					else {
						LOGGER.error(e, "Could not configure topics");
					}
				}
				finally {
					this.initializingContext = false;
                    //关闭adminClient   
					adminClient.close(this.closeTimeout);
				}
			}
		}
		this.initializingContext = false;
		return false;
	}

        private void addTopicsIfNeeded(AdminClient adminClient, Collection<NewTopic> topics) {
		if (topics.size() > 0) {
			Map<String, NewTopic> topicNameToTopic = new HashMap<>();
			topics.forEach(t -> topicNameToTopic.compute(t.name(), (k, v) -> t));
			DescribeTopicsResult topicInfo = adminClient
					.describeTopics(topics.stream()
							.map(NewTopic::name)
							.collect(Collectors.toList()));
			List<NewTopic> topicsToAdd = new ArrayList<>();
                        //验证topic的partitions数 目的是判断存在的NewTopic指定partition数和实际partition数是否一致,不一致会修改kafka中partitions也就执行modifyTopics()方法
			Map<String, NewPartitions> topicsToModify = checkPartitions(topicNameToTopic, topicInfo, topicsToAdd);
			if (topicsToAdd.size() > 0) {
                                //添加topic 具体实现细节可以看KafkaAdminClient提供的各种对kafka操作
                                
				addTopics(adminClient, topicsToAdd);
			}
			if (topicsToModify.size() > 0) {
                                //修改topic
				modifyTopics(adminClient, topicsToModify);
			}
		}
	}

以上就是springboot2.x对kafka topic的初始化过程

如果系统需要手动对kafka topic管理 可以通过引用KafkaAdmin(单列) 对象来进行操作

Demo项目github地址:https://github.com/fangyuan94/kafkaDemo

下一章:springboot2.x +kafka使用和源码分析三(生产者配置)

springboot 整合kafka最强指南 首先部署好kafka和Zookeeper 可以参考我的其他博文 在Windows上搭建Kafka 或者Windows环境下Zookeeper安装配置 一、kafka与Spring版本对应的关系表 先看一下我的基础环境 springboot version:springboot2.1.3.RELEASE kafka version :2.2.4.RELEASE 集成之前先放上一张官网的kafka与Spring版本对应的关系表,后续如遇到消息不能正常发送接收就请排查一下是不是版本问题 官网链接:http 阅读详情

相关推荐

置顶必读(1) |《滚雪球学 Spring Boot 4.x》专栏目录导航篇(持续更新中)!

🏆 本文收录于 《滚雪球学 Spring Boot 4.x》 专栏。 本专栏面向 有一点 Java 基础,但没有系统学过 Spring Boot 的读者,采用“滚雪球式学习法”:先跑通、再理解、再重构、再上线,最终带你从第一个 Hello API 一路完成一个可部署、可监控、可扩展的后端项目。

**My Coding Family** 8万+

bug记录

Java的属性变量名都已小写字母开头,如:userName,showMessage等,但也存在着特殊情况,考虑到一些特定的有意思的英文缩略词如(USA,XML等),JavaBean也允许大写字母起头的属性变量名,不过必须满足“中属性也相同,或其中一个包含另一个的全部属性时,可以使用其中一个,而不再依赖另一个项目(前提是你只需要这部分,若还需要使用项目中其他。这两个端口在nacos原先的端口上(默认8848),进行一定偏移量自动生成(9848,9849)。的名字(要注意只修改其中一个项目的);

weixin_44603464的博客 977

易灵思Trion FPGA实战:5分钟搞定MIPI硬核配置(附Interface Designer避坑指南)

本文详细介绍了易灵思Trion FPGA中MIPI硬核的快速配置方法,通过Interface Designer工具实现从时钟配置到数据收发的全流程实战。特别针对初次接触Trion系列的设计师,提供了六个关键配置陷阱及解决方案,帮助开发者高效完成嵌入式视觉和高速数据传输项目。

eee77的博客 791

第二课 配置Topic

配置Topic

匿迹 1484

基于Vivado2025的UltraScale+时序收敛优化实战案例

深入解析在Vivado2025环境中针对UltraScale+架构的时序收敛挑战,结合实际设计案例,分享关键优化策略与操作技巧,显著提升设计性能与收敛效率。vivado2025的更新特性为时序优化带来新机遇。

weixin_33660045的博客 346

新手如何结合pbootCMS和宝塔面板快速构建网站

摘要: 新手可通过pbootCMS(轻量CMS)和宝塔面板(可视化工具)快速搭建网站,无需命令行。步骤包括:1) 准备服务器(Linux/CentOS7.x)和域名;2) 安装宝塔面板并配置LNMP环境(PHP7.4+MySQL5.7);3) 创建网站目录,上传并解压pbootCMS源码,设置文件权限;4) 运行安装向导,填写数据库信息和管理员账号;5) 测试前台/后台功能,优化性能并绑定域名。全程约30-60分钟,宝塔简化运维,pbootCMS便于内容管理,适合零基础用户。注意定期更新和备份以保障安全。

qinzhenyan的博客 1642

bug 记录

Java的属性变量名都已小写字母开头,如:userName,showMessage等,但也存在着特殊情况,考虑到一些特定的有意思的英文缩略词如(USA,XML等),JavaBean也允许大写字母起头的属性变量名,不过必须满足 “手动注入,通过获取上下文对象,然后再对这个对象进行解析,然后取出自己所要的那个对像。mapper.xml 文件中。

weixin_44603464的博客 1177

【上海大学计算机组成原理实验报告】一、数据传送实验

将58H写入A寄存器//将6BH写入W寄存器//将C3H写入R1寄存器//将C3H写入R1寄存器//了解实验仪器数据总线的控制方式//掌握数据传送的基本原理//掌握各寄存器的结构、工作原理及其控制方法//数据传送实验

HackerKevon的博客 3509

记一次 springboot集成kafka-本地连接服务器的kafka,连接不上的问题

yml中配置了bootstrap-servers:服务器地址:9092,但是连接时却报了 Connection to node -1 (localhost/127.0.0.1:9092) could not be established.

qq_39558519的博客 7706

AI原生应用在UGC内容审核中的实战经验

AI原生应用(AI-Native Application)——以机器学习模型为核心驱动力,深度整合数据、算法、工程架构的完整系统——为破解这一三角难题提供了全新范式。全链路数据驱动:从数据采集、模型训练到决策优化,形成闭环自治系统,无需人工规则干预多模态深度理解:同时处理文本、图像、音频、视频等多类型内容,理解语义而非简单匹配特征自适应进化能力:通过人机协同反馈持续学习新型违规模式,模型周级迭代成为常态审核效率提升300%:单条视频审核耗时从2.3秒降至0.7秒。

AI算力网络与通信的博客 1149

CMake教程:C++ CMake自定义find_package并在其它项目使用

find_package 是 CMake 中一个非常重要的命令,用于在系统中找到外部库或包,并将其包含到项目中。: 要查找的包的名称。[version]: 可选的版本号。如果指定了版本号,CMake 会尝试找到该版本或更高版本的包。[REQUIRED]: 如果指定了这个关键字,找不到包时会产生一个错误并终止配置过程。: 指定要查找的包的组件。: 指定可选的组件,即使找不到这些组件,配置过程也会继续。: 指定查找包的模式,CONFIG表示查找配置文件,MODULE表示查找模块文件。

琅嬛福地 1563

springboot2.x +kafka使用和源码分析八(自定义分区器)

1:DefaultPartitioner默认分区器 如果producer没指定落地到指定partition中,Kafak通过默认的分区器对数据进行partition,默认的分区的规则是对key进行hash取值 % 分区数, 相同的key会分布到同一分区中。如果没指定key,则就按照轮询算法将消息均匀的分布在主题的可用分区上。 /** * * 自定义分区器 */ public class...

F_Hello_World的博客 1257

Linux Kernel入门到精通系列讲解(RV-Kernel 篇) 5.5 RTC设备编写与实现

4. Linux kernel RTC子系统goldfish_rtc driver分析。电脑,会需要时间,还比如 我们的手机、平板,都需要时间;驱动基本就是应用层需要什么数据你给什么数据就行,基本必须实现的就是。3.2 Linux kernel RTC 设备描述符讲解。中看到他的具体实现,也可以根据他的寄存器描述直接在。5. 将驱动添加进kernel和测试RTC驱动。系统来说,时间是一个非常重要的功能;之类的函数接口,接下来我们就开始讲解如何写。,所以我们直接移植设备树即可。,他的寄存器很简单,你可以从。

DSMGUOGUO的博客 568

【RocketMq基础篇篇-01】环境搭建、基本使用、可视化界面

rocketmq源码核心篇1

zhenghuishengq的博客 3738

数据分享】中国12.5m数字高程模型(DEM)数据(分省)

数据名称:ALOS 12.5m DEM 数据。数据名称:ALOS 12.5m DEM 数据。数据大小:61.5GB。空间分辨率:12.5m。数据大小:61.5GB。空间分辨率:12.5m。

JData_Engineer的博客 5388

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

SpringBoot2.x系列教程63--SpringBoot整合消息队列之RabbitMQ详解

SpringBoot2.x系列教程63--SpringBoot整合消息队列之RabbitMQ详解 作者:一一哥 一. RabbitMQ 简介 1. RabbitMQ 背景 RabbitMQ起源于金融系统,主要用于分布式系统的内部各子系统之间的数据存储转发,这是系统解耦方面的一种运用. 2. RabbitMQ 概述 RabbitMQ是一种基于erlang语言开发的流行的开源消息中间件,或...

一一哥 1167

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C++第十六题20150408

#include int main() { int a,b,c; printf("请输入a,b,c:"); scanf("%d%d%d",&a,&b,&c); if (a>=b&&b>=c) printf("%d%d%d\n",c,b,a); else if (a>=c&&c>=b) printf("%d%d%d\n",b,c,a); else if (b>=a&&a>=c)

Saber1378418070的专栏 569

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Rea 的可选 NativeAOT 元数据恢复:Ghidra 无头适配器、构建链与证据边界

本篇基于 Rea(reverse-engineer-anything)仓库中的 [NativeAOT 元数据恢复文档](https://link.gitcode.com/i/f76c10633da9407e1f01748d0c9dd05b),系统讲解 Rea 如何以可选无头适配器接入 Washi1337/ghidra-nativeaot 上游分析原语:如何在受控环境下构建固定版本的 JAR、通过

gitblog_01160的博客 242

docker-compose快速部署Kafka,以及常见问题解决

文章目录一、概述二、服务不修改端口修改端口常用命令三、常见错误docker未启动报错:pull不下来启动容器报错java 端不识别容器名java 端获取topic超时 一、概述 二、服务 Kafka-manager使用docker-compose配置,遇到comsumers没有数据问题,生产版本不存在问题,故不深究。 不修改端口 # 包含了zk,采用默认端口2181,9092 $ curl -sSL https://raw.githubusercontent.com/bitnami/bitnami-dock

学习笔记 5110

Kafka安装部署及基本使用

Kafka单机安装部署 下载kafka https://archive.apache.org/dist/kafka/2.0.0/kafka_2.11-2.0.0.tgz 安装过程 安装过程非常简单,只需要解压就行,因为这个是编译好之后的可执行程序解压 tar -zxvf kafka_2.11-2.0.0.tgz 配置zookeeper 因为kafka依赖于zookeeper来做master选举一起其他数据的维护,所以需要先启动zookeeper节点 kafka内置了zookeeper的服务,所以在bi

qq_41665121的博客 654

使用Kafka客户端(spring-kafka)的Java API操作Kafka的Topic

记录:458 场景:在Spring Boot微服务集成Kafka客户端spring-kafka-2.8.2操作Kafka的Topic的创建和删除。

zhangbeizhen18的博客 4664

你的Kafka连不上、Topic创建不了?可能是这些参数没设置对!

Kafka作为一种分布式流处理平台,其配置选项非常多,尤其是在网络通信方面。`listeners`、`advertised.listeners`、`listener.security.protocol.map`、`inter.broker.listener.name`这四个配置项是Kafka中非常重要的网络配置,它们控制着Kafka集群如何与外部应用进行通信以及集群内部如何互相通信。理解这些配置项的关联性、使用场景和重要性,对于确保Kafka的可靠性、性能和安全性至关重要。

todoitbo的博客 1万+

kafka的安装及启动消费者报 Connection to node could not be established. Broker may not be vailable

下载地址 https://www.apache.org/dyn/closer.cgi?path=/kafka/2.4.0/kafka_2.12-2.4.0.tgz 解压并启动 下载后,解压放在D:\kafka目录下。 找到文件"D:\kafka\kafka_2.11-2.2.0\configserver.properties" 修改此处log.dirs=/tmp/kafka-logs to lo...

han_xiaoxue的博客 5467

Kafka中无法创建新的topic

记录一下自己曾经出错过的地方 输入 ./kafka-topics.sh --create --zookeeper 127.0.0.1:2181 ---partitions 1 --replication-factor 1 --topic test 以后出现 Exception in thread "main" joptsimple.UnrecognizedOptionException: -partitions is not a recognized option at jopts...

m0_49195536的博客 3400
上一篇: springboot2.x +kafka使用和源码分析一(自动装配)
下一篇: springboot2.x +kafka使用和源码分析三(生产者配置)
F_Hello_World
博客等级 码龄11年 38粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值