Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring boot spring kafka如何配置两个不同kerberos的jaas_Spring Boot_Apache Kafka_Kerberos_Jaas - Fatal编程技术网

Spring boot spring kafka如何配置两个不同kerberos的jaas

Spring boot spring kafka如何配置两个不同kerberos的jaas,spring-boot,apache-kafka,kerberos,jaas,Spring Boot,Apache Kafka,Kerberos,Jaas,我有一个spring boot应用程序,它通过rest接收数据,基于一些业务逻辑,我需要将数据转发到两个不同的kafka集群,它们有自己的kerberos密钥作为文件 我在两个不同的对象实例中编写了两个不同的producer实例,它们具有以下属性 @Service public class EventProducer { private Logger logger = LoggerFactory.getLogger(EventProducer.class); Pro

我有一个spring boot应用程序,它通过rest接收数据,基于一些业务逻辑,我需要将数据转发到两个不同的kafka集群,它们有自己的kerberos密钥作为文件

我在两个不同的对象实例中编写了两个不同的producer实例,它们具有以下属性

@Service
public class EventProducer {
    private Logger logger = LoggerFactory.getLogger(EventProducer.class);
 
    
    Producer<String, String> kafkaProducer = null;

    @Autowired
    public Producer<String, String> createProducer() {
        if (kafkaProducer == null) {
            Properties props = getKafkaConfig();
         props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "Cluste_1_hostaddress:9092");
         props.put(ProducerConfig.CLIENT_ID_CONFIG,"usertest");

         props.put(ProducerConfig.ACKS_CONFIG, "all");
         props.put(ProducerConfig.RETRIES_CONFIG, "3");

         props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);
         props.put(ProducerConfig.BATCH_SIZE_CONFIG, 1600);

         System.setProperty("javax.security.auth.useSubjectCredsOnly", "true"); 
         System.setProperty("java.security.auth.login.config", "/home/user/clusrter_1_jaas.conf);   
         
         props.put("security.protocol", "SASL_PLAINTEXT");
         props.put("kafka.cluster.SecurityProtocol",PLAINTEXTSASL);
         props.put("sasl.kerberos.service.name",  "kafka"); 
         props.put("sasl.kerberos", "sasl.kerberos.service.namekafka");     
         props.put("security.inter.broker.protocol", "SASL_PLAINTEXT");
         props.put("sasl.mechanism.inter.broker.protocol", "PLAIN");
         props.put("sasl.enabled.mechanisms", "PLAIN");
         props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
             
         kafkaProducer = new KafkaProducer<String, String>(props);
        }
        return kafkaProducer;
    }
 
}
@服务
公共类事件制作人{
私有记录器Logger=LoggerFactory.getLogger(EventProducer.class);
生产者kafkaProducer=null;
@自动连线
公共制作人createProducer(){
if(kafkaProducer==null){
Properties=getkafkanconfig();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,“Cluste_1_主机地址:9092”);
props.put(ProducerConfig.CLIENT_ID_CONFIG,“usertest”);
props.put(ProducerConfig.ACKS_CONFIG,“all”);
props.put(ProducerConfig.RETRIES_CONFIG,“3”);
props.put(ProducerConfig.BUFFER\u MEMORY\u CONFIG,33554432);
props.put(ProducerConfig.BATCH\u SIZE\u CONFIG,1600);
setProperty(“javax.security.auth.useSubjectCredsOnly”、“true”);
setProperty(“java.security.auth.login.config”,“/home/user/cluster_1_jaas.conf);
props.put(“security.protocol”、“SASL_明文”);
props.put(“kafka.cluster.SecurityProtocol”,明文SASL);
put(“sasl.kerberos.service.name”、“kafka”);
put(“sasl.kerberos”、“sasl.kerberos.service.namekafka”);
props.put(“security.inter.broker.protocol”,“SASL_明文”);
props.put(“sasl.mechanism.inter.broker.protocol”,“PLAIN”);
道具放置(“sasl.enabled.mechanism”、“PLAIN”);
put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,StringSerializer.CLASS.getName());
卡夫卡制作人=新卡夫卡制作人(道具);
}
返回卡夫卡制作人;
}
}
第二制作人

@Service
public class MovementProducer {
    private Logger logger = LoggerFactory.getLogger(MovementProducer.class);
    
    Producer<String, String> kafkaProducer = null;

