圣诞也要撸代码 |【消息中间件MQ系列】Spring整合kafka并设置多套kafka配置

news2025/1/16 3:32:42

 1、前言

        圣诞节的到来,程序员不会收到圣诞老人的🎁,但可以自己满足一下自己,所以,趁着有时间,就记录一下这会儿撸了些什么代码吧!!!

        因为业务原因,需要在系统内新增其他的kakfa配置使用,所以今天研究的是怎么在系统内整合多套kafka配置使用。


2、整合kafka实践

首先,引入pom依赖,我的版本是 2.3.1 

<dependency>
    <groupId>org.springframework.kafka</groupId>
    <artifactId>spring-kafka</artifactId>
</dependency>

然后,设置properties配置:

spring.kafka.bootstrap-servers=127.0.0.1:9090,127.0.0.1:9091,127.0.0.1:9092
spring.kafka2.bootstrap-servers=127.0.0.2:9090,127.0.0.2:9091,127.0.0.2:9092

 另外还可以设置很多其他配置,例如生产者、消费者各自的消息序列化、消费模式等等,

具体的配置样例,请参考如下:

#################consumer的配置参数(开始)#################
#如果'enable.auto.commit'为true,则消费者偏移自动提交给Kafka的频率(以毫秒为单位),默认值为5000。
spring.kafka.consumer.auto-commit-interval;
 
#当Kafka中没有初始偏移量或者服务器上不再存在当前偏移量时该怎么办,默认值为latest,表示自动将偏移重置为最新的偏移量
# latest:不存在offset时,消费最新的消息
# earliest:不存在offset时,从最早消息开始消费
# none :不存在offset时,直接报错
spring.kafka.consumer.auto-offset-reset=latest;
 
#以逗号分隔的主机:端口对列表,用于建立与Kafka群集的初始连接。
spring.kafka.consumer.bootstrap-servers;
 
#ID在发出请求时传递给服务器;用于服务器端日志记录。
spring.kafka.consumer.client-id;
 
#如果为true,则消费者的偏移量将在后台定期提交,默认值为true
spring.kafka.consumer.enable-auto-commit=true;
 
#如果没有足够的数据立即满足“fetch.min.bytes”给出的要求,服务器在回答获取请求之前将阻塞的最长时间(以毫秒为单位)
#默认值为500
spring.kafka.consumer.fetch-max-wait;
 
#服务器应以字节为单位返回获取请求的最小数据量,默认值为1,对应的kafka的参数为fetch.min.bytes。
spring.kafka.consumer.fetch-min-size;
 
#用于标识此使用者所属的使用者组的唯一字符串。
spring.kafka.consumer.group-id;
 
#心跳与消费者协调员之间的预期时间(以毫秒为单位),默认值为3000
spring.kafka.consumer.heartbeat-interval;
 
#密钥的反序列化器类,实现类实现了接口org.apache.kafka.common.serialization.Deserializer
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
 
#值的反序列化器类,实现类实现了接口org.apache.kafka.common.serialization.Deserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
 
#一次调用poll()操作时返回的最大记录数,默认值为500
spring.kafka.consumer.max-poll-records;
#################consumer的配置参数(结束)#################
#################producer的配置参数(开始)#################
#procedure要求leader在考虑完成请求之前收到的确认数,用于控制发送记录在服务端的持久化,其值可以为如下:
#acks = 0 如果设置为零,则生产者将不会等待来自服务器的任何确认,该记录将立即添加到套接字缓冲区并视为已发送。在这种情况下,无法保证服务器已收到记录,并且重试配置将不会生效(因为客户端通常不会知道任何故障),为每条记录返回的偏移量始终设置为-1。
#acks = 1 这意味着leader会将记录写入其本地日志,但无需等待所有副本服务器的完全确认即可做出回应,在这种情况下,如果leader在确认记录后立即失败,但在将数据复制到所有的副本服务器之前,则记录将会丢失。
#acks = all 这意味着leader将等待完整的同步副本集以确认记录,这保证了只要至少一个同步副本服务器仍然存活,记录就不会丢失,这是最强有力的保证,这相当于acks = -1的设置。
#可以设置的值为:all, -1, 0, 1
spring.kafka.producer.acks=1
 
#每当多个记录被发送到同一分区时,生产者将尝试将记录一起批量处理为更少的请求, 
#这有助于提升客户端和服务器上的性能,此配置控制默认批量大小(以字节为单位),默认值为16384
spring.kafka.producer.batch-size=16384
 
