Не удается подключить мое приложение к узлу kafka с отдельным файлом компоновки докеров

Итак, где настройка. 2 составляют файлы, которые скоро будут 4. Все не может жить в одном файле компоновки, потому что он распространяется между проектами. Итак, что бросает мой мозг из воды, так это то, что если я положу базовый сервер ngnix в мой kafka docker-compose, я могу подключить его приложение к нему просто отлично... Но я не могу подключиться к 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-node с config и я подключаюсь так

const kafkaConfig = config.get('kafka');
const kafkaClient = new kafka.KafkaClient({kafkaHost: kafkaConfig.host});
const consumer = ********.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 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

Используя запрос, я могу подключиться к группировке, отправке и веб-сервисам из службы группировки или отправки.

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));

Просто обновление: так что веб-сервис находится в сети kafka, другие мои сервисы могут подключиться к нему, и они даже могут попытаться отправить соединение с kafka, но у kafka нет веб-службы и сброс сверстника. Поэтому они могут поговорить с кафкой, но кафка не работает, как это полагается. Я также получаю ошибку Broker not available когда мой клиент kafka пытается подключиться к контейнеру докера.

1 ответ

Я даже уверен, что это верный ответ, но вкратце, что выше работает отлично с вами, используйте kafka: 9092 как имя хоста. У меня был файл dockerignore, игнорирующий мой local.json, поэтому файл, который я редактировал, никогда не копировался...

Обновление: Config был всего лишь частью ответа, другая часть переменных среды для kafka.

KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092

нам нужно, чтобы это не было localhost:9092, но как kafka:9092

видимо, я уже делал это с zookeeper, но так и не понял.

KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

licensed under cc by-sa 3.0 with attribution.