Spring 无法从外部计算机连接到卡夫卡

Spring 无法从外部计算机连接到卡夫卡,spring,docker,apache-kafka,spring-kafka,Spring,Docker,Apache Kafka,Spring Kafka,我从ApacheKafka开始,当我试图从外部机器连接时,我面临着问题 使用下面的配置,如果应用程序和docker在同一台机器上运行,那么所有这些都可以正常工作 但是当我把应用程序放在机器A上,把docker放在机器B上时,应用程序无法连接 我的spring Kafka@Configuration有一行到@Bean consumerFactory和producerFactory(假设我的机器具有docker ip=10.10.10.10) 我的docker文件是: version: '2' se

我从ApacheKafka开始,当我试图从外部机器连接时,我面临着问题

使用下面的配置,如果应用程序和docker在同一台机器上运行,那么所有这些都可以正常工作

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

我的spring Kafka@Configuration有一行到@Bean consumerFactory和producerFactory(假设我的机器具有docker ip=10.10.10.10)

我的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》中的卡夫卡。。行得通。。我只是不知道如何:(

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

播发的侦听器设置为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或主机名

另外,在Kafka 0.10.x中,
advised.host.name
advised.port
是不推荐使用的参数,因此即使您使用它们(它们用于向后兼容),您还需要将
播发的.host.name
设置为制作人可以解析并连接到的内容。我建议使用docker主机的完全限定主机名或IP(即10.10.10.10)

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

尝试设置侦听器

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

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

某种@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
这需要“明文:/”前缀! 并配置“主机名”+“端口”或“侦听器”


下一步是演示如何配置其他节点

可能是防火墙?@EvgeniDimitrov不,没关系。我想这是关于我丢失的zookeper的任何配置。因为如果我只有zookeper在我的机器a上启动,而kafka在机器B上启动,那就可以了。我只是不知道如何:(嗨,你是我的亲戚吗(戈麦斯)?kkk,你说我需要指定吗?可能是的!你可以在卡夫卡上找到的选项选择变量那只是卡夫卡管理员访问卡夫卡的一个配置。我想我的问题是我的生产厂缺少一些与zookeeper相关的配置。但我不知道是什么
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