环境
- win10
- idea
- java
问题
连接阿里云ECS上的Kafka时,报 No entry found for connection 0
:
telnet ip:port
没有报错,进入一片黑的界面。- 阿里云安全组已开放9092
- 配置如下所示:
# 监听9092端口
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
了