目錄
第一個問題:配置/config/server.properties 文件的listeners問題
第二個問題:PLAINTEXT://your.host.name:9092、zookeeper.connect=your.host.name:2181配置問題
第三個問題:org.apache.kafka.common.KafkaException: Failed to construct kafka producer
由於我編程的電腦是沒有安裝Kafka、mysql這類軟件的,只有jdk和編譯器,需要用到的時候,都是在雲服務器進行安裝,並通過外網連接,這裏記錄一下我通過外網連接kafka遇到的一些問題
軟件版本: kafka_2.12-2.1.0 並使用自帶的zookeeper
kafka配置外網訪問 默認端口已開放
第一個問題:配置/config/server.properties 文件的listeners問題
#socket server監聽的地址。如果沒有配置,它將獲得從
# java.net.InetAddress.getCanonicalHostName()返回的值。
# EXAMPLE:
# listeners = PLAINTEXT://your.host.name:9092
#代理將向生產者和消費者廣告的主機名和端口。如果未設置,
#它使用“Listeners”的值(如果已配置)。否則,它將使用該值。
#從java.net.InetAddress.getCanonicalHostName()返回。
advertised.listeners=PLAINTEXT://your.host.name:9092
看註解,根本不知道選擇哪一個,感覺都沒有區別呀! 後面嘗試後發現,要想通過外網傳遞produce或者consumer,只能選擇第二個。
第二個問題:PLAINTEXT://your.host.name:9092、zookeeper.connect=your.host.name:2181配置問題
第一次配置:ip,發現Kafka不能調用zookeeper。
第二次配置:域名,發現telnet監測9092端口不通。原因(其他幾個配置文件都是依賴your.host.name)
第三次正確配置:Linux 用戶名 , 並修改hosts文件
1.檢查用戶名
[root@VM_0_16_centos kafka_2.12-2.1.0]# cat /etc/hostname
VM_0_16_centos
2.修改hosts文件
[root@VM_0_16_centos kafka_2.12-2.1.0]# vim /etc/hosts
172.17.0.16 VM_0_16_centos
3.修改Kafka配置文件
[root@VM_0_16_centos kafka_2.12-2.1.0]# vim ./config/server.properties
advertised.listeners=PLAINTEXT://VM_0_16_centos:9092
zookeeper.connect=VM_0_16_centos:2181
4.連接端hosts文件,也要添加上這個用戶名 與 實際Ip的映射
第三個問題:org.apache.kafka.common.KafkaException: Failed to construct kafka producer
外網環境下測試連接,編寫了一小段代碼去連接Kafka
private static KafkaProducer<String, String> producer;
static {
Properties properties = new Properties();
properties.put("bootstrap.servers", "VM_0_16_centos:9092");
properties.put("key.serializer",
"org.apache.kafka.common.serialization.StringSerializer");
properties.put("value.serializer",
"org.apache.kafka.common.serialization.StringSerializer");
/*properties.put("partitioner.class",
"com.imooc.kafkastudy.CustomPartitioner");*/
producer = new KafkaProducer<>(properties);
}
private static void sendMessageForgetResult() {
ProducerRecord<String, String> record = new ProducerRecord<>(
"csdn_test", "name", "ForgetResult"
);
producer.send(record);
producer.close();
}
報錯,org.apache.kafka.common.KafkaException: Failed to construct kafka producer ,哇,這個錯誤真的是不知道這麼解,根本沒有啥提示,很懵,在stackoverflow查了一下, 找到原因了,https://stackoverflow.com/questions/47969955/org-apache-kafka-common-kafkaexception-failed-to-construct-kafka-consumer?rq=1
是由於jar包版本不匹配,導致生成不了producer對象,改依賴唄!
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.12</artifactId>
<version>0.10.2.1</version>
</dependency>