无法使用单独的docker compose文件将我的节点应用程序连接到kafka

xvw2m8pv  于 2021-06-06  发布在  Kafka
关注(0)|答案(2)|浏览(363)

那么设置在哪里呢。2个写文件,快4个了。所有内容都不能存在于同一个compose文件中,因为它分布在不同的项目中。所以让我大吃一惊的是,如果我在kafka docker compose中放置一个基本的ngnix服务器,我就可以很好地将我的节点应用程序连接到它上。。。但我无法连接到Kafka。。。如果我在docker外运行我的节点应用程序,我可以很好地连接到kafka。。。不知道为什么我不能和Kafka联系上。


# Micro Services that connect to kafka

version: '3.5'
services:
  grouping:
    build:
      dockerfile: grouping.docker
      context: .
    container_name: grouping
    ports:
      - "8080:8080"
    networks:
      - kafka-network
      - notifications-network
  sending:
    build:
      dockerfile: sending.docker
      context: .
    container_name: sending
    ports:
      - "8081:8081"
    networks:
      - kafka-network
      - notifications-network
    depends_on:
      - grouping
networks:
  kafka-network:
    external: true
  notifications-network:
    driver: bridge
    name: notifications-network

# Kafka

version: '3.5'
services:
  zookeeper:
    image: "confluentinc/cp-zookeeper"
    container_name: zookeeper
    ports:
      - "2181:2181"
    networks:
      - kafka-network
      - notifications-network
    environment:
      ZOOKEEPER_CLIENT_PORT: 2181
  kafka:
    image: "confluentinc/cp-kafka"
    container_name: kafka
    ports:
      - "9092:9092"
    networks:
      - kafka-network
      - notifications-network
    depends_on:
      - zookeeper
    environment:
      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
      KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
  web:
    image: nginx
    command: [nginx-debug, '-g', 'daemon off;']
    container_name: web
    ports:
      - "1337:80"
    networks:
      - kafka-network
networks:
  kafka-network:
    driver: bridge
    name: kafka-network
  notifications-network:
    external: true

使用 kafka-nodeconfig 我就这样联系在一起

const kafkaConfig = config.get('kafka');
const kafkaClient = new kafka.KafkaClient({kafkaHost: kafkaConfig.host});
const consumer = bluebird.promisifyAll(new kafka.Consumer(kafkaClient, [{topic: kafkaConfig.topic}], {autoCommit: false}), {multiArgs: true});

我试过:

kafkaConfig.host = 'kafka:9092'
kafkaConfig.host = 'http://kafka:9092'
kafkaConfig.host = 'kafka'
kafkaConfig.host = 'http://kafka'

我错过了什么?一定很简单吧?
docker network ls显示:

NETWORK ID          NAME                    DRIVER              SCOPE
ee3aceffe54b        bridge                  bridge              local
b05926fff0ed        host                    host                local
18c96f1f6d2d        kafka-network           bridge              local
391880718a8b        none                    null                local
19e81dea1d65        notifications-network   bridge              local

使用request,我可以从grouping或sending服务连接到grouping、sending和web服务。

const request = require('request');
request.get('http://sending:8081', (err, res) => logger.info('Got from sending:', err, res && res.body));

request.get('http://grouping:8080', (err, res) => logger.info('Got from grouping:', err, res && res.body));

request.get('http://web', (err, res) => logger.info('Got from kafka web:', err, res && res.body));

// Returns a peer reset connection error, which is different from the not found error.
request.get('http://kafka:9092', (err, res) => logger.info('Got from kafka web:', err, res && res.body));

只是一个更新:所以web服务在kafka网络上,我的其他服务可以连接到它,他们甚至可以尝试发送到kafka的连接,但是kafka没有web服务,并且重置了对等方。所以他们可以和Kafka谈谈,但Kafka并没有按预期的那样工作。我还收到一封信 Broker not available 当我的kafka客户端尝试在docker容器内连接时出错。

vecaoik1

vecaoik11#

为了能够从compose网络中的进程和外部连接,您需要在内部通告两个侦听器plaintext://kafka:9092与上一个答案相同,一个用于外用:external://localhost:9093
使用内部和外部客户端访问kafka为了使用内部和外部客户端访问kafka代理,您需要为每种客户端配置一个侦听器。
为此,请将以下环境变量添加到docker compose中:

environment:
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
      - ALLOW_PLAINTEXT_LISTENER=yes
      - KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT
      - KAFKA_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:9093
      - KAFKA_CFG_ADVERTISED_LISTENERS=CLIENT://kafka:9092,EXTERNAL://localhost:9093
      - KAFKA_INTER_BROKER_LISTENER_NAME=CLIENT

这来自bitnami图像:https://github.com/bitnami/bitnami-docker-kafka 但合流的Kafka形象也应该如此

wb1gzix0

wb1gzix02#

我甚至可以肯定,如果这是一个有效的答案,但简而言之,上面的工作只是与您使用的罚款kafka:9092 as 主机名。我的dockerginore文件忽略了local.json,所以我正在编辑的文件从未被复制过。。。
更新:配置只是答案的一部分,Kafka的环境变量的另一部分。

KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092

我们不需要这样 localhost:9092 ,但作为 kafka:9092 显然我已经和Zookeeper一起做过了,但从未意识到。

KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

相关问题