#以逗号分隔的主机:端口对列表,用于建立与Kafka群集的初始连接
spring.kafka.producer.bootstrap-servers
 
#生产者可用于缓冲等待发送到服务器的记录的内存总字节数,默认值为33554432
spring.kafka.producer.buffer-memory=33554432
 
#ID在发出请求时传递给服务器,用于服务器端日志记录
spring.kafka.producer.client-id
 
#生产者生成的所有数据的压缩类型,此配置接受标准压缩编解码器('gzip','snappy','lz4'),
#它还接受'uncompressed'以及'producer',分别表示没有压缩以及保留生产者设置的原始压缩编解码器,
#默认值为producer
spring.kafka.producer.compression-type=producer
 
#key的Serializer类,实现类实现了接口org.apache.kafka.common.serialization.Serializer
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
 
#值的Serializer类,实现类实现了接口org.apache.kafka.common.serialization.Serializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
 
#如果该值大于零时,表示启用重试失败的发送次数
spring.kafka.producer.retries
#################producer的配置参数(结束)#################
#################listener的配置参数(结束)#################
#侦听器的AckMode,参见https://docs.spring.io/spring-kafka/reference/htmlsingle/#committing-offsets
#当enable.auto.commit的值设置为false时,该值会生效;为true时不会生效
spring.kafka.listener.ack-mode;
 
#在侦听器容器中运行的线程数
spring.kafka.listener.concurrency;
 
#轮询消费者时使用的超时(以毫秒为单位)
spring.kafka.listener.poll-timeout;
 
#当ackMode为“COUNT”或“COUNT_TIME”时,偏移提交之间的记录数
spring.kafka.listener.ack-count;
 
#当ackMode为“TIME”或“COUNT_TIME”时,偏移提交之间的时间(以毫秒为单位)
spring.kafka.listener.ack-time;
#################listener的配置参数(结束)#################

最后,编写kafka的config配置类:

package ***.***.***.kafka;

import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.StringSerializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.EnableKafka;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;

import java.util.HashMap;
import java.util.Map;

@Configuration
@EnableKafka
public class KafkaConfiuration {

	@Value("${spring.kafka.bootstrap-servers}")
	private String bootstrapServer;
	
	@Value("${spring.kafka2.bootstrap-servers}")
	private String bootstrapServer2;

	@Bean("kafkaTemplateOne")
	public KafkaTemplate<String, String> oneReqKafkaTemplate() {
		return new KafkaTemplate<>(oneEnquiryReqFactory());
	}

	@Bean
	public ProducerFactory<String, String> oneEnquiryReqFactory() {
		return new DefaultKafkaProducerFactory<>(oneProducerConfigs());
	}

	@Bean
	public Map<String, Object> oneProducerConfigs() {
		Map<String, Object> props = new HashMap<>();
		props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServer);
		props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
		props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
 		return props;
	}

	@Bean("kafkaTemplateTwo")
	public KafkaTemplate<String, String> twoKafkaTemplate() {
		return new KafkaTemplate<>(twoFactory());
	}

	@Bean
	public ProducerFactory<String, String> twoFactory() {
		return new DefaultKafkaProducerFactory<>(twoProducerConfigs());
	}

	@Bean
	public Map<String, Object> twoProducerConfigs() {
		Map<String, Object> props = new HashMap<>();
		props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServer2);
		props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
		props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
		return props;
	}
}

配置完成之后,就可以直接使用啦:

package ***.***.***.controller;

import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController
public class KafkaTestController {
	
	@Resource(name = "kafkaTemplateOne")
	private KafkaTemplate<String, String> kafkaTemplateOne;
	
	@Resource(name = "kafkaTemplateTwo")
	private KafkaTemplate<String, String> kafkaTemplateTwo;
	
	private final static String TOPIC1 = "testTopic1";
	private final static String TOPIC2 = "testTopic2";
	
	@PostMapping("/testKafka")
	public void testKafka(){
		kafkaTemplateOne.send(TOPIC1,"test message 1");
		kafkaTemplateTwo.send(TOPIC2,"test message 2");
	}
	
	@KafkaListener(groupId = "TOPIC_DATA_ACCOUNT_GROUPID",topics = TOPIC1)
	public void receiveMsg(String msg){
		System.out.println(TOPIC1+" 接收到的消息是:"+msg);
	}
	
	@KafkaListener(groupId = "TOPIC_DATA_ACCOUNT_GROUPID",topics = TOPIC2)
	public void receiveMsg1(String msg){
		System.out.println(TOPIC2+" 接收到的消息是:"+msg);
	}
}

效果如下:

