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

光模块基础知识【快速入门】02

光模块是用于交换机与设备之间传输的载体,是光纤通信系统中的核心器件。主要作用是发射端将设备的电信号转换成光信号。 光纤通道光模块和以太网光模块 光纤通道光模块 光纤通道(FC, Fiber Channel)是一种高速网络数据传输协议。光纤通道协议可以有序无损地传输原始数据,它主要用于在数据中心、电脑服务器、交换机与存储网络中进行数据传输。 FC光模块遵循FC协议,充当着光纤通道系统之间的接口,也是光纤存储网络设备间的接口。它们主要用于数据中心的光纤通道存储网络链接中。 FC光模块具有小型化和低.

Jin Hanquan的博客 3万+

第二课 配置Topic

配置Topic

匿迹 1484

嵌入式设备电量显示实战:MCP3421 ADC采集从原理到代码全解析(附避坑指南)

本文详细解析了嵌入式设备中MCP3421 ADC芯片在电量显示应用中的硬件设计、寄存器配置、I2C通信调试及低功耗优化策略。通过实战代码和避坑指南,帮助开发者实现高精度电量监测,特别针对I2C时序和分压电路设计等常见问题提供解决方案,适用于物联网终端和移动设备开发。

weixin_42525632的博客 387

海思ISP调优实战:从实验室到真实场景的IPC相机图像质量优化指南

本文深入探讨海思ISP调优在IPC相机图像质量优化中的实战应用,从实验室标定到真实场景部署的全链路调优方法。重点解决光照动态范围、色温变化和噪声特性等核心问题,提供AE权重表配置、CCM标定、3DNR时域滤波等关键技术方案,帮助实现从理论到实践的图像质量提升。

s3t4u的博客 750

bug 记录

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

weixin_44603464的博客 1177

Qwen-Image LoRA训练实战:从数据准备到异常修复的全流程解析

本文详细解析了Qwen-Image LoRA训练的全流程,从数据准备到参数优化再到异常修复。通过实战案例展示了如何利用LoRA技术微调Qwen-Image模型,提升中文场景下的图像生成质量,特别针对手脚生成异常等问题提供了有效解决方案。文章还分享了中文提示词优化技巧和高级训练方法,帮助开发者高效训练出高质量的LoRA模型。

lemon的博客 967

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

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

qq_39558519的博客 7706

【Android Performance】Android CPU调度模式详解:从performance到schedutil的Governor调优指南

本文系统讲解Android/Linux系统中的CPU频率调节策略(Governor),涵盖六大调度模式的底层工作原理:performance(性能优先)、powersave(省电优先)、conservative(保守调频)、ondemand(按需调频)、userspace(手动控制)以及schedutil(调度器驱动)。文中深入拆解每种Governor的调频决策逻辑、上升/下降曲线的差异、适用场景与选型建议,并配以实操命令演示如何查看可用Governor列表、动态切换调度模式以及多Cluster架构下的统一

weixin_44081096的博客 432

基于Simulink的无线充电系统LCC补偿网络建模与控制

本文详细介绍了基于Simulink的无线充电系统LCC补偿网络建模与控制方法。首先分析了无线充电系统面临的核心挑战,提出LCC补偿网络解决方案,阐述了其恒流输出和输入阻抗解耦原理。通过Simulink分步演示了系统建模过程,包括松耦合变压器、LCC+LC补偿网络、功率变换级搭建以及频率跟踪控制实现。仿真结果表明,LCC补偿系统在气隙变化和负载跳变下能保持输出电压稳定(波动±3%),效率达89%。文章还总结了工程实现要点,并探讨了动态充电、多负载系统等扩展应用。该教程为开发高效智能的无线充电系统提供了实用指导

amy_mhd的博客 63

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

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

F_Hello_World的博客 1257

利用插件扩展 Qt 应用程序

不仅 Qt 本身可以通过插件进行扩展,而且 Qt 应用程序也可以通过插件来扩展,这需要应用程序使用 `QPluginLoader` 检测和加载插件。

青春不老,奋斗不止! 1万+

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

rocketmq源码核心篇1

zhenghuishengq的博客 3737

AUTOSAR-SOMEIP配置总结

导入arxml之后someip信号一般以“pduSomeIp”开头或者“SomeIp”开头。以某个pdu为例,设置项“Pdu Default Partition Ref”主要是根据模块设计,配置相应的Ecuc核分区。在导入arxml之后someip信号中有三个特殊的信号,形如“SdInstance”开头的信号,设置项“Pdu Default Partition Ref”主要是根据模块设计,配置相应的Ecuc核分区。“EcuC”模块主要关注“EcucPduCollection”中的“Pdus”下面的配置。

xiandang8023的博客 4654

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

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

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

一一哥 1167

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

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

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

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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、付费专栏及课程。

余额充值