kafka的docker部署及nodejs使用

1,348 阅读2分钟

前置环境条件

kafka镜像选择:

wurstmeister/kafka

安装步骤

  1. docker pull wurstmeister/kafka
  2. git clone github.com/wurstmeiste…

项目需要完整的clone下来,而不是只创建docker-compose.yml配置文件,否则启动时候就会报DockerFile找不到的错误。高手另说。。。

  1. 进入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
  1. 启动集群 docker-compose up -d,也可以启动多个kafka的集群docker-compose scale kafka=3。关闭命令docker-compose stop
  2. 启动集群成功后,可以通过docker ps查看启动状态。另外需要注意的是,映射的32772这里的端口,才是你能够真正访问到的端口地址,而不是使用9092

测试

  • 通过docker ps获取kafka服务的dockerId,执行下列命令进入kafka docker 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)
})

消费信息打印结果: