Spring Kafka外连SASL_SCRAM认证Kafka集群报UnknownHostException
问题根因
抛出java.net.UnknownHostException: kafka-broker-1/2/3和SASL、SSL配置无关,核心原因是Docker部署的Kafka集群广播地址(advertised.listeners)配置错误:
客户端初始连接你配置的localhost:19094等端口成功后,会从Kafka集群拉取全量broker元数据,后续和各个broker的通信会直接使用元数据里broker自身上报的访问地址。当前你的broker上报的是Docker内部网络的容器主机名kafka-broker-1/kafka-broker-2/kafka-broker-3,这类主机名只能在Docker内部网络被解析,宿主机没有对应的DNS解析或hosts映射,自然无法找到对应主机。
另外你的配置存在两处隐性冲突,修完网络问题后会直接触发认证或配置不生效问题:
- 自定义
AdminConfigurer类中硬编码了bootstrap地址,未使用配置文件注入的参数 - 代码中硬编码的JAAS认证用户为
kafkabroker,和application.yml中配置的kafkaclient用户不一致
排查解决步骤
- 第一步:修正Kafka容器的广播地址配置(推荐方案)
每个Kafka broker需要配置两套监听规则,分别适配Docker内部集群通信和外部客户端访问:- 内部通信监听使用Docker容器主机名,供broker之间同步数据使用
- 外部访问监听返回宿主机IP/localhost + 映射到宿主机的外部端口,供外部客户端连接
以3节点集群为例,每个broker对应配置环境变量:
- broker1:
KAFKA_ADVERTISED_LISTENERS=SASL_SSL://localhost:19094,INTERNAL://kafka-broker-1:9092 - broker2:
KAFKA_ADVERTISED_LISTENERS=SASL_SSL://localhost:29094,INTERNAL://kafka-broker-2:9092 - broker3:
KAFKA_ADVERTISED_LISTENERS=SASL_SSL://localhost:39094,INTERNAL://kafka-broker-3:9092
同步配置监听协议映射:KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=SASL_SSL:SASL_SSL,INTERNAL:PLAINTEXT,内部集群通信监听设为KAFKA_INTER_BROKER_LISTENER_NAME=INTERNAL,配置完成后重启整个Kafka集群。
- 第二步:临时方案(无法修改Docker配置时使用)
在宿主机hosts文件中添加容器主机名和127.0.0.1的映射:- Linux/Mac系统修改
/etc/hosts - Windows系统修改
C:\Windows\System32\drivers\etc\hosts
新增以下三行配置:
注意该方案需要保证Docker端口映射规则和broker上报的端口完全对应,否则会出现端口连接失败问题,仅适合本地调试场景使用。127.0.0.1 kafka-broker-1 127.0.0.1 kafka-broker-2 127.0.0.1 kafka-broker-3 - Linux/Mac系统修改
- 第三步:修正Spring Kafka配置冲突
两种方案二选一即可,避免两边配置不一致:- 直接删除自定义的
AdminConfigurer类,使用Spring Kafka自动装配的KafkaAdminBean,所有参数统一从application.yml读取 - 保留自定义配置类的话,删除硬编码的bootstrap地址、JAAS配置,全部改为从配置文件注入对应参数
同时修正application.yml中JAAS配置的格式,给配置值加单引号避免YAML解析错误,用户名密码用双引号包裹:
spring: kafka: properties: sasl: jaas: config: 'org.apache.kafka.common.security.scram.ScramLoginModule required username="kafkaclient" password="password";' - 直接删除自定义的
- 第四步:验证
重启Spring应用后重新执行创建Topic操作,UnknownHostException会消失。如果后续抛出认证错误,检查Kafka集群中是否已创建对应SCRAM用户、密码是否匹配、用户是否拥有Topic操作权限。
内容的提问来源于stack exchange,提问作者utkarsh saraf
相关产品推荐
相关产品推荐

