遇到的问题
在实际开发过程中,因为推送数据需要用到kafka,为了比较方便与后续其他需求需要使用kafka,所以开发的过程中是设想能写一个工具类,方便后续的使用,但是,测试不带认证的kafka服务端的时候,发送是正常的,但是实际情况是,对方的服务器需要认证,导致遇到连不上对方服务,推送失败的问题,需要找对方确认对方的认证配置信息。并且在查询怎么处理的时候,验证也出现了比较奇葩的情况,那本次文章就简单写遇到的问题和验证结果。
碰到的天坑
1.度的时候,总是说引入了配置文件就完事,其他的配置不需要再配sasl.jaas.config,但是我实际测试下来不行啊。还是得引入配置文件+配置参数设置(其实这边有个问题点,暂时是没空验证,配置文件如果内容是空,再去配置配置参数是否能发送成功这种情况,因为有搜到说是如果配置文件里面没读到内容才会读配置参数。验证过的情况是,第一种配置文件里面有内容,但是配置参数是空,第二种是没有配置文件,有配置参数,都是会连接失败的)。
2.第二个基于未来思考的问题是,这个引入的配置文件内容,是否可以多个。据度来度去的结果说是可以的,按顺序会去逐一匹配直到匹配成功,那就是下面配置的KafkaClient配置块是可以多个,就名称不一样就行。但是碍于条件限制,没试过。😀
处理步骤
-
加载配置
度了很多文章,都提到了需要在服务启动的时候引入认证配置文件,设置属性 java.security.auth.login.config,度了一下是有两种方式。
a). 在服务启动的时候用参数引入,命令如下:
第一种:java -Djava.security.auth.login.config=kafka_jaas_config.config -jar test.jar 这里的文件是在项目的根目录下,如图中圈起来的1部分
第二种:java -Djava.security.auth.login.config=classpath:kafka_jaas.config -jar test.jar 这里的文件是放在resource目录下,如图中圈起来的2部分
第三种:主机部署的时候,这个镜像上传到主机上,并且以docker部署,docker命令启动镜像的时候,用-v参数挂载主机配置文件路径到docker容器上,假设主机路径a目录下放了配置文件,挂载到了容器的目录b上那么,这个配置可以是-Djava.security.auth.login.config=/b/kafka_jaas.config
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.seri