Apache kafka KafkaConsumerAPI-通过vagrant从eclipse连接到vm中运行的代理

Apache kafka KafkaConsumerAPI-通过vagrant从eclipse连接到vm中运行的代理,apache-kafka,kafka-consumer-api,Apache Kafka,Kafka Consumer Api,什么是广告。听众。如何从Eclipse连接到运行在VM中的Kafka代理 我已经编写了KafkaConsumer代码,并使用本地运行的服务对其进行了测试。我试图使用相同的代码连接到在VM中运行的Kafka代理,但记录并没有被消耗。请解释实现该结果所需的配置 package kafkaExample; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.consumer.

什么是广告。听众。如何从Eclipse连接到运行在VM中的Kafka代理

我已经编写了KafkaConsumer代码,并使用本地运行的服务对其进行了测试。我试图使用相同的代码连接到在VM中运行的Kafka代理,但记录并没有被消耗。请解释实现该结果所需的配置

package kafkaExample;

import org.apache.kafka.clients.consumer.ConsumerConfig;
import org.apache.kafka.clients.consumer.ConsumerRebalanceListener;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.apache.kafka.common.PartitionInfo;
import org.apache.kafka.common.TopicPartition;

import java.time.Duration;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;

public class Consumer {
  public static void main(String[] args) {

    final List<PartitionInfo> partitionInfos;


    final Properties props = new Properties();
    props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, args[0]);
    /*    props.put("zookeeper.connect", "10.30.3.2:2181,10.30.3.3:2181");*/
    props.put(ConsumerConfig.VALUE_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");
    props.put(ConsumerConfig.KEY_DESERIALIZER_CLASS_CONFIG, "org.apache.kafka.common.serialization.StringDeserializer");
    props.put(ConsumerConfig.GROUP_ID_CONFIG, "cgrp1");
    props.put(ConsumerConfig.CLIENT_ID_CONFIG, "consumer-tutorial");


    final KafkaConsumer<String, String> kafkaConsumer = new KafkaConsumer<>(props);
    kafkaConsumer.subscribe(Arrays.asList(args[1]),
        new ConsumerRebalanceListener() {
          @Override
          public void onPartitionsRevoked(Collection<TopicPartition> arg0) {

        }

          @Override
          public void onPartitionsAssigned(Collection<TopicPartition> tps) {

        }
        });

    System.out.println("list of topics " + kafkaConsumer.listTopics());

    ConsumerRecords<String, String> records = null;
    while (true) {
      records = kafkaConsumer.poll(Duration.ofMillis(100));
      if (records == null || records.count() == 0) {
        System.out.println("There is no message. try again.");
        continue;
      }

      final Iterator<ConsumerRecord<String, String>> iter = records.iterator();
      while (iter.hasNext()) {
        final ConsumerRecord<String, String> cr = iter.next();
        System.out.println("Consume msg: " + cr.value());
      }
      kafkaConsumer.commitSync();
      kafkaConsumer.close();
      break;
    }
  }
}
卡夫卡式包装示例;
导入org.apache.kafka.clients.consumer.ConsumerConfig;
导入org.apache.kafka.clients.consumer.ConsumerBalanceListener;
导入org.apache.kafka.clients.consumer.ConsumerRecord;
导入org.apache.kafka.clients.consumer.ConsumerRecords;
导入org.apache.kafka.clients.consumer.KafkaConsumer;
导入org.apache.kafka.common.PartitionInfo;
导入org.apache.kafka.common.TopicPartition;
导入java.time.Duration;
导入java.util.array;
导入java.util.Collection;
导入java.util.Iterator;
导入java.util.List;
导入java.util.Properties;
公共类消费者{
公共静态void main(字符串[]args){
最终清单分区信息;
最终属性道具=新属性();
put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG,args[0]);
/*道具放置(“zookeeper.connect”,“10.30.3.2:2181,10.30.3.3:2181”)*/
put(ConsumerConfig.VALUE_反序列化程序_CLASS_CONFIG,“org.apache.kafka.common.serialization.StringDeserializer”);
put(ConsumerConfig.KEY_反序列化程序_CLASS_CONFIG,“org.apache.kafka.common.serialization.StringDeserializer”);
props.put(ConsumerConfig.GROUP_ID_CONFIG,“cgrp1”);
put(ConsumerConfig.CLIENT_ID_CONFIG,“消费者教程”);
最终卡夫卡消费者卡夫卡消费者=新卡夫卡消费者(道具);
kafkaConsumer.subscribe(Arrays.asList(args[1]),
新的ConsumerBalanceListener(){
@凌驾
已取消分区上的公共无效(集合arg0){
}
@凌驾
已签名分区上的公共无效(集合tps){
}
});
System.out.println(“主题列表”+kafkaConsumer.listTopics());
ConsumerRecords记录=null;
while(true){
记录=kafkaConsumer.poll(持续时间:百万(100));
if(records==null | | records.count()==0){
System.out.println(“没有消息,请重试”);
继续;
}
最终迭代器iter=records.Iterator();
while(iter.hasNext()){
最终用户记录cr=iter.next();
System.out.println(“消费消息:+cr.value());
}
kafkaConsumer.commitSync();
kafkaConsumer.close();
打破
}
}
}

播发的侦听器将告诉您的客户端连接到与服务器本身主地址不同的地址

例如,您的虚拟机至少有三个接口,localhost,用于跨多个虚拟机通信的内部虚拟机子网,然后可能还有另一个用于外部主机访问该虚拟机的接口

第三个可能不存在,如果不存在,则需要设置从主机到VM内部接口的端口转发。在这种情况下,从主机9092(可以是任何数字)向Kafka服务器9092转发端口,然后将播发的侦听器设置为
纯文本://127.0.0.1:9092
(或从主机中选择的数字),然后使主机上的应用程序连接到
127.0.0.1:9092
,而不是VM地址


如果一台主机上有一个虚拟机集群,则在转发时必须使用不同的端口,例如
127.0.0.1:9092127.0.0.1:9093

我正在使用vagrant设置集群。对于每个VM,我正在配置一个专用网络。我正在尝试实现2节点kafka集群。例如,一台kafka服务器将在专用IP 10.30.3.30端口9092中运行,另一台将在IP 10.30.3.20端口9092中运行。我是否应该将第一个VM kafka服务器端口转发到主机9092,将第二个VM kafka服务器端口转发到主机9093?然后,在一个节点上,播发的侦听器需要设置为纯文本://127.0.0.1:9092,而另一个节点需要设置为纯文本://127.0.0.1:9093?