Node.js Can';不要让我的节点应用程序通过单独的docker compose文件连接到kafka

Node.js Can';不要让我的节点应用程序通过单独的docker compose文件连接到kafka,node.js,docker,networking,apache-kafka,docker-compose,Node.js,Docker,Networking,Apache Kafka,Docker Compose,那么设置在哪里呢。2编写文件,不久将成为4。所有内容都不能存在于同一个compose文件中,因为它分布在项目之间。所以,让我大吃一惊的是,如果我在我的kafka docker compose中安装了一个基本的ngnix服务器,我就可以将我的节点应用程序连接到它上了。。。但我无法连接到卡夫卡。。。如果我在docker外部运行我的节点应用程序,我可以很好地连接到kafka。。。不知道为什么我无法连接到卡夫卡 # Micro Services that connect to kafka version

那么设置在哪里呢。2编写文件,不久将成为4。所有内容都不能存在于同一个compose文件中,因为它分布在项目之间。所以,让我大吃一惊的是,如果我在我的kafka docker compose中安装了一个基本的ngnix服务器,我就可以将我的节点应用程序连接到它上了。。。但我无法连接到卡夫卡。。。如果我在docker外部运行我的节点应用程序,我可以很好地连接到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
使用带有
config
kafka节点
,我这样连接

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
使用请求,我可以从分组或发送服务连接到分组、发送和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客户端尝试在docker容器内连接时,我还收到一个
代理不可用的
错误。

我甚至可以确定这是否是一个有效的答案,但简单地说,上面的内容对于使用kafka:9092作为主机名很好。我的dockerignore文件忽略了我的local.json,因此我正在编辑的文件从未被复制过

更新: 配置只是答案的一部分,卡夫卡的环境变量的另一部分

KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://kafka:9092
我们需要的不是
localhost:9092
,而是
kafka:9092

显然,我已经在和动物园管理员一起做这件事了,但从来没有意识到

KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

为了能够从compose网络中的进程和外部连接,您需要公布两个侦听器,一个是内部明文://kafka:9092,与前面的答案类似,另一个是外部使用:外部://localhost:9093

通过内部和外部客户访问卡夫卡 为了使用内部和外部客户端访问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图像:但是合流的kafka图像也应该起同样的作用。为了排除故障,我首先要进入其中一个容器并检查是否可以与其他容器通信,使用
ping
telnet
甚至
nc
等工具。如果我不清楚,这就是我对web服务所做的。因此,web服务位于kafka网络上,我的其他服务可以连接到它,它们甚至可以尝试向kafka发送连接,但kafka没有web服务并重置对等方。所以他们可以和卡夫卡聊聊天,但卡夫卡并没有按照想象的那样工作,所以它确实起作用了。我刚把我的配置文件放在docker忽略。。。裂开