Не удается подключить мое приложение для узла к kafka с отдельным файлом для создания докера - PullRequest
0 голосов
/ 27 апреля 2018

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

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 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 пытается установить соединение внутри контейнера Docker.

1 Ответ

0 голосов
/ 27 апреля 2018

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

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

KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092

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

очевидно, я уже делал это с zookeeper, но никогда не осознавал этого.

KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
...