需求
- 搭建一個(gè) 3 節(jié)點(diǎn) kafka 集群,測(cè)試功能和性能
- 實(shí)現(xiàn) Spring kafka 下對(duì) kafka 集群的操作
一弱贼、搭建精簡(jiǎn)版 kafka 集群
參考排名第一的 kafka 鏡像 wurstmeister/kafka 的官方文檔,進(jìn)行如下操作:
- 創(chuàng)建 docker-compose.yml 文件呕诉,內(nèi)容如下:
version: '1'
services:
zookeeper:
image: zookeeper
container_name: bitkylin-kafka-zookeeper
ports:
- "2181:2181"
kafka:
image: wurstmeister/kafka
ports:
- "9092"
environment:
kafka_ADVERTISED_HOST_NAME: 172.17.0.1
kafka_ZOOKEEPER_CONNECT: zookeeper:2181
volumes:
- /var/run/docker.sock:/var/run/docker.sock
關(guān)鍵點(diǎn):未指定 kafka 容器名、未暴露 kafka 相關(guān)端口欲险,便于 docker-compose 命令自伸縮擴(kuò)展容器。
- 集群操作
在 docker-compose.yml 文件所在目錄下匹涮,可執(zhí)行如下操作:
# 啟動(dòng)單 kafka 節(jié)點(diǎn)的集群
docker-compose up -d
# 啟動(dòng)三個(gè) kafka 節(jié)點(diǎn)的集群
docker-compose up --scale kafka=3
# 銷毀集群
docker-compose stop
二天试、完整版 kafka 集群
精簡(jiǎn)版集群創(chuàng)建比較簡(jiǎn)單,但是并不實(shí)用然低,以下創(chuàng)建可用版的集群喜每。
wurstmeister/kafka
鏡像搞了半天,搞出的集群無(wú)法被容器外部訪問(wèn)雳攘,這為調(diào)試带兜、開發(fā)帶來(lái)不便,現(xiàn)更換鏡像重搞一次吨灭。
更換為鏡像:bitnami-docker-kafka
- 創(chuàng)建單節(jié)點(diǎn) kafka 集群:
version: '1'
services:
zookeeper:
image: zookeeper
container_name: bitkylin-kafka-zookeeper
ports:
- "2181:2181"
kafka:
image: 'bitnami/kafka'
ports:
- '9092:9092'
environment:
- kafka_BROKER_ID=1
- kafka_LISTENERS=PLAINTEXT://:9092
- kafka_ADVERTISED_LISTENERS=PLAINTEXT://127.0.0.1:9092
- kafka_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
depends_on:
- zookeeper
- 創(chuàng)建 3 節(jié)點(diǎn) kafka 集群:
version: '2'
services:
zookeeper:
image: zookeeper
container_name: bitkylin-kafka-zookeeper
ports:
- "2181:2181"
kafka-1:
image: 'bitnami/kafka'
container_name: bitkylin-kafka-1
ports:
- '9081:9081'
environment:
- kafka_BROKER_ID=11
- kafka_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
- kafka_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT
- kafka_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:9081
- kafka_CFG_ADVERTISED_LISTENERS=CLIENT://:9092,EXTERNAL://localhost:9081
- kafka_INTER_BROKER_LISTENER_NAME=CLIENT
depends_on:
- zookeeper
kafka-2:
image: 'bitnami/kafka'
container_name: bitkylin-kafka-2
ports:
- '9082:9082'
environment:
- kafka_BROKER_ID=12
- kafka_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
- kafka_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT
- kafka_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:9082
- kafka_CFG_ADVERTISED_LISTENERS=CLIENT://:9092,EXTERNAL://localhost:9082
- kafka_INTER_BROKER_LISTENER_NAME=CLIENT
depends_on:
- zookeeper
kafka-3:
image: 'bitnami/kafka'
container_name: bitkylin-kafka-3
ports:
- '9083:9083'
environment:
- kafka_BROKER_ID=13
- kafka_ZOOKEEPER_CONNECT=zookeeper:2181
- ALLOW_PLAINTEXT_LISTENER=yes
- kafka_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CLIENT:PLAINTEXT,EXTERNAL:PLAINTEXT
- kafka_CFG_LISTENERS=CLIENT://:9092,EXTERNAL://:9083
- kafka_CFG_ADVERTISED_LISTENERS=CLIENT://:9092,EXTERNAL://localhost:9083
- kafka_INTER_BROKER_LISTENER_NAME=CLIENT
depends_on:
- zookeeper
- 啟動(dòng)三節(jié)點(diǎn) kafka 集群
docker-compose up -d
- 操作
# --- 容器集群內(nèi) - 基于節(jié)點(diǎn) 1 發(fā)送消息 ---
# 進(jìn)入其中一個(gè) kafka 容器
docker exec -it bitkylin-kafka-1 /bin/bash
# 從節(jié)點(diǎn) 1 發(fā)送消息
kafka-console-producer.sh --bootstrap-server localhost:9092 --topic test-bitkylin
# --- 容器集群外 - 基于節(jié)點(diǎn) 3 接收消息 ---
# 進(jìn)入 kafka 安裝目錄
cd /opt/kafka_2.13-2.7.0/bin
# 從節(jié)點(diǎn) 3 監(jiān)聽(tīng)指定 topic
./kafka-console-consumer.bat --bootstrap-server localhost:9083 --topic test-bitkylin --from-beginning
經(jīng)過(guò)以上操作刚照,可以驗(yàn)證發(fā)送消息、接收消息均正常沃于。尤其驗(yàn)證了容器外訪問(wèn) kafka 容器是正常的涩咖,這是難點(diǎn)!7庇ā檩互!
通過(guò) Spring boot + Spring kafka 對(duì) kafka 集群消息發(fā)送、接收的示例咨演,見(jiàn)如下代碼:
bitkylin-kafka
啟動(dòng) Spring boot 應(yīng)用后闸昨,仍然使用 bitkylin-kafka-1 容器中的消息生產(chǎn)者發(fā)送消息,可以看到 Spring boot 應(yīng)用和連接 bitkylin-kafka-3 的外部消費(fèi)者均全量消費(fèi)了消息薄风。
備忘
kafka 需配置完整的代理
IP:PORT
饵较,容器集群外要訪問(wèn) kafka 容器時(shí),必須通過(guò)暴露的IP:PORT
進(jìn)行訪問(wèn)遭赂,不能進(jìn)行任何變更循诉。此處設(shè)計(jì)據(jù)說(shuō)是為了防止中間人攻擊。容器外訪問(wèn) kafka 容器確實(shí)很麻煩撇他,研究了很久茄猫,bitnami-docker-kafka 鏡像的官方文檔寫的很好,可以研讀困肩。