    @Autowired
    public Producer<String, String> createProducer() {
        if (kafkaProducer == null) {
            Properties props = getKafkaConfig();
         props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "Cluste_2_hostaddress:9092");
         props.put(ProducerConfig.CLIENT_ID_CONFIG,"usertest");

         props.put(ProducerConfig.ACKS_CONFIG, "all");
         props.put(ProducerConfig.RETRIES_CONFIG, "3");

         props.put(ProducerConfig.BUFFER_MEMORY_CONFIG, 33554432);
         props.put(ProducerConfig.BATCH_SIZE_CONFIG, 1600);

         System.setProperty("javax.security.auth.useSubjectCredsOnly", "true"); 
         System.setProperty("java.security.auth.login.config", "/home/user/clusrter_2_jaas.conf);   
         
         props.put("security.protocol", "SASL_PLAINTEXT");
         props.put("kafka.cluster.SecurityProtocol",PLAINTEXTSASL);
         props.put("sasl.kerberos.service.name",  "kafka"); 
         props.put("sasl.kerberos", "sasl.kerberos.service.namekafka");     
         props.put("security.inter.broker.protocol", "SASL_PLAINTEXT");
         props.put("sasl.mechanism.inter.broker.protocol", "PLAIN");
         props.put("sasl.enabled.mechanisms", "PLAIN");
            props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
         
            kafkaProducer = new KafkaProducer<String, String>(props);
        }
        return kafkaProducer;
    }
 
}
@服务
公共阶级运动制作人{
私有记录器Logger=LoggerFactory.getLogger(MovementProducer.class);
生产者kafkaProducer=null;
@自动连线
公共制作人createProducer(){
if(kafkaProducer==null){
Properties=getkafkanconfig();
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,“Cluste_2_主机地址:9092”);
props.put(ProducerConfig.CLIENT_ID_CONFIG,“usertest”);
props.put(ProducerConfig.ACKS_CONFIG,“all”);
props.put(ProducerConfig.RETRIES_CONFIG,“3”);
props.put(ProducerConfig.BUFFER\u MEMORY\u CONFIG,33554432);
props.put(ProducerConfig.BATCH\u SIZE\u CONFIG,1600);
setProperty(“javax.security.auth.useSubjectCredsOnly”、“true”);
setProperty(“java.security.auth.login.config”,“/home/user/cluster_2_jaas.conf);
props.put(“security.protocol”、“SASL_明文”);
props.put(“kafka.cluster.SecurityProtocol”,明文SASL);
put(“sasl.kerberos.service.name”、“kafka”);
put(“sasl.kerberos”、“sasl.kerberos.service.namekafka”);
props.put(“security.inter.broker.protocol”,“SASL_明文”);
props.put(“sasl.mechanism.inter.broker.protocol”,“PLAIN”);
道具放置(“sasl.enabled.mechanism”、“PLAIN”);
put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,StringSerializer.CLASS.getName());
卡夫卡制作人=新卡夫卡制作人(道具);
}
返回卡夫卡制作人;
}
}
当我将它作为两个服务启动,只启用生产者实例时,它就工作了,但当我在一个jar中同时启用两个实例时,只有一个生产者工作,而其他生产者则会遇到身份验证问题

我觉得这是由于System.setProperty(“java.security.auth.login.config”,”)造成的,因为它是全局系统变量,所以当我在单个进程中同时使用这两个变量时,它会覆盖,所以只有一个可以工作


那么,除了启动两个进程之外,还有什么办法可以解决这个问题呢。我只有一个spring服务,应该能够为两个不同的kafka集群制作。

kafka客户端的最新版本为不同的客户端提供了多个JAAS会议的选项

例如,如果您的实例想要用不同的JAAS配置连接两个集群,那么我们可以在不同的生产者和消费者级别进行覆盖。只需创建两个独立的生产工厂并设置
sasl.jaas.conig

clustera.java.security.auth.login.config=com.sun.security.auth.module.Krb5LoginModule required \
    useKeyTab=true \
    storeKey=true \
    keyTab="test.keytab" \
    principal="test@domain.com";

clusterb.java.security.auth.login.config=com.sun.security.auth.module.Krb5LoginModule required \
    useKeyTab=true \
    storeKey=true \
    keyTab="testb.keytab" \
    principal="testb@domain.com"

卡夫卡客户端的最新版本为不同客户端提供了多个JAAS会话选项

例如,如果您的实例想要用不同的JAAS配置连接两个集群,那么我们可以在不同的生产者和消费者级别进行覆盖。只需创建两个独立的生产工厂并设置
sasl.jaas.conig

clustera.java.security.auth.login.config=com.sun.security.auth.module.Krb5LoginModule required \
    useKeyTab=true \
    storeKey=true \
    keyTab="test.keytab" \
    principal="test@domain.com";

clusterb.java.security.auth.login.config=com.sun.security.auth.module.Krb5LoginModule required \
    useKeyTab=true \
    storeKey=true \
    keyTab="testb.keytab" \
    principal="testb@domain.com"

您需要显式地管理多个“主题”(及其
doa
方法),而不是隐式的、静态的、默认的主题——cf。准备好几个月的疯狂尝试,以实现这一目标。如果有用的话我不知道怎么开始。。有什么提示吗?您需要显式地管理多个“主题”(及其
doa
方法),而不是隐式的、静态的、默认的主题——cf。准备好几个月的疯狂尝试,让它发挥作用。如果有用的话我不知道怎么开始。。有什么提示吗?