springboot kafka SASL_SSL SCRAM-SHA-512 ,外加打包jar读不到.jks文件解决方法


 springboot  kafka   SASL_SSL   SCRAM-SHA-512 ,外加打包jar读不到.jks文件解决方法

配置文件:
kafka:
  ssl:
    truststore-location: D:\client_truststore.jks
    truststore-password: asfaf
    
配置类: 
import org.apache.commons.io.FileUtils;
import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.common.config.SaslConfigs;
import org.apache.kafka.common.config.SslConfigs;
import org.apache.kafka.common.serialization.StringDeserializer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.system.ApplicationHome;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.EnableKafka;
import org.springframework.kafka.config.ConcurrentKafkaListenerContainerFactory;
import org.springframework.kafka.core.ConsumerFactory;
import org.springframework.kafka.core.DefaultKafkaConsumerFactory;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

/**
 * Created  
 */
@Configuration
@EnableKafka
public class KafkaConsumerConfig {

    @Value("${kafka.ssl.truststore-location}")
    private String truststore_location;

    @Value("${kafka.ssl.truststore-password}")
    private String truststore_password;

    /**
     * 配置监听,将消费工厂信息配置进去
     * @return ConcurrentKafkaListenerContainerFactory
     */
    @Bean
    public ConcurrentKafkaListenerContainerFactory kafkaListenerContainerFactory(){
        ConcurrentKafkaListenerContainerFactory factory = new ConcurrentKafkaListenerContainerFactory();
        factory.setConsumerFactory(consumerFactory());
        return factory;
    }

    /**
     * 消费
     * 消费工厂 
     * @return ConsumerFactory
     */
    @Bean
    public ConsumerFactory consumerFactory(){
        return new DefaultKafkaConsumerFactory(consumerConfigs());
    }

    /**
     * 消费配置
     * @return Map
     */
    public Map consumerConfigs(){
        HashMap props = new HashMap();
        props.put("enable.auto.commit", "true");
        props.put(ConsumerConfig.CLIENT_ID_CONFIG, "my-consumer");

        props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "*****:9092,*****:9092,*****:9092");
        props.put(ConsumerConfig.GROUP_ID_CONFIG, "Mygrouname");
        props.put(ConsumerConfig.SESSION_TIMEOUT_MS_CONFIG, "30000");
        props.put(ConsumerConfig.AUTO_COMMIT_INTERVAL_MS_CONFIG, "1000");
        props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, StringDeserializer.class.getName());
        props.put(ConsumerConfig.AUTO_OFFSET_RESET_CONFIG, "earliest");
        props.put("security.protocol", "SASL_SSL");
        props.put(SaslConfigs.SASL_MECHANISM, "SCRAM-SHA-512");

        //打包成jar后,无法找到文件的解决方法(复制jar包里的文件,到文件目录里)
        ApplicationHome applicationHome = new ApplicationHome(KafkaConsumerConfig.class);
        //项目打包成jar包所在的根路径
        String rootPath = applicationHome.getSource().getParentFile().toString();
        String configFilePath = rootPath + "\\client_truststore.jks";
        File configFile = new File(configFilePath);
        if (!configFile.exists()) {
            try {
                //获取类路径下的指定文件流  (项目目录下的:  /resource/libs/client_truststore.jks)
                InputStream in = this.getClass().getClassLoader().getResourceAsStream("libs/client_truststore.jks");
                FileUtils.copyInputStreamToFile(Objects.requireNonNull(in, "config.xml文件找不到"), configFile);
            } catch (IOException e) {
                throw new IllegalArgumentException("保存文件证书失败->" + e.getMessage());
            }
        }
        System.out.println("证书文件地址:" + configFilePath);
        props.put(SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG, configFilePath);

        //props.put(SslConfigs.SSL_TRUSTSTORE_LOCATION_CONFIG, truststore_location);
        props.put(SslConfigs.SSL_TRUSTSTORE_PASSWORD_CONFIG, truststore_password);
        props.put(SaslConfigs.SASL_JAAS_CONFIG, "org.apache.kafka.common.security.scram.ScramLoginModule required username='帐号' password='密码';"); //注意passwod结尾的分号一定不要漏
        props.put(SslConfigs.SSL_ENDPOINT_IDENTIFICATION_ALGORITHM_CONFIG, "");
        return props;
    }
}
    
读取消息:
    //这里相当于消息接收者,进行消息接收后处理
    @KafkaListener(topics = {"topics_tst"})
    public void processMessage(ConsumerRecord record) {
        Optional kafkaMessage = Optional.ofNullable(record.value());
        if (kafkaMessage.isPresent()) {
            Object message = kafkaMessage.get();
            
        }
    }

你可能感兴趣的:(springboot kafka SASL_SSL SCRAM-SHA-512 ,外加打包jar读不到.jks文件解决方法)