SpringBoot实现kafka多源配置的示例代码

 更新时间:2024年06月06日 10:42:53   作者:it噩梦  
实际开发中,不同的topic可能来自不同的集群,所以就需要配置不同的kafka数据源,基于springboot自动配置的思想,最终通过配置文件的配置,自动生成生产者及消费者的配置,本文介绍了SpringBoot实现kafka多源配置,需要的朋友可以参考下

背景

实际开发中,不同的topic可能来自不同的集群,所以就需要配置不同的kafka数据源,基于springboot自动配置的思想,最终通过配置文件的配置,自动生成生产者及消费者的配置。

核心配置

自动化配置类

import com.example.kafka.autoconfig.CustomKafkaDataSourceRegister;
import com.example.kafka.autoconfig.kafkaConsumerConfig;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.config.SmartInstantiationAwareBeanPostProcessor;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.kafka.annotation.EnableKafka;

@EnableKafka
@Configuration(
        proxyBeanMethods = false
)
@ConditionalOnWebApplication
@EnableConfigurationProperties({kafkaConsumerConfig.class})
@Import({CustomKafkaDataSourceRegister.class})
public class MyKafkaAutoConfiguration implements BeanFactoryAware, SmartInstantiationAwareBeanPostProcessor {
    public MyKafkaAutoConfiguration() {
    }

    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        beanFactory.getBean(CustomKafkaDataSourceRegister.class);
    }
}

注册生产者、消费者核心bean到spring

public void afterPropertiesSet() {
        Map<String, ConsumerConfigWrapper> factories = kafkaConsumerConfig.getFactories();
        if (factories != null && !factories.isEmpty()) {
            factories.forEach((factoryName, consumerConfig) -> {
                KafkaProperties.Listener listener = consumerConfig.getListener();
                Integer concurrency = consumerConfig.getConcurrency();
                // 创建监听容器工厂
                ConcurrentKafkaListenerContainerFactory<String, String> containerFactory = createKafkaListenerContainerFactory(consumerConfig.buildProperties(), listener, concurrency);
                // 注册到容器
                if (!beanFactory.containsBean(factoryName)) {
                    beanFactory.registerSingleton(factoryName, containerFactory);
                }
            });
        }
        Map<String, KafkaProperties.Producer> templates = kafkaProducerConfig.getTemplates();
        if (!ObjectUtils.isEmpty(templates)) {
            templates.forEach((templateName, producerConfig) -> {
                //registerBean(beanFactory, templateName, KafkaTemplate.class, propertyValues);
                //注册spring bean的两种方式
                registerBeanWithConstructor(beanFactory, templateName, KafkaTemplate.class, producerFactoryValues(producerConfig.buildProperties()));
            });
        }
    }

配置spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.kafka.MyKafkaAutoConfiguration

yml配置

spring:
  kafka:
    multiple:
      consumer:
        factories:
          test-factory:
            key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
            value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
            bootstrap-servers: 192.168.56.112:9092
            group-id: group_a
            concurrency: 25
            fetch-min-size: 1048576
            fetch-max-wait: 3000
            listener:
              type: batch
            properties:
              spring-json-trusted-packages: '*'
        key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
        value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
        auto-offset-reset: latest
      producer:
        templates:
          test-template:
            bootstrap-servers: 192.168.56.112:9092
            key-serializer: org.apache.kafka.common.serialization.StringSerializer
            value-serializer: org.apache.kafka.common.serialization.StringSerializer
        key-serializer: org.apache.kafka.common.serialization.StringSerializer
        value-serializer: org.apache.kafka.common.serialization.StringSerializer

使用

在这里插入图片描述

在这里插入图片描述

到此这篇关于SpringBoot实现kafka多源配置的示例代码的文章就介绍到这了,更多相关SpringBoot kafka多源配置内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 浅谈Java中ABA问题及避免

    浅谈Java中ABA问题及避免

    这篇文章主要介绍了浅谈Java中ABA问题及避免,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • Java中常用时间的一些相关方法

    Java中常用时间的一些相关方法

    日期的使用多种多样,但万变不离其宗,下面这篇文章主要给大家介绍了关于Java中常用时间的一些相关方法,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2021-10-10
  • Mybatis返回单个实体或者返回List的实现

    Mybatis返回单个实体或者返回List的实现

    这篇文章主要介绍了Mybatis返回单个实体或者返回List的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • Java多线程实战之交叉打印的两种方法

    Java多线程实战之交叉打印的两种方法

    今天小编就为大家分享一篇关于Java多线程实战之交叉打印的两种方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • java实现登录之后抓取数据

    java实现登录之后抓取数据

    这篇文章给大家分享了用JAVA实现在登陆以后抓取网站的数据的相关知识,有兴趣的朋友可以测试参考下。
    2018-07-07
  • SpringBoot如何根据目录路径生成接口的url路径

    SpringBoot如何根据目录路径生成接口的url路径

    这篇文章主要介绍了SpringBoot如何根据目录路径生成接口的url路径,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • Java使用ChatGPT的API详解

    Java使用ChatGPT的API详解

    OpenAI API 几乎可以应用于任何涉及理解或生成自然语言或代码的任务。本文将带你们介绍Java如何使用ChatGPT的API,感兴趣的同学可以跟着小编一起来学习
    2023-04-04
  • Spring Boot应用开发初探与实例讲解

    Spring Boot应用开发初探与实例讲解

    这篇文章主要介绍了Spring Boot应用开发初探与实例讲解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • SpringCloud中的Feign详解

    SpringCloud中的Feign详解

    这篇文章主要介绍了SpringCloud中的Feign详解,Feign是一个声明式的Web Service客户端,以Java接口注解的方式调用Http请求,同时Feign整合了Ribbon和Hystrix,实现负载均衡与容断功能,需要的朋友可以参考下
    2023-09-09
  • springboot项目docker分层构建的配置方式

    springboot项目docker分层构建的配置方式

    在使用dockerfile构建springboot项目时,速度较慢,用时比较长,为了加快构建docker镜像的速度,采用分层构建的方式,这篇文章主要介绍了springboot项目docker分层构建,需要的朋友可以参考下
    2024-03-03

最新评论