首页 > 其他分享 >SpringBoot配置多个kafka配置

SpringBoot配置多个kafka配置

时间:2024-08-28 15:53:06浏览次数:11  
标签:return SpringBoot 配置 springframework kafka import secondKafkaProperties org

引入依赖

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

yml配置

有几个就配置几个 ,这里只配置两个

因为我在本地启动了两个kafka,所以bootstrap-servers这里分别指向两个不同端口的kafka地址

几个属性详细解释:

acks

 #acks = 0:设置成 表示 producer 完全不理睬 leader broker 端的处理结果。此时producer 发送消息后立即开启下 条消息的发送,根本不等待 leader broker 端返回结果
#acks= all 或者-1 :表示当发送消息时, leader broker 不仅会将消息写入本地日志,同时还会等待所有其他副本都成功写入它们各自的本地日志后,才发送响应结果给,消息安全但是吞吐量会比较低。
#acks = 1:默认的参数值。 producer 发送消息后 leader broker 仅将该消息写入本地日志,然后便发送响应结果给producer ,而无须等待其他副本写入该消息。折中方案,只要leader一直活着消息就不会丢失,同时也保证了吞吐量

auto-offset-reset:

#当kafka中没有初始offset或offset超出范围时将自动重置offset
# earliest:重置为分区中最小的offset;
# latest:重置为分区中最新的offset(消费分区中新产生的数据);
# none:只要有一个分区不存在已提交的offset,就抛出异常;

复制代码
spring:
  kafka:
    # 第一个kafka的配置
    first:
      bootstrap-servers: 127.0.0.1:9092 # 这个是kafka的地址,对应server.properties中配置的
      producer:                         # 生产者配置
        key-serializer: org.apache.kafka.common.serialization.StringSerializer  # Kafka提供的序列化和反序列化类
        value-serializer: org.apache.kafka.common.serialization.StringSerializer
        batch-size: 16384        # 批量大小
        buffer-memory: 33554432  # 生产端缓冲区大小
        retries: 10              # 消息发送重试次数
        acks: -1                  # 应答级别:多少个分区副本备份完成时向生产者发送ack确认(可选0、1、all/-1)
        properties:
          linger:
            ms: 2000             # 提交延迟
      consumer:  # 消费者配置
        key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
        value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
        group-id: testGroup           # 默认的消费组ID
        enable-auto-commit: true      # 是否自动提交offset 
        auto-commit-interval: 2000    # 提交offset延时(接收到消息后多久提交offset)
        max-poll-records: 500         # 单次拉取消息的最大条数,根据业务需要配置
        auto-offset-reset: latest
    # 第二个kafka的配置
    second:
      bootstrap-servers: 127.0.0.1:9093  # 这个是kafka的地址,对应server.properties中配置的
      producer:                          # 生产者配置
        key-serializer: org.apache.kafka.common.serialization.StringSerializer  # Kafka提供的序列化和反序列化类
        value-serializer: org.apache.kafka.common.serialization.StringSerializer
        batch-size: 16384         # 批量大小
        buffer-memory: 33554432   # 生产端缓冲区大小
        retries: 10               # 消息发送重试次数
        acks: -1                   # 应答级别:多少个分区副本备份完成时向生产者发送ack确认(可选0、1、all/-1)
        properties:
          linger:
            ms: 2000              # 提交延迟
      consumer: # 消费者配置
        key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
        value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
        group-id: testGroup           # 默认的消费组ID
        enable-auto-commit: true      # 是否自动提交offset 
        auto-commit-interval: 2000    # 提交offset延时(接收到消息后多久提交offset)
        max-poll-records: 500         # 单次拉取消息的最大条数,根据业务需要配置
        auto-offset-reset: latest

读取第一个kafka配置 

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.kafka.KafkaProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.config.KafkaListenerContainerFactory;
import org.springframework.kafka.core.ConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.listener.ConcurrentMessageListenerContainer;

/**
 * 第一个kafka配置
 *
 */
@Configuration
public class FirstKafkaConfig {

    /**
     * 读取第一个kafka配置
     * Primary注解表示默认以这个为准
     *
     * @return 第一个kafka配置
     */
    @Primary
    @ConfigurationProperties(prefix = "spring.kafka.first")
    @Bean
    public KafkaProperties firstKafkaProperties() {
        return new KafkaProperties();
    }

    /**
     * 构建第一个kafka的生产者发送template
     *
     * @param firstKafkaProperties 第一个kafka配置
     * @return 第一个kafka的生产者发送template
     */
    @Primary
    @Bean
    public KafkaTemplate<String, String> firstKafkaTemplate(
            @Autowired @Qualifier("firstKafkaProperties") KafkaProperties firstKafkaProperties) {
        return new KafkaTemplate<>(firstProducerFactory(firstKafkaProperties));
    }

    /**
     * 新建第一个kafka的生产者工厂
     *
     * @param firstKafkaProperties 第一个kafka配置
     * @return 第一个kafka的生产者工厂
     */
    private DefaultKafkaProducerFactory<String, String> firstProducerFactory(KafkaProperties firstKafkaProperties) {
        return new DefaultKafkaProducerFactory<>(firstKafkaProperties.buildProducerProperties());
    }

    /**
     * 构建第一个kafka的消费者监听容器工厂
     *
     * @param firstKafkaProperties 第一个kafka配置
     * @return 第一个kafka的消费者监听容器工厂
     */
    @Bean("firstKafkaListenerContainerFactory")
    public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<Integer, String>>
    firstKafkaListenerContainerFactory(@Autowired @Qualifier("firstKafkaProperties") KafkaProperties firstKafkaProperties) {
        ConcurrentKafkaListenerContainerFactory<Integer, String> factory =
                new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(firstConsumerFactory(firstKafkaProperties));
        return factory;
    }

    /**
     * 新建第一个kafka的消费者工厂
     *
     * @param firstKafkaProperties 第一个kafka配置
     * @return 第一个kafka的消费者工厂
     */
    private ConsumerFactory<? super Integer, ? super String> firstConsumerFactory(KafkaProperties firstKafkaProperties) {
        return new DefaultKafkaConsumerFactory<>(firstKafkaProperties.buildConsumerProperties());
    }


}

读取第二个kafka配置

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.kafka.KafkaProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.config.KafkaListenerContainerFactory;
import org.springframework.kafka.core.ConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.listener.ConcurrentMessageListenerContainer;

/**
 * 第二个kafka配置
 *
 */
@Configuration
public class SecondKafkaConfig {

    /**
     * 读取第二个kafka配置
     *
     * @return 第二个kafka配置
     */
    @ConfigurationProperties(prefix = "spring.kafka.second")
    @Bean("secondKafkaProperties")
    public KafkaProperties secondKafkaProperties() {
        return new KafkaProperties();
    }

    /**
     * 构建第二个kafka的生产者发送template
     *
     * @param secondKafkaProperties 第二个kafka配置
     * @return 第二个kafka的生产者发送template
     */
    @Bean
    public KafkaTemplate<String, String> secondKafkaTemplate(
            @Autowired @Qualifier("secondKafkaProperties") KafkaProperties secondKafkaProperties) {
        return new KafkaTemplate<>(secondProducerFactory(secondKafkaProperties));
    }

    /**
     * 新建第二个kafka的生产者工厂
     *
     * @param secondKafkaProperties 第二个kafka配置
     * @return 第二个kafka的生产者工厂
     */
    private DefaultKafkaProducerFactory<String, String> secondProducerFactory(KafkaProperties secondKafkaProperties) {
        return new DefaultKafkaProducerFactory<>(secondKafkaProperties.buildProducerProperties());
    }

    /**
     * 构建第二个kafka的消费者监听容器工厂
     *
     * @param secondKafkaProperties 第二个kafka配置
     * @return 第二个kafka的消费者监听容器工厂
     */
    @Bean("secondKafkaListenerContainerFactory")
    public KafkaListenerContainerFactory<ConcurrentMessageListenerContainer<Integer, String>>
    secondKafkaListenerContainerFactory(@Autowired @Qualifier("secondKafkaProperties") KafkaProperties secondKafkaProperties) {
        ConcurrentKafkaListenerContainerFactory<Integer, String> factory =
                new ConcurrentKafkaListenerContainerFactory<>();
        factory.setConsumerFactory(secondConsumerFactory(secondKafkaProperties));
        return factory;
    }

    /**
     * 新建第二个kafka的消费者工厂
     *
     * @param secondKafkaProperties 第二个kafka配置
     * @return 第二个kafka的消费者工厂
     */
    private ConsumerFactory<? super Integer, ? super String> secondConsumerFactory(KafkaProperties secondKafkaProperties) {
        return new DefaultKafkaConsumerFactory<>(secondKafkaProperties.buildConsumerProperties());
    }
}

创建两个生产者

@RestController
@RequestMapping("/producer1")
@Api(tags = "kafka生产者测试1")
public class ProducerDemoController1 {

    @Resource
    private KafkaTemplate<String, String> kafkaTemplate;

    /**
     * 发送消息
     *
     * @param msg
     * @return
     */
    @PostMapping("/sendMsg")
    public String sendMsg(@RequestParam(name = "msg", defaultValue = "hello kafka") String msg) {
        kafkaTemplate.send("YWZT-TOPIC-TEST", msg);
        return "消息已发送";
    }
}
@RestController
@RequestMapping("/producer2")
@Api(tags = "kafka生产者测试2")
public class ProducerDemoController2 {

    /**
     * 第二个kafka配置需要指定下名字 
     */
    @Resource(name = "secondKafkaTemplate")
    private KafkaTemplate<String, String> secondKafkaTemplate;

