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

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内部集群通信和外部客户端访问:
    1. 内部通信监听使用Docker容器主机名,供broker之间同步数据使用
    2. 外部访问监听返回宿主机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
      新增以下三行配置:
    127.0.0.1 kafka-broker-1
    127.0.0.1 kafka-broker-2
    127.0.0.1 kafka-broker-3
    
    注意该方案需要保证Docker端口映射规则和broker上报的端口完全对应,否则会出现端口连接失败问题,仅适合本地调试场景使用。
  • 第三步:修正Spring Kafka配置冲突
    两种方案二选一即可,避免两边配置不一致:
    1. 直接删除自定义的AdminConfigurer类,使用Spring Kafka自动装配的KafkaAdmin Bean,所有参数统一从application.yml读取
    2. 保留自定义配置类的话,删除硬编码的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 22:57:18