前置環境條件
- 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)
})
複製程式碼
消費資訊列印結果: