SASL 握手期间出现意外的 METADATA 类型的 Kafka 请求

Thi*_*ruG 15 java apache-kafka kafka-producer-api

我正在尝试使用 SASL Plain 将 Kafka Java 客户端连接到 Kafka 代理。但是当我尝试从生产者发送消息时,Kafka 服务器记录以下错误:

[2020-04-30 14:48:14,955] INFO [SocketServer brokerId=0] Failed authentication with /127.0.0.1 (Unexpected Kafka request of type METADATA during SASL handshake.) (org.apache.kafka.common.network.Selector)
Run Code Online (Sandbox Code Playgroud)

从表面上看,生产者尝试在 SASL 握手之前发送元数据请求。如何在发送消息之前进行握手?

以下是我的kafka_server_jaas.conf文件,用于 Kafka 服务器。

KafkaServer {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="admin-secret"
    user_admin="admin-secret";
};

Client {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="admin-secret";
};
Run Code Online (Sandbox Code Playgroud)

以下是我的zookeeper_jaas.conf文件,用于动物园管理员:

Server {
    org.apache.kafka.common.security.plain.PlainLoginModule required
    username="admin"
    password="admin-secret"
    user_admin="admin-secret";
};
Run Code Online (Sandbox Code Playgroud)

在我的 Java 生产者中,我设置了以下属性:

[2020-04-30 14:48:14,955] INFO [SocketServer brokerId=0] Failed authentication with /127.0.0.1 (Unexpected Kafka request of type METADATA during SASL handshake.) (org.apache.kafka.common.network.Selector)
Run Code Online (Sandbox Code Playgroud)

我做错了什么吗?

Mic*_*son 10

您需要指定security.protocol,否则默认情况下,Kafka 客户端不使用SASL

在您的客户端属性中,添加:

properties.put("security.protocol", "SASL_SSL");
Run Code Online (Sandbox Code Playgroud)

还有,SASL_PLAINTEXT但不建议使用该PLAIN机制SASL_PLAINTEXT,因为密码将以明文形式交换。