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