我从Apache Kafka开始,当我尝试从外部机器进行连接时,我遇到了问题。
使用此配置,如果应用程序和docker在同一台机器上运行,则一切正常。
但是当我将应用程序放在机器A和机器B的docker中时,应用程序无法连接。
我的春天Kafka @Configuration将此行添加到@Bean consumerFactory和producerFactory(想象我的机器与docker ip = 10.10.10.10)
props.put(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "10.10.10.10:9092");
我的docker文件是这样的:
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中的卡夫卡...那有用..我只是不知道如何:(
答案 0 :(得分:1)
将advertised.listeners
设置为docker容器的主机的主机名或IP。
environment:
KAFKA_ADVERTISED_LISTENERS: "10.10.10.10:9092"
发生的事情是客户端连接到引导服务器,执行元数据请求以发现群集中的哪个Kafka代理连接到特定主题分区,并将广告主机名作为响应获取(在你的情况下0.0.0.0),只有当所有东西都在同一台机器上时才能工作。
您需要公布将在远程计算机上运行的ip或主机名,而不是localhost,127.0.0.1或0.0.0.0。也不是docker容器的私有内部IP或主机名。它必须是外部/公共IP或主机名。
Kafka 0.10.x中不推荐使用advertised.host.name
和advertised.port
参数,因此即使您使用它们(它们用于向后兼容),您还需要将advertised.host.name
设置为生产者可以解决和连接的东西。我建议使用docker主机的全限定主机名或IP(即10.10.10.10)。
来自http://kafka.apache.org/0101/documentation.html#brokerconfigs
DEPRECATED:仅在
advertised.listeners
或listeners
时使用 没有设置。请改用advertised.listeners
。要发布到的主机名 ZooKeeper供客户使用。在IaaS环境中,这可能需要 与代理绑定的接口不同。如果是这样的话 未设置,如果已配置,它将使用host.name
的值。 否则它将使用从返回的值 java.net.InetAddress.getCanonicalHostName()。
答案 1 :(得分:1)
尝试设置听众,
eg: listeners = PLAINTEXT://your.host.name:9092
假设您可以在kafka端口上的计算机之间远程登录。
答案 2 :(得分:1)
@Krishas和@Hans Jespersen的混合物
这是我的docker 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" +" port",或"听众"
下一步是装饰我将如何配置另一个节点
答案 3 :(得分:0)
您需要指定java.rmi.server.hostname = 0.0.0.0