【问题标题】:How do I send messages to Docker (bitnami) Apache Kafka from host machine?如何从主机向 Docker (bitnami) Apache Kafka 发送消息?
【发布时间】:2019-10-18 13:08:07
【问题描述】:

我可以让我的 Apache Kafka 生产者在容器内运行时发送消息。但是,当我的生产者在主机的容器外运行时,它不起作用。我怀疑这是我的 Docker 撰写文件的 Docker 网络问题,但我无法弄清楚。

我尝试了网上发布的与我的问题类似的解决方案,但它们对我不起作用。救命!

  1. Docker 编写文件
version: '3'
services:
  zookeeper:
    image: 'bitnami/zookeeper:latest'
    ports:
      - '2181:2181'
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes
  kafka:
    image: 'bitnami/kafka:latest'
    ports:
      - '9092:9092'
    environment:_
      - KAFKA_BROKER_ID=1
      - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
      - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
      - ALLOW_PLAINTEXT_LISTENER=yes

  1. 主机制作人

//import util.properties packages
import java.util.Properties;

//import simple producer packages
import org.apache.kafka.clients.producer.Producer;

//import KafkaProducer packages
import org.apache.kafka.clients.producer.KafkaProducer;

//import ProducerRecord packages
import org.apache.kafka.clients.producer.ProducerRecord;

//Create java class named “SimpleProducer”
public class SimpleProducer {

   public static void main(String[] args) throws Exception{

      // Check arguments length value
      if(args.length == 0){
         System.out.println("Enter topic name");
         return;
      }

      //Assign topicName to string variable
      String topicName = args[0].toString();

      // create instance for properties to access producer configs   
      Properties props = new Properties();

      //Assign localhost id
      props.put("bootstrap.servers", "localhost:9092");

      //Set acknowledgements for producer requests.      
      props.put("acks", "all");

      //If the request fails, the producer can automatically retry,
      props.put("retries", 0);

      //Specify buffer size in config
      props.put("batch.size", 16384);

      //Reduce the no of requests less than 0   
      props.put("linger.ms", 1);

      //The buffer.memory controls the total amount of memory available to the producer for buffering.   
      props.put("buffer.memory", 33554432);

      props.put("key.serializer", 
         "org.apache.kafka.common.serialization.StringSerializer");

      props.put("value.serializer", 
         "org.apache.kafka.common.serialization.StringSerializer");

      Producer<String, String> producer = new KafkaProducer
         <String, String>(props);

      for(int i = 0; i < 10; i++)
         producer.send(new ProducerRecord<String, String>(topicName, 
            Integer.toString(i), Integer.toString(i)));
               System.out.println("Message sent successfully");
               producer.close();
   }
}

主机生产者应该向 Docker Apache kafka 发布消息,但它没有。它创建主题,但从未收到消息。我究竟做错了什么?这是一个 bitnami 图像,不是 Confluent 图像。

【问题讨论】:

  • 错字? localcost:9092?
  • 基于@cricket_007 响应,我在我的 Docker-compose 文件中添加/更改了以下行,它适用于我的 Docker Apache Kafka 的 bitnami 图像:- KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT - KAFKA_LISTENERS=PLAINTEXT://:9092,PLAINTEXT_HOST://:29092 - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092

标签: docker apache-kafka kafka-producer-api


【解决方案1】:

来自我的previous answer here

我需要做的是将 LISTENERS 声明为都绑定到 docker 主机,然后以不同的方式通告它们 - 一个到 docker 网络,一个到主机。

services:
  zookeeper:
    image: confluentinc/cp-zookeeper
    ports:
      - "2181:2181"
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
      ZOOKEEPER_TICK_TIME: 2000
      ZOOKEEPER_SYNC_LIMIT: 2
  kafka:
    image: confluentinc/cp-kafka
    ports:
      - 9094:9094
    depends_on:
      - zookeeper
    environment:
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_LISTENERS: INTERNAL://kafka:9092,OUTSIDE://kafka:9094
      KAFKA_ADVERTISED_LISTENERS: INTERNAL://kafka:9092,OUTSIDE://localhost:9094
      KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: INTERNAL:PLAINTEXT,OUTSIDE:PLAINTEXT
      KAFKA_INTER_BROKER_LISTENER_NAME: INTERNAL

现在,您可以在 localhost 上的 :9094(根据 OUTSIDE 侦听器和 docker-compose 文件中的 ports 条目)和 Docker 网络中的 :9092 获得 Kafka。

【讨论】:

    【解决方案2】:

    此解决方案适用于 Apache Kafka 的 bitnami Docker 映像。感谢@cricket_007 和@daniu 的解决方案。我在 Kafka 环境部分的 Docker-compose 文件中更新了几行。

    这是完整的、更新的 Docker-compose 文件:

    version: '3'
    services:
      zookeeper:
        image: 'bitnami/zookeeper:latest'
        ports:
          - '2181:2181'
        environment:
          - ALLOW_ANONYMOUS_LOGIN=yes
      kafka:
        image: 'bitnami/kafka:latest'
        ports:
          - '9092:9092'
          - '29092:29092'
        environment:
          - KAFKA_BROKER_ID=1
          - KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
          - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=PLAINTEXT:PLAINTEXT,PLAINTEXT_HOST:PLAINTEXT 
          - KAFKA_LISTENERS=PLAINTEXT://:9092,PLAINTEXT_HOST://:29092 
          - KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://kafka:9092,PLAINTEXT_HOST://localhost:29092
          - ALLOW_PLAINTEXT_LISTENER=yes
    
    

    【讨论】:

    • 这和我的有什么不同?
    • @daniu 专门问的关于bitnami容器的问题
    • @cricket_007 是的,但这只是 docker 镜像名称的区别。问题是为 kafka 容器提供外部端口;这是通过 LISTENERs-setup 完成的,也是一样的。
    猜你喜欢
    • 2018-02-08
    • 1970-01-01
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多