无法从外部计算机

时间:2017-07-28 19:17:19

标签: spring docker apache-kafka spring-kafka

我从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中的卡夫卡...那有用..我只是不知道如何:(

4 个答案:

答案 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.nameadvertised.port参数,因此即使您使用它们(它们用于向后兼容),您还需要将advertised.host.name设置为生产者可以解决和连接的东西。我建议使用docker主机的全限定主机名或IP(即10.10.10.10)。

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

  

DEPRECATED:仅在advertised.listenerslisteners时使用   没有设置。请改用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