2022-11-15 18:35:28,973 [kafka-producer-network-thread | producer-2] [] INFO (Metadata.java:261)- [Producer clientId=producer-2] Cluster ID: SrufjpSTQpiu0QseCKbwYg
testTopic2 接收到的消息是:test message 2
testTopic1 接收到的消息是:test message 1


3、总结

        本次的记录内容,只是简单的demo实践,具体的使用情况,可以根据自身系统设置详细配置处理。
        若有疑问,欢迎留言讨论~~。

        最后祝大家圣诞节快乐,新年快到了,继续加油吧!!!

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/117442.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

事务日志undo log

事务日志undo log 1 Undo日志的作用 作用1&#xff1a;回滚数据 逻辑上恢复&#xff0c;之前插入了一条数据&#xff0c;已经开辟了物理空间&#xff0c;回滚只是将该数据删除&#xff0c;物理空间还存在。 作用2&#xff1a;MVCC 2 Undo存储结构 mysql> show variables …

java生成SSL证书并添加信任,tomcat配置https访问并解决扫描漏洞问题

一、java生成keystore密钥对 1、打开jdk的bin目录&#xff0c;使用keytool工具生成keystore密钥对 Keytool 是一个 Java 数据证书的管理工具 &#xff0c;Keytool 将密钥&#xff08;key&#xff09;和证书&#xff08;certificates&#xff09;存储于一个称为 keystore 的密…

某车企用户数据泄露,新能源汽车信息安全问题不容忽视

某车企&#xff1a;公司核心数据被窃取 12月20日&#xff0c;国内某新能源汽车发布相关声明称&#xff0c;2022年12月11日&#xff0c;其收到外部邮件&#xff0c;声称拥有该车企内部数据&#xff0c;并以泄露数据勒索225万美元等额比特币&#xff08;约合1570.5万元人民币&am…

FFmpeg学习笔记--Ubuntu20.04编译安装FFmpeg、FFplay和FFprobe

目录 1--下载FFmpeg 2--编译FFmpeg 3--设置环境变量 4--测试 1--下载FFmpeg ① 下载 5.1 版本的 ffmpeg wget http://www.ffmpeg.org/releases/ffmpeg-5.1.tar.gz ② 解压下载的压缩包 tar -zxvf ffmpeg-5.1.tar.gz 2--编译FFmpeg ① 进入解压后的文件夹 cd ffmpeg-5…

基于JAVA Spring Boot高颜值的教学管理平台(含小程序),提供权限管理、考试、问卷、练习、在线学习等功能

Welcome to sg-exam-next &#x1f44b; 硕果云&#xff0c;基于Spring Boot搭建的方便易用、高颜值的教学管理平台&#xff0c;提供权限管理、考试、问卷、练习等功能 主要功能为在线学习、考试、练习 课程内容支持图文、视频&#xff0c;考试类型支持考试、练习、问卷 题型支…

Android插件化技术——【class学习】

class 文件的定义 class 文件就是能够被 JVM 识别&#xff0c;加载并且执行的文件格式。从定义来看&#xff0c;class 文件没有想象中的那么神秘&#xff0c;和其他格式如 txt&#xff0c;mp4 一样&#xff0c;只是一种文件格式&#xff0c;它存储的是我们应用程序。 不止 Ja…

matlab/simulink中关于如何使得信号FFT和IFFT前后功率保持一致

快速傅里叶变换FFT其实是一种对离散傅里叶变换DFT的快速算法 为了便于公式推导和理解&#xff0c;本文从DFT的公式出发进行解释&#xff0c;在帕萨瓦尔定律的条件下&#xff0c;探究如何保证FFT/IFFT前后信号功率保持一致。 目录模型假设FFT前后功率保持一致IFFT前后功率保持一…

Bluetooth LE相关学习笔记

The Bluetooth LE Specifications The Bluetooth Core Specification 核心规范适用于 Bluetooth LE和Bluetooth Classic&#xff0c;它定义了蓝牙的体系结构及其层次&#xff0c;描述和定义了蓝牙的关键特性&#xff0c;定义了设备在协议栈的特定层上进行重要操作的方法和通信…

【圣诞限定】2022的末尾,送TA一颗圣诞树吧

2022年圣诞节&#xff0c;很高兴能遇见你。 一、前言 不知不觉又到年末啦&#xff0c;今年遇到了超级超级棒的人&#xff0c;希望能跟他一起做很多很多事&#xff0c;完成很多很多未完成的心愿。既然是圣诞节限定&#xff0c;那就送他一颗圣诞树吧&#x1f384;天天开心&#…

