无法从外部机器连接到kafka

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

使用下面的configuration,如果应用程序和docker在同一台机器上运行,所有工作正常。

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

我的springKafka @Configuration有这一行到@Bean consumerFactory和producerFactory(想象我的机器与dockerIP = 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 

编辑,添加一些信息

我认为它关于动物园pipe理员的任何configuration我错过了..因为如果我只有动物园pipe理员开始在我的机器A ..和在机器B .. kafka ..工作..我只不知道如何:(

尝试设置听众,

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

假设您可以在kafka端口上的计算机之间进行telnet。

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或主机名。

另外advertised.host.nameadvertised.port在Kafka 0.10.x中是不推荐使用的参数,所以即使你使用它们(它们是为了向后兼容),你也需要设置advertised.host.name为生产者可以使用的东西解决并连接到。 我build议使用docker主机的全限定主机名或IP(即10.10.10.10)。

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

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

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

@Krishas和@Hans Jespersen的混合

这是我的dockeryml的代码:

 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://前缀!并configuration”host_name“+”端口“或”侦听器“

下一步是怎样configuration另一个节点