代码之家  ›  专栏  ›  技术社区  ›  Dathan

无法发布到Kafka[副本]

  •  1
  • Dathan  · 技术社区  · 6 年前

    the Confluent documentation (步骤2-3)。

    此外,我还公开了Zookeeper的端口2181和Kafka的端口9092,以便能够从本地计算机上运行的客户端连接到它们:

    $ docker run -d \
        -p 2181:2181 \
        --net=confluent \
        --name=zookeeper \
        -e ZOOKEEPER_CLIENT_PORT=2181 \
        confluentinc/cp-zookeeper:4.1.0
    
    $ docker run -d \
        --net=confluent \
        --name=kafka \
        -p 9092:9092 \
        -e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \
        -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092 \
        -e KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR=1 \
        confluentinc/cp-kafka:4.1.0
    

    问题: 当我尝试从主机连接到Kafka时,连接失败,因为 can't resolve address: kafka:9092 .

    以下是我的Java代码:

    Properties props = new Properties();
    props.put("bootstrap.servers", "localhost:9092");
    props.put("client.id", "KafkaExampleProducer");
    props.put("key.serializer", LongSerializer.class.getName());
    props.put("value.serializer", StringSerializer.class.getName());
    KafkaProducer<Long, String> producer = new KafkaProducer<>(props);
    ProducerRecord<Long, String> record = new ProducerRecord<>("foo", 1L, "Test 1");
    producer.send(record).get();
    producer.flush();
    

    例外情况:

    java.io.IOException: Can't resolve address: kafka:9092
        at org.apache.kafka.common.network.Selector.doConnect(Selector.java:235) ~[kafka-clients-2.0.0.jar:na]
        at org.apache.kafka.common.network.Selector.connect(Selector.java:214) ~[kafka-clients-2.0.0.jar:na]
        at org.apache.kafka.clients.NetworkClient.initiateConnect(NetworkClient.java:864) [kafka-clients-2.0.0.jar:na]
        at org.apache.kafka.clients.NetworkClient.ready(NetworkClient.java:265) [kafka-clients-2.0.0.jar:na]
        at org.apache.kafka.clients.producer.internals.Sender.sendProducerData(Sender.java:266) [kafka-clients-2.0.0.jar:na]
        at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:238) [kafka-clients-2.0.0.jar:na]
        at org.apache.kafka.clients.producer.internals.Sender.run(Sender.java:176) [kafka-clients-2.0.0.jar:na]
        at java.lang.Thread.run(Thread.java:748) [na:1.8.0_144]
    Caused by: java.nio.channels.UnresolvedAddressException: null
        at sun.nio.ch.Net.checkAddress(Net.java:101) ~[na:1.8.0_144]
        at sun.nio.ch.SocketChannelImpl.connect(SocketChannelImpl.java:622) ~[na:1.8.0_144]
        at org.apache.kafka.common.network.Selector.doConnect(Selector.java:233) ~[kafka-clients-2.0.0.jar:na]
        ... 7 common frames omitted
    

    如何连接到卡夫卡运行在码头?我的代码是从主机上运行的,不是Docker。

    /etc/hosts 但这是一个解决办法-不应该是这样的。

    还有一个类似的问题 here 然而,它是基于 ches/kafka 形象。我用 confluentinc

    0 回复  |  直到 5 年前
        1
  •  1
  •   İbrahim Ersin Yavaş    5 年前

    免责声明

    热释光;博士 -一天下来, 一切都一样 卡夫卡 在容器中运行。你只是依赖于 如何配置 . 以及 哪些变量 就这样吧。


    confluentinc docker图像 ,不是 wurstmeister/kafka ,尽管 there is a similar configuration read their Connectivity wiki .

    没有违反法律的 wurstmeister 图片,但它是由社区维护的,不是在自动的CI/CD版本中构建的。。。比特纳米人同样是极简主义者,而且保养得更好 . bitnami 卡夫卡图像, refer their README

    debezium/kafka 上面有文件 are mentioned here . 注意:不推荐使用播发主机和端口设置。广告听众涵盖了这两个方面。与合流容器相似,Debezium可以使用 KAFKA_ 添加前缀的代理设置以更新其属性。

    spotify/kafka 已弃用且过时。 fast-data-dev 对于一个多合一的解决方案是很好的,但它是臃肿的

    补充阅读,a 功能齐全 docker-compose this blog this blog by @rmoff

    The Confluent quickstart (Docker) document 假设所有生产和消费请求都在Docker网络中。

    您可以解决连接到的问题 kafka:9092 在使用Docker网桥的容器中运行Kafka客户机代码,否则您需要添加更多的环境变量以对外公开容器,同时使其在Docker网络中工作。

    首先添加的协议映射 PLAINTEXT_HOST:PLAINTEXT 将侦听器协议映射到Kafka协议

    密钥: KAFKA_LISTENER_SECURITY_PROTOCOL_MAP
    价值: PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT

    然后在不同的端口上设置两个播发侦听器( kafka 这里是指docker容器的名称;它也可能被命名为 broker ,所以请仔细检查您的服务+主机名)。请注意,协议与上面映射的右侧值匹配

    密钥: KAFKA_ADVERTISED_LISTENERS
    PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092

    运行容器时,添加 -p 29092:29092 对于主机端口映射

    热释光;博士 (使用上述设置)

    客户端在同一台计算机上,而不是在容器中

    运行任何Kafka客户端时 外部 localhost:29092 localhost:2181 用于Zookeeper(需要Docker端口转发)

    另一台计算机上的客户端

    以及/代替localhost .
    简单地用端口转发播发localhost将不起作用,因为Kafka协议仍将继续播发您配置的侦听器。

    需要Docker端口转发

    同一主机上容器中的客户端

    在Docker网络中 ,使用 kafka:9092 (见广告) PLAINTEXT 用于引导服务器和 zookeeper:2181 对于Zookeeper,就像其他Docker服务通信一样(不需要任何端口转发)

    docker run 命令或编写文件时,需要定义共享 network 手动

    See the example Compose file for the full Confluent stack

    附录

    https://operatorhub.io/?keyword=Kafka