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

需求

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

一、搭建精簡版 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 集群

精簡版集群創(chuàng)建比較簡單,但是并不實(shí)用,以下創(chuàng)建可用版的集群。

wurstmeister/kafka 鏡像搞了半天,搞出的集群無法被容器外部訪問,這為調(diào)試、開發(fā)帶來不便,現(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)聽指定 topic
 ./kafka-console-consumer.bat --bootstrap-server localhost:9083 --topic test-bitkylin --from-beginning

經(jīng)過以上操作,可以驗(yàn)證發(fā)送消息、接收消息均正常。尤其驗(yàn)證了容器外訪問 kafka 容器是正常的,這是難點(diǎn)?。?!

通過 Spring boot + Spring kafka 對 kafka 集群消息發(fā)送、接收的示例,見如下代碼:
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,容器集群外要訪問 kafka 容器時(shí),必須通過暴露的 IP:PORT 進(jìn)行訪問,不能進(jìn)行任何變更。此處設(shè)計(jì)據(jù)說是為了防止中間人攻擊。

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

參考鏈接

  1. kafka 的 Docker 鏡像使用說明(wurstmeister-kafka)
  2. docker image:wurstmeister/kafka
  3. docker image:bitnami-docker-kafka
  4. 示例代碼:bitkylin-kafka
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容