开发者百宝箱——DevToys

开发者百宝箱——DevToys 文章目录 简介安装转换类型编码/解码格式化生成器文本处理图片设置参考文献 简介 DevToys 是一个开发人员的工具箱&#xff0c;基于 UWP 开发&#xff0c;免费开源无广告&#xff0c;支持中文&#xff0c;功能有&#xff1a; 转换类型 JSON / YAML…

【C语言进阶】指针的进阶

在初级阶段的《指针》章节已经接触过了&#xff0c;我们知道了指针的概念&#xff1a; 1. 指针就是个变量&#xff0c;用来存放地址&#xff0c;地址唯一标识一块内存空间。 2. 指针的大小是固定的4/8个字节&#xff08;32位平台/64位平台&#xff09;。 3. 指针是有类型&#…

Word处理控件Aspose.Words功能演示:使用 C# 将 PowerPoint 演示文稿转换为 Word 文档

Aspose.Words 是一种高级Word文档处理API&#xff0c;用于执行各种文档管理和操作任务。API支持生成&#xff0c;修改&#xff0c;转换&#xff0c;呈现和打印文档&#xff0c;而无需在跨平台应用程序中直接使用Microsoft Word。此外&#xff0c; Aspose API支持流行文件格式处…

Android自动化打包记录--Jenkins+Docker+WSL2

Android自动化打包记录--JenkinsDockerWSL2前言自动化流程测试环境生产环境自动化原理Windows下安装Ubuntu安装步骤相关error处理error: 0x8007019eerror: 0x800701bc、0x80370102WSL访问WindowsWSL访问内网Ubuntu下Docker内容安装运行HelloWorld拉取镜像镜像和容器命令创建镜像…

你不一定了解MySQL中的Decimal数据类型

一、前言 在此之前笔者写过一篇博客《你说精通MySQL其实很菜jī&#xff08;1&#xff09;&#xff1a;你不一定会的基本技巧或知识点&#xff08;值得一看&#xff09;》&#xff0c;本文内容是从那篇博客截取出来的。MySQL中Decimal数据类型大家经常使用到&#xff0c;但是&a…

从零了解多线程(万字详解)

目录 为什么要引入多线程? 为什么线程更轻? 线程和进程的关系 多线程的弊端 Thread类 用Thread类创建一个线程并启动它 用一段通过多线程体现并发执行的效果 start和run的区别 使用jdl自带的工具包jconsole查看当前java进程中的所有线程 调用栈 注意: jave中创建线…

Duplicate File Finder Pro - 重复文件查找器,给你的 Mac 清理出大量磁盘空间

Duplicate File Finder Pro - 重复文件查找器&#xff0c;给你的 Mac 清理出大量磁盘空间 重复文件查找器 Duplicate File Finder Pro 是一个实用程序&#xff0c;只需3次点击就能在Mac上找到重复的文件。拖放功能和尽可能多的文件夹&#xff0c;你想&#xff0c;然后按下扫描按…

理解Linux中的进程状态

文章目录运行状态阻塞状态挂起状态磁盘睡眠状态暂停状态追踪停止状态僵尸状态死亡状态孤儿状态Linux内核进程状态源代码一台电脑一般只有一个CPU、一个磁盘&#xff08;无论一台电脑有几个CPU、磁盘&#xff0c;数量都是远少于进程的&#xff0c;这里举例用一个&#xff09;。运…

2022年广西食品安全管理员模拟试题及答案

百分百题库提供食品安全管理员考试试题、食品安全管理员考试预测题、食品安全管理员考试真题、食品安全管理员证考试题库等&#xff0c;提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻松过关。 一、单选题 1.&#xff08;重点&#xff09;《上海市集体用餐配…

深度对比MemcacheD 和 Redis,论你不知道的二三事

谈到深度对比MemcacheD 和 Redis&#xff0c;作为老牌程序员首先想到的就是Memcache好一点&#xff0c;毕竟更节省内存。还可以存图片视频之类的&#xff0c;大部分市面上的cache都是MemcacheD。 但是评价一款cache并不能只看这一方面不是~ 数据存储的安全系数 要知道&#…

2023春招面试题:Redis数据库面试题整理

redis是什么&#xff1f;&#xff08;必会&#xff09; Redis 是 C 语言开发的一个开源的&#xff08;遵从 BSD 协议&#xff09;高性能非关系型&#xff08;NoSQL&#xff09;的&#xff08;key-value&#xff09;键值对数据库。可以用作数据库、缓存、消息中间件等。 redis…