环境

  • win10
  • idea
  • java

问题

连接阿里云ECS上的Kafka时,报 No entry found for connection 0 :
image.png

  • telnet ip:port 没有报错,进入一片黑的界面。
  • 阿里云安全组已开放9092
  • 配置如下所示:
    1. # 监听9092端口
    2. listeners=PLAINTEXT://:9092

问题重现

listeners advertised.listeners 结果
PLAINTEXT://:9092 PLAINTEXT://114.55.32.110:9092 正常,可以访问
PLAINTEXT://127.0.0.1:9092 PLAINTEXT://114.55.32.110:9092 WARN [Producer clientId=console-producer] Connection to node -1 (/你的ip:你的暴露端口) could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
PLAINTEXT://:9092 / 内网可以正常使用,外网可以连接但是No entry found for connection 0
/ PLAINTEXT://114.55.32.110:9092 无法启动,Cannot assign requested address
PLAINTEXT://114.55.32.110:9092 PLAINTEXT://114.55.32.110:9092 无法启动,Cannot assign requested address

解决方案

开启下面的配置 advertised.listeners

listeners=PLAINTEXT://:9092
advertised.listeners=PLAINTEXT://<外网的IP地址>:9092

原理

点击查看【processon】
启动client时,连接到Kafka,然后Kafka会返回broker元数据给客户端,客户端使用这个元数据发起一些请求。而这个返回的元数据取决于配置文件 server.properties 里的 advertised.listeners 属性,如果不配置这个属性默认返回 listeners 属性。

有时候我们使用的是虚拟机,返回的IP地址我们本机也能正常访问,所以可以正常使用;
如果像上面这样是分离的两个网络,就需要配置 advertised.listeners

参考资料

  1. Kafka Listeners – Explained