    /**
     * 发送消息
     *
     * @param msg
     * @return
     */
    @PostMapping("/sendMsg")
    public String sendMsg(@RequestParam(name = "msg", defaultValue = "hello kafka") String msg) {
        secondKafkaTemplate.send("YWZT-TOPIC-TEST", msg);
        return "消息已发送";
    }
}

创建两个消费者

@Slf4j
@Component
@RequiredArgsConstructor
public class YwztExConsumer1 {

    @KafkaListener(
        containerFactory = "firstKafkaListenerContainerFactory",
        topics = {"YWZT-TOPIC-TEST"},
        groupId = "testGroup")
    public void consumer(String value) throws JsonProcessingException {
        //获取报文
        log.info("------------------------报文信息----------------:{} ......", StrUtil.sub(value, 0, 400));
    }
    
}
@Slf4j
@Component
@RequiredArgsConstructor
public class YwztExConsumer2 {

    @KafkaListener(
            containerFactory = "secondKafkaListenerContainerFactory",
            topics = {"YWZT-TOPIC-TEST"},
            groupId = "testGroup")
    public void consumer(String value) throws JsonProcessingException {
        //获取报文
        log.info("------------------------报文信息----------------:{} ......", StrUtil.sub(value, 0, 400));
    }

}

标签:return,SpringBoot,配置,springframework,kafka,import,secondKafkaProperties,org
From: https://blog.csdn.net/bbj12345678/article/details/141640163

相关文章

  • Windows下安装Kafka3
    参考文章:Windows下安装Kafka3_kafka3window-CSDN博客安装配置Kafka首先在官网 ApacheKafka 下载Kafka二进制压缩包。无论是在CentOS还是在Windows下都是下载该压缩包,里面已经包含了KafkaLinux和windows平台下的可执行文件了。选择目前比较新的3.6.1版本下载将之前下载......
  • Java后端微服务架构下的配置动态刷新:Spring Cloud Bus
    Java后端微服务架构下的配置动态刷新:SpringCloudBus大家好,我是微赚淘客返利系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在微服务架构中,服务的配置管理是一个挑战,尤其是当配置需要动态更新时。SpringCloudBus提供了一种基于消息总线的配置刷新机制,允许配置更改在服务......
  • Spring Boot 整合 Kafka
    项目目录结构pom.xml<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--Spr......
  • Excel导入数据时,配置单元格样式大全(POI)
    Excel导入数据时,配置单元格样式大全一:基础配置1.字体样式:Fontfont=workbook.createFont();font.setFontName("Arial");//设置字体名称font.setFontHeightInPoints((short)12);//设置字体大小font.setBold(true);//设置粗体font.setItalic(true);//设置斜体f......
  • 【FreeRTOS+CubeMX】入门(三)--文件结构与参数配置
    文章目录FreeRTOS文件组成和基本原理文件构成基础知识![请添加图片描述](https://i-blog.csdnimg.cn/direct/a7a87a1201a448bb9ffa1dcd1e58a8ab.png)FreeRTOS配置及功能裁剪configparamters参数讲解FreeRTOS文件组成和基本原理此文章将详细讲解FreeRTOS的文件结构......
  • 为什么k8s节点要保持配置一致
            Kubernetes(简称为K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。K8s集群包含了多个节点,其中每个节点运行着Kubernetes代理(kubelet)和容器运行时(如Docker)。为了确保K8s集群的正常运行和高可用性,节点需要保持配置一致,这有以下几个原因:......
  • 最全!嵌入式STM32单片机开发环境配置教学Win/Mac!!!
    嵌入式STM32单片机开发环境配置教学Win/Mac    ·本教程支持Windows和Mac    ·Windows可选的开发软件为Keil、Clion、STM32CubeMX,可自由选择开发方式    ·Mac的开发环境为(Clion+OpenOCD+STM32CubeMX),仅支持HAL库Windows配置教程        在Windows......
  • Springboot计算机毕业设计汽车销售管理系统3ytu1
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,员工,汽车分类,汽车品牌,汽车颜色,汽车信息,汽车预订,汽车入库,数据统计,反馈信息开题报告内容一、毕业设计(论文)题目的来源、理论或实际应用意义1.1题目......
  • kafka如何合理设置broker、partition、consumer数量
    目录1.broker的数量最好大于等于partition数量2.consumer数量最好和partition数量一致3.总结1.broker的数量最好大于等于partition数量一个partition最好对应一个硬盘,这样能最大限度发挥顺序写的优势。一个broker如果对应多个partition,需要随机分发,顺序IO会退化成随机IO。实......
  • ensp使用交换机配置svi连通网段
    ensp使用交换机配置svi连通网段实验目的如下图所示,PC1、PC2、PC3分别位于不同网段,使用S5700型号交换机连接,目前需要配置交换机和主机,主机能够互相连通。常用命令uninen:关闭信息通知disipintb:显示端口ip配置情况(brief模式)disiprouting-table:显示路由表vlan<编号>......