搭建基于 docker 的 Kafka 集群及 Spring Boot 應(yīng)用訪問(wèn)

需求

  1. 搭建一個(gè) 3 節(jié)點(diǎn) kafka 集群,測(cè)試功能和性能
  2. 實(shí)現(xiàn) Spring kafka 下對(duì) kafka 集群的操作

一弱贼、搭建精簡(jiǎn)版 kafka 集群

參考排名第一的 kafka 鏡像 wurstmeister/kafka 的官方文檔,進(jìn)行如下操作:

  1. 創(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ò)展容器。

  1. 集群操作

在 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

  1. 創(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
  1. 創(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
  1. 啟動(dòng)三節(jié)點(diǎn) kafka 集群
docker-compose up -d
  1. 操作
# --- 容器集群內(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)了消息薄风。

備忘

  1. kafka 需配置完整的代理 IP:PORT饵较,容器集群外要訪問(wèn) kafka 容器時(shí),必須通過(guò)暴露的 IP:PORT 進(jìn)行訪問(wèn)遭赂,不能進(jìn)行任何變更循诉。此處設(shè)計(jì)據(jù)說(shuō)是為了防止中間人攻擊。

  2. 容器外訪問(wèn) kafka 容器確實(shí)很麻煩撇他,研究了很久茄猫,bitnami-docker-kafka 鏡像的官方文檔寫的很好,可以研讀困肩。

參考鏈接

  1. kafka 的 Docker 鏡像使用說(shuō)明(wurstmeister-kafka)
  2. docker image:wurstmeister/kafka
  3. docker image:bitnami-docker-kafka
  4. 示例代碼:bitkylin-kafka
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末划纽,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子锌畸,更是在濱河造成了極大的恐慌勇劣,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潭枣,死亡現(xiàn)場(chǎng)離奇詭異比默,居然都是意外死亡幻捏,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門退敦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)粘咖,“玉大人,你說(shuō)我怎么就攤上這事侈百。” “怎么了翰铡?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵钝域,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我锭魔,道長(zhǎng)例证,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任迷捧,我火速辦了婚禮织咧,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘漠秋。我一直安慰自己笙蒙,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布庆锦。 她就那樣靜靜地躺著捅位,像睡著了一般。 火紅的嫁衣襯著肌膚如雪搂抒。 梳的紋絲不亂的頭發(fā)上艇搀,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天,我揣著相機(jī)與錄音求晶,去河邊找鬼焰雕。 笑死,一個(gè)胖子當(dāng)著我的面吹牛芳杏,可吹牛的內(nèi)容都是我干的矩屁。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼蚜锨,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼档插!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起亚再,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤郭膛,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后氛悬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體则剃,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡耘柱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了棍现。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片调煎。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖己肮,靈堂內(nèi)的尸體忽然破棺而出士袄,到底是詐尸還是另有隱情,我是刑警寧澤谎僻,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布娄柳,位于F島的核電站,受9級(jí)特大地震影響艘绍,放射性物質(zhì)發(fā)生泄漏赤拒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一诱鞠、第九天 我趴在偏房一處隱蔽的房頂上張望挎挖。 院中可真熱鬧,春花似錦航夺、人聲如沸蕉朵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)墓造。三九已至,卻和暖如春锚烦,著一層夾襖步出監(jiān)牢的瞬間觅闽,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工涮俄, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蛉拙,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓彻亲,卻偏偏與公主長(zhǎng)得像孕锄,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子苞尝,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359