You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows Java应用连接本地Ubuntu Kafka Broker报错求助

解决Windows Java生产者无法连接Ubuntu本地Kafka Broker的问题

问题现象

在Windows笔记本上运行Java Kafka生产者,尝试连接同一设备中Ubuntu系统的Kafka Broker时,出现以下错误:

[kafka-producer-network-thread | producer-1] INFO org.apache.kafka.clients.NetworkClient - [Producer clientId=producer-1] Node -1 disconnected.
[kafka-producer-network-thread | producer-1] WARN org.apache.kafka.clients.NetworkClient - [Producer clientId=producer-1] Connection to node -1 (localhost/127.0.0.1:9092) could not be established. Broker may not be available.
[kafka-producer-network-thread | producer-1] WARN org.apache.kafka.clients.NetworkClient - [Producer clientId=producer-1] Bootstrap broker localhost:9092 (id: -1 rack: null) disconnected

Java生产者代码如下:

public static void main(String[] args) {
        //create producer properties
        Properties properties = new Properties();

        //connect to localhost
        properties.setProperty("bootstrap.servers", "127.0.0.1:9092");

        //set producer properties
        properties.setProperty("key.serializer", StringSerializer.class.getName());
        properties.setProperty("value.serializer", StringSerializer.class.getName());

        //create the producer
        KafkaProducer<String, String> producer = new KafkaProducer<>(properties);
        //create a Producer Record
        ProducerRecord<String, String> producerRecord = new ProducerRecord<>("demo_java", "hello world");

        //send data
        producer.send(producerRecord);

        //tell the producer to send all data and block until done -- synchronous
        producer.flush();

        //flush and close the producer
        producer.close();
    }

已尝试的操作:

  • Windows创建入站防火墙规则开放9092端口
  • Windows和Ubuntu本地执行telnet localhost 9092均成功
  • Ubuntu本地执行Kafka命令(如kafka-topics.sh --bootstrap-server localhost:9092 --list)正常

解决方案

1. 修改Kafka Broker配置

找到Ubuntu系统中Kafka的server.properties配置文件(通常位于安装目录的config子文件夹,如/opt/kafka/config/server.properties),修改以下两项:

  • 将listeners配置改为监听所有网卡:
    listeners=PLAINTEXT://0.0.0.0:9092
    
  • 将advertised.listeners配置改为Ubuntu系统的局域网IP地址(可通过ip addr或ifconfig命令查看,格式如192.168.x.x):
    advertised.listeners=PLAINTEXT://192.168.1.100:9092
    

2. 重启Kafka服务

停止并重启Kafka及依赖的Zookeeper服务(以默认安装为例):

# 停止Kafka
bin/kafka-server-stop.sh
# 停止Zookeeper
bin/zookeeper-server-stop.sh

# 启动Zookeeper
bin/zookeeper-server-start.sh -daemon config/zookeeper.properties
# 启动Kafka
bin/kafka-server-start.sh -daemon config/server.properties

3. 修改Java生产者配置

将代码中的bootstrap.servers替换为Ubuntu的局域网IP地址:

properties.setProperty("bootstrap.servers", "192.168.1.100:9092");

4. 验证连接

在Windows终端执行telnet 192.168.1.100 9092,确认能成功建立连接。

原因说明

  • Windows的localhost(127.0.0.1)指向自身回环网卡,Ubuntu的localhost指向其内部回环,二者并非同一个网络端点,因此Windows无法通过127.0.0.1访问Ubuntu中的Kafka。
  • Kafka默认仅监听自身回环地址,需通过listeners配置让其监听所有网卡,同时通过advertised.listeners告知客户端Broker的实际可访问地址。

内容的提问来源于stack exchange,提问作者rds80

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 04:27:16