无法从外部计算机连接到 Kafka



我从Apache Kafka开始,当我尝试从外部机器连接时,我遇到了问题。

使用下面的此配置,如果应用程序和 docker 在同一台计算机上运行,则一切正常。

但是当我将应用程序放在机器 A 中并将 docker 放在机器 B 中时,应用程序无法连接。

我的春季 Kafka @Configuration有这条线来@Bean消费者工厂和生产者工厂(想象一下我的机器 docker ip = 10.10.10.10(

props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "10.10.10.10:9092");

我的码头工人文件是这样的:

version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper:3.4.6
ports:
- 2181:2181
kafka:
image: wurstmeister/kafka:0.10.1.1
environment:
KAFKA_ADVERTISED_HOST_NAME: 0.0.0.0
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
KAFKA_CREATE_TOPICS: "topic-jhipster:1:1,PROCESS_ORDER:1:1, PROCESS_CHANNEL:1:1"
JMX_PORT: 9999
KAFKA_JMX_OPTS: "-Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.rmi.port=9999"
ports:
- 9092:9092
- 9999:9999
kafka-manager:
image: sheepkiller/kafka-manager
ports:
- 9000:9000
links:
- zookeeper
environment:
ZK_HOSTS: zookeeper:2181

我收到此错误:

org.springframework.kafka.core.KafkaProducerException: Failed to send;
nested exception is org.apache.kafka.common.errors.TimeoutException: 
Expiring 1 record(s) for

编辑,添加一些信息..

我认为这是我错过的关于动物园管理员的任何配置......因为如果我只在我的机器 A 上启动动物园管理员......和机器 B 中的卡夫卡......我只是不知道有多:(

尝试设置侦听器,

eg: listeners = PLAINTEXT://your.host.name:9092

假设您可以在 kafka 端口上的机器之间进行远程登录。

advertised.listeners设置为 docker 容器主机的主机名或 ip。

environment:
KAFKA_ADVERTISED_LISTENERS: "10.10.10.10:9092"

正在发生的事情是,客户端连接到引导服务器,执行元数据请求以发现集群中要连接到特定主题分区的哪个 Kafka 代理,并获取播发的主机名作为响应(在您的情况下为 0.0.0.0(,这只有在所有内容都在同一台机器上时才有效。

您需要通告一个将在远程计算机上工作的 IP 或主机名,而不是本地主机、127.0.0.1 或 0.0.0.0。也不是 docker 容器的私有内部 IP 或主机名。它必须是外部/公共 IP 或主机名。

此外,advertised.host.nameadvertised.port是 Kafka 0.10.x 中不推荐使用的参数,因此即使您使用它们(它们用于向后兼容性(,您还需要将advertised.host.name设置为生产者可以解析和连接的东西。我建议使用 docker 主机的完全限定主机名或 IP(即 10.10.10.10(。

从 http://kafka.apache.org/0101/documentation.html#brokerconfigs

已弃用:仅在advertised.listenerslisteners未设置。请改用advertised.listeners。要发布到的主机名 ZooKeeper供客户端使用。在 IaaS 环境中,这可能需要 与代理绑定的接口不同。如果这是 未设置,它将使用host.name的值(如果已配置(。 否则,它将使用从 返回的值 java.net.InetAddress.getCanonicalHostName((.

@Krishas和@Hans的混合 Jespersen

这是我的码头工人 yml 的代码:

version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper:3.4.6
ports:
- 2181:2181
kafka:
image: wurstmeister/kafka:0.10.1.1
environment:
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://10.10.10.10:9092
KAFKA_ADVERTISED_HOST_NAME: 10.10.10.10
KAFKA_ADVERTISED_PORT: 9092
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

这需要"PLAINTEXT://前缀! 并配置"host_name"+"端口"或"侦听器">

下一步是解码我将如何配置另一个节点

您需要指定 java.rmi.server.hostname=0.0.0.0

最新更新