CLI正常但Java应用无法连接Kafka,求排查原因
Java应用运行环境的localhost指向不匹配
如果你的Java应用是在Docker容器、虚拟机或者远程服务器上运行,该环境内的localhost指向的是容器/虚拟机自身,而非部署Kafka的宿主机。此时即使宿主机的CLI能正常连接,Java应用也会因找不到对应服务被拒绝连接。
解决:将Java客户端的bootstrap.servers配置为Kafka所在机器的实际IP(比如局域网IP192.168.x.x),同时修改Kafka的server.properties,把listeners改为PLAINTEXT://0.0.0.0:9092(允许所有网卡绑定),取消advertised.listeners的注释并设置为PLAINTEXT://[Kafka机器IP]:9092。本地防火墙/安全策略拦截9092端口
部分操作系统的防火墙可能会拦截本地进程对127.0.0.1:9092的连接请求——虽然CLI能正常连接,但Java进程可能被不同的规则限制。
解决:临时关闭防火墙测试是否恢复正常,若正常则添加允许Java进程访问9092端口的规则,或者直接放行9092端口的本地连接。Java应用的网络代理干扰
如果Java应用启动时配置了全局网络代理,对localhost的请求可能会被转发到代理服务器,而代理无法访问你的本地Kafka服务。
解决:检查Java应用的启动参数(比如-Dhttp.proxyHost等),移除不必要的代理配置,或者添加-Dhttp.nonProxyHosts=localhost来排除本地地址的代理。Kafka的advertised.listeners自动推导异常
当advertised.listeners被注释时,Kafka会自动推导该值。若你的机器主机名无法解析到127.0.0.1,Java客户端在获取broker地址后可能出现连接异常(即使日志显示连接localhost,也可能存在隐式地址转换问题)。
解决:显式设置advertised.listeners=PLAINTEXT://localhost:9092,重启Kafka后再测试Java客户端连接。
内容的提问来源于stack exchange,提问作者Sergey Zolotarev

