springboot使用kafka推送数据到服务端的操作方法带认证

 更新时间:2024年11月06日 10:22:29   作者:Alina_shu  
在使用Kafka进行数据推送时,遇到认证问题导致连接失败,本文详细介绍了Kafka的认证配置过程,包括配置文件的引入和参数设置,实际测试表明,需要正确配置sasl.jaas.config以及其他认证参数,探讨了配置文件是否可以同时存在多个配置块的可能性,并提出了实际操作中的注意事项

遇到的问题

在实际开发过程中,因为推送数据需要用到kafka,为了比较方便与后续其他需求需要使用kafka,所以开发的过程中是设想能写一个工具类,方便后续的使用,但是,测试不带认证的kafka服务端的时候,发送是正常的,但是实际情况是,对方的服务器需要认证,导致遇到连不上对方服务,推送失败的问题,需要找对方确认对方的认证配置信息。并且在查询怎么处理的时候,验证也出现了比较奇葩的情况,那本次文章就简单写遇到的问题和验证结果。

碰到的天坑

1.度的时候,总是说引入了配置文件就完事,其他的配置不需要再配sasl.jaas.config,但是我实际测试下来不行啊。还是得引入配置文件+配置参数设置。
2.第二个基于未来思考的问题是,这个引入的配置文件内容,是否可以多个。据度来度去的结果说是可以的,按顺序会去逐一匹配直到匹配成功,那就是下面配置的KafkaClient配置块是可以多个,就名称不一样就行。但是碍于条件限制,没试过。😀

处理步骤

加载配置
度了很多文章,都提到了需要在服务启动的时候引入认证配置文件,设置属性 java.security.auth.login.config,度了一下是有两种方式。
a). 在服务启动的时候用参数引入,命令如下:
java -Djava.security.auth.login.config=(具体地址自己填,因为我配置文件是跟test.jar同级目录所以无前缀)kafka_jaas_config.config -jar test.jar
b). 在代码中去引入,如:(这方式我是没试的)
System.setProperty(“java.security.auth.login.config”, “kafka_jaas_config.config”);

c). 配置文件的内容(注意password后面那个该死的分号是要的,配置参数设置的时候也是要的)

KafkaClient {  
    org.apache.kafka.common.security.scram.ScramLoginModule required  
    username="user"  
    password="123";  
};

设置认证参数(如果有的话)
类似要填的参数是:
security.protocol,sasl.mechanism,sasl.jaas.config(,sasl.username和sasl.password,这两个我看是高版本直接配置据说能认证,不需要sasl.jaas.config,但是低版本是需要sasl.jaas.config,所以建议是可以都配上)
such as :

props.put("sasl.jaas.config", "org.apache.kafka.common.security.scram.ScramLoginModule required username=\"user\" password=\"123\";");

工具类 

package platform.cars.utils;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.common.serialization.StringSerializer;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.core.DefaultKafkaProducerFactory;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.kafka.core.ProducerFactory;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Retryable;
import javax.annotation.PreDestroy;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
/**
 * @Auther: Ms.y
 */
@Configuration
public class KafkaUtil {
    private static final ConcurrentHashMap<String, KafkaTemplate<String, String>> templateCache = new ConcurrentHashMap<>();
    private Map<String, Object> kafkaProducerConfigs(String servers, Map<String, Object> otherConfigs) {
        Map<String, Object> props = new HashMap<>();
        props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, servers);
        props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class);
        if (otherConfigs != null){
            otherConfigs.forEach(props::put);
        }
        return props;
    }
    public KafkaTemplate<String, String> getKafkaTemplate(String servers, Map<String, Object> otherConfigs) {
        return templateCache.computeIfAbsent(servers, bs -> createKafkaTemplate(bs, otherConfigs));
    }
    private KafkaTemplate<String, String> createKafkaTemplate(String servers, Map<String, Object> otherConfigs) {
        Map<String, Object> configs = kafkaProducerConfigs(servers, otherConfigs);
        ProducerFactory<String, String> producerFactory = new DefaultKafkaProducerFactory<>(configs);
        return new KafkaTemplate<>(producerFactory);
    }
    @PreDestroy
    public void destroy() {
        for (KafkaTemplate<String, String> template : templateCache.values()) {
            template.destroy();
        }
    }
}

怎么用

1.正常的autowired就行
2.自己查配置还有是否需要认证的信息
3.获取template去发送数据
4.处理结果

Map<String,Object> configs = new HashMap<>();
//自己给configs 填值
KafkaTemplate kafkaTemplate = kafkaUtil.getKafkaTemplate("ip:port",configs);
kafkaTemplate.send("topic名称", "消息内容");

废话

我这是因为为了方便加了个缓存队列,存储了kafka已经连过的服务,不需要的话完全可以自己改造去掉这部分。如果有可以精进的问题可以提啊,欢迎挑刺。

到此这篇关于springboot使用kafka推送数据到服务端,带认证的文章就介绍到这了,更多相关springboot kafka推送数据内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 简单快速对@RequestParam声明的参数作校验操作

    简单快速对@RequestParam声明的参数作校验操作

    这篇文章主要介绍了简单快速对@RequestParam声明的参数作校验操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • 教你使用java将excel数据导入MySQL

    教你使用java将excel数据导入MySQL

    今天教大家如何使用Java将excel数据导入MySQL,文中有非常详细的代码示例,对正在学习java的小伙伴呢很有帮助,需要的朋友可以参考下
    2021-05-05
  • Java实现简单的扫雷图

    Java实现简单的扫雷图

    这篇文章主要为大家详细介绍了Java实现简单的扫雷图,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Maven编译遇到Process terminated问题(四种情况全部解决)

    Maven编译遇到Process terminated问题(四种情况全部解决)

    这篇文章主要介绍了Maven编译遇到Process terminated问题(四种情况全部解决),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-07-07
  • Spring底层原理由浅入深探究

    Spring底层原理由浅入深探究

    Spring事务有可能会提交,回滚、挂起、恢复,所以Spring事务提供了一种机制,可以让程序员来监听当前Spring事务所处于的状态,这篇文章主要介绍了Spring底层事务原理,需要的朋友可以参考下
    2023-02-02
  • Java Collections.shuffle()方法案例详解

    Java Collections.shuffle()方法案例详解

    这篇文章主要介绍了Java Collections.shuffle()方法案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • Spring Core核心类库的功能与应用实践分析

    Spring Core核心类库的功能与应用实践分析

    本文详细介绍了SpringCore核心类库的功能、应用实践和底层原理,SpringCore提供了控制反转(IOC)、依赖注入(DI)、Bean管理以及JNDI、定时任务等企业级功能,文章通过多个Java示例展示了SpringCore的应用,感兴趣的朋友跟随小编一起看看吧
    2024-12-12
  • Springboot与vue实现数据导出方法具体介绍

    Springboot与vue实现数据导出方法具体介绍

    这篇文章主要介绍了Springboot与vue实现数据导出方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
    2023-02-02
  • Java实现双向链表(两个版本)

    Java实现双向链表(两个版本)

    这篇文章主要介绍了Java实现双向链表(两个版本)的相关资料,需要的朋友可以参考下
    2016-02-02
  • 简单实现java音乐播放器

    简单实现java音乐播放器

    这篇文章主要为大家详细介绍了java实现音乐播放器的相关代码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-06-06

最新评论