2017-07-28 62 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 

假設你可以卡夫卡端口的機器之間的遠程登錄。