前置环境条件
- docker-compose
- nodejs调用kafka使用kafka-node
kafka镜像选择:
安装步骤
- docker pull wurstmeister/kafka
- git clone github.com/wurstmeiste…
项目需要完整的clone下来,而不是只创建docker-compose.yml配置文件,否则启动时候就会报DockerFile找不到的错误。高手另说。。。
- 进入clone下的目录,编辑docker-compose.yml文件,将KAFKA_ADVERTISED_HOST_NAME字段修改为实际ip地址
version: '2'
services:
zookeeper:
image: wurstmeister/zookeeper
ports:
- "2181:2181"
kafka:
build: .
ports:
- "9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 10.6.19.121
KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
volumes:
- /var/run/docker.sock:/var/run/docker.sock
- 启动集群
docker-compose up -d
,也可以启动多个kafka的集群docker-compose scale kafka=3
。关闭命令docker-compose stop
- 启动集群成功后,可以通过
docker ps
查看启动状态。另外需要注意的是,映射的32772这里的端口,才是你能够真正访问到的端口地址,而不是使用9092
测试
- 通过
docker ps
获取kafka服务的dockerId,执行下列命令进入kafkadocker exec -it {dockerId} /bin/bash
。 - 进入目录
/opt/kafka_2.12-2.2.0/bin
,目录中应有下列一些脚本 - 创建一个topic
kafka-topics.sh --create --zookeeper {zookeeperName} --replication-factor 1 --partitions 1 --topic {topicName}
- 查看topic列表
kafka-topics.sh --list --zookeeper {zookeeperName}
zookeeperName可以通过docker ps
获取 - 发布消息
kafka-console-producer.sh --topic=test --broker-list localhost:9092
- 接收消息
kafka-console-consumer.sh --bootstrap-server localhost:9092 --from-beginning --topic test
- 发布消息和接收消息可以通过
control c
退出。消息流能走通,说明kafka部署就已经没问题,可以继续使用了。
nodejs中集成kafka
生产者(producer)
const kafka = require('kafka-node')
const Producer = kafka.Producer
const client = new kafka.KafkaClient({kafkaHost: '10.6.18.78:32776'})
const producer = new Producer(client)
const payloads = [
{ topic: 'test', messages: '232323311', partition: 0}
];
producer.on('ready', function () {
producer.send(payloads, function (err, data) {
if (err) {
console.error('发送失败', err)
} else {
console.log(data);
}
});
});
producer.on('error', function (err) {
console.error(err)
})
消费者(consumer)
var kafka = require('kafka-node'),
Consumer = kafka.Consumer,
client = new kafka.KafkaClient({kafkaHost: '10.6.18.78:32776'}),
consumer = new Consumer(
client,
[
{ topic: 'test'}
],
{
groupId: 'test'
}
);
consumer.on('message', message => {
console.log(message)
consumer.setOffset(message.topic, message.partition, message.offset)
})
consumer.on('error', error => {
console.error('消费错误', error)
})
消费信息打印结果: