2017-07-28 59 views
2

我开始使用Apache Kafka,并且当我试图从外部机器连接时遇到问题。无法从外部机器连接到kafka

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

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

我的春天卡夫卡@Configuration这行到@Bean consumerFactory和producerFactory(想象我的机器搬运工的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 ..卡夫卡..工作..我只知道不知道如何:(

+1

也许防火墙吗? –

+0

@EvgeniDimitrov不,这就行了。我认为它的任何配置关于zookeper我错过..因为如果我只有动物园管理员开始在我的机器A ..和在机器B .. kafka ..工程..我只不知道如何:( –

回答

0

的@Krishas和@Hans耶斯佩森

这里有些混合是我的泊坞窗阳明的代码:

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” +“端口”,或“听众”

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

0

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

+0

嗨,是U我的亲戚(戈麦斯)?KKK 如果你说了,我需要指定? –

+0

也许是肯定的!你可以在KAFKA_JMX_OPTS可变 –

+0

这就是只配置到卡夫卡管理器中找到该选项访问卡夫卡.. 我认为我的问题是一些配置我错过了与我的producerFactory相关的动物园管理员..但我不知道什么是 –

1

设置advertised.listeners到码头工人容器的主机的主机名或IP地址。

environment: 
     KAFKA_ADVERTISED_LISTENERS: "10.10.10.10:9092" 

正在发生的事情是,客户端连接到引导服务器,做了元数据请求来发现连接到某个特定主题的分区的簇中,卡夫卡的经纪人,并得到广告主机名称后面作为回应(在你的情况下为0.0.0.0),只有当所有东西都在同一台机器上时,它才会起作用。

您需要宣传一个IP或主机名称,它可以在远程计算机上工作,因此不需要localhost,127.0.0.1或0.0.0.0。也不是泊坞窗容器的私有内部IP或主机名。它必须是外部/公共IP或主机名。

而且advertised.host.nameadvertised.port被弃用卡夫卡参数0.10.x所以即使你使用它们(他们为向后兼容性工作),你还需要设置advertised.host.name是一些生产者能够解决,并连接到。我建议使用码头主机的全限定主机名或IP(即10.10.10.10)。

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

DEPRECATED: only used when advertised.listeners or listeners are not set. Use advertised.listeners instead. Hostname to publish to ZooKeeper for clients to use. In IaaS environments, this may need to be different from the interface to which the broker binds. If this is not set, it will use the value for host.name if configured. Otherwise it will use the value returned from java.net.InetAddress.getCanonicalHostName().

1

尝试设置监听器,

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

假设你可以卡夫卡端口的机器之间的远程登录。