1. 程式人生 > >Docker下極速體驗Kafka

Docker下極速體驗Kafka

快速體驗Kafka

Kafka是一種高吞吐量的分散式釋出訂閱訊息系統,從本章開始我們先極速體驗,再實戰docker下搭建kafka環境,最後開發一個java web應用來體驗kafka服務。

我們一起用最快的速度體驗kafka的訊息釋出訂閱功能:

新建一個docker-compose.yml檔案,內容如下:

version: '2'
services:
  zk_server: 
    image: daocloud.io/library/zookeeper:3.3.6
    restart: always
  kafka_server: 
    image: bolingcavalry/kafka:0.0.1
    links: 
      - zk_server:
zkhost
command: /bin/sh -c '/usr/local/work/start_server.sh' restart: always message_producer: image: bolingcavalry/kafka:0.0.1 links: - zk_server:zkhost - kafka_server:kafkahost restart: always message_consumer: image: bolingcavalry/kafka:0.0.1 links: - zk_server:
zkhost
restart: always

開啟終端,在docker-compose.yml所在目錄下執行docker-compose up -d,由於需要從hub.docker.com下載映象,所以需要等待幾分鐘,下載結束後會自動啟動四個容器,如下圖:

為了更好的觀察效果,我們要開啟三個終端對不同的容器做操作,在後面我們用編號來表達不同的終端,編號對應如下:

  • 1號 : kafka server
  • 2號 : 訊息生產者(producer)
  • 3號 : 訊息消費者(consumer)

1號終端中輸入以下命令,即可看到kafka server的實時輸出資訊:

docker logs -f
dockerkafka_kafka_server_1

輸入命令後看到的資訊如下圖,與zookeeper連線成功,啟動成功:

2號終端中輸入以下命令,進入訊息生產者容器:

docker exec -it dockerkafka_message_producer_1 /bin/bash

再執行以下命令建立一個主題:

$WORK_PATH/$KAFKA_PACKAGE_NAME/bin/kafka-topics.sh --create --zookeeper zkhost:2181 --replication-factor 1 --partitions 1 --topic test001

3號終端中輸入以下命令,進入訊息消費者容器:

docker exec -it dockerkafka_message_consumer_1 /bin/bash

執行以下命令可以檢視當前kafka sever上的所有主題:

$WORK_PATH/$KAFKA_PACKAGE_NAME/bin/kafka-topics.sh --list --zookeeper zkhost:2181

可以看到剛才在2號終端建立的主題,如下圖:

繼續在3號終端上執行以下命令,即可訂閱主題為test001的訊息:

$WORK_PATH/$KAFKA_PACKAGE_NAME/bin/kafka-console-consumer.sh --zookeeper zkhost:2181 --topic test001 --from-beginning

此時回到1號終端,可以看到訊息訂閱者容器的連線資訊,如下圖:

現在主題也建立了,訂閱也添加了,可以測試訊息的傳送和接收了:

在2號終端,執行以下命令,就可以進入傳送訊息的互動模式:

$WORK_PATH/$KAFKA_PACKAGE_NAME/bin/kafka-console-producer.sh --broker-list kafkahost:9092 --topic test001

此時已經進入了互動模式,繼續輸入一個字串,例如hello world!,再輸入回車鍵,即可傳送內容為”hello world!”的訊息,如下圖:

現在回到3號終端,可以看到已經接收到了最新的訊息,內容被打印出來了,如下圖:

最後我們回到1號終端,能看到訊息生產者的連線資訊,如下圖:

至此,我們快速體驗了kafka的訊息釋出訂閱功能,下一節我們再細說docker下kafka環境的搭建過程。

本地環境搭建

上節我們快速體驗了kafka的訊息分發和訂閱功能,但是對環境搭建的印象僅僅是執行了幾個命令和指令碼,本章我們通過實戰來學習如何編寫這些指令碼,搭建本地kafka環境;

整個環境涉及到多個容器,我們先把它們全部列出來,再梳理一下之間的關係,如下圖:

  • kafka sever提供訊息服務;
  • message producer的作用是產生執行主題的訊息;
  • message consumer的作用是訂閱指定主題的訊息並消費掉。

zookeeper
zookeeper使用單機版,沒什麼需要定製的,因此直接使用官方映象即可,daocloud.io/library/zookeeper:3.3.6

kafka sever
去hub.docker.com上搜索kafka,沒看到官方標誌的映象,還是自己做一個吧,寫Dockerfile之前先準備兩個材料:kafka安裝包和啟動kafka的shell指令碼;

kafka安裝包用的是2.9.2-0.8.1版本,在
[email protected]:zq2599/docker_kafka.git中,請clone獲取;

啟動kafka server的shell指令碼內容如下,很簡單,在kafka的bin目錄下執行指令碼啟動server即可:

#!/bin/bash
$WORK_PATH/$KAFKA_PACKAGE_NAME/bin/kafka-server-start.sh $WORK_PATH/$KAFKA_PACKAGE_NAME/config/server.properties

接下來可以編寫Dockerfile了,如下:

# Docker image of kafka
# VERSION 0.0.1
# Author: bolingcavalry

#基礎映象使用tomcat,這樣可以免於設定java環境
FROM daocloud.io/library/tomcat:7.0.77-jre8

#作者
MAINTAINER BolingCavalry <zq2599@gmail.com>

#定義工作目錄
ENV WORK_PATH /usr/local/work

#定義kafka資料夾名稱
ENV KAFKA_PACKAGE_NAME kafka_2.9.2-0.8.1

#建立工作目錄
RUN mkdir -p $WORK_PATH

#把啟動server的shell複製到工作目錄
COPY ./start_server.sh $WORK_PATH/

#把kafka壓縮檔案複製到工作目錄
COPY ./$KAFKA_PACKAGE_NAME.tgz $WORK_PATH/

#解壓縮
RUN tar -xvf $WORK_PATH/$KAFKA_PACKAGE_NAME.tgz -C $WORK_PATH/

#刪除壓縮檔案
RUN rm $WORK_PATH/$KAFKA_PACKAGE_NAME.tgz

#執行sed命令修改檔案,將連線zk的ip改為link引數對應的zookeeper容器的別名
RUN sed -i 's/zookeeper.connect=localhost:2181/zookeeper.connect=zkhost:2181/g' $WORK_PATH/$KAFKA_PACKAGE_NAME/config/server.properties

#給shell賦予執行許可權
RUN chmod a+x $WORK_PATH/start_server.sh

如指令碼所示,操作並不複雜,複製解壓kafka安裝包,啟動shell指令碼,再把配置檔案中zookeeper的ip改成link時zookeeper的別名;

Dockerfile編寫完成後,和kafka_2.9.2-0.8.1.tgz以及start_server.sh放在同一個目錄下,用控制檯在此目錄下執行:

docker build -t bolingcavalry/kafka:0.0.1 .

映象構建成功後,新建一個目錄編寫docker-compose.yml指令碼,如下:

version: '2'
services:
  zk_server: 
    image: daocloud.io/library/zookeeper:3.3.6
    restart: always
  kafka_server: 
    image: bolingcavalry/kafka:0.0.1
    links: 
      - zk_server:zkhost
    command: /bin/sh -c '/usr/local/work/start_server.sh'
    restart: always
  message_producer: 
    image: bolingcavalry/kafka:0.0.1
    links: 
      - zk_server:zkhost
      - kafka_server:kafkahost
    restart: always
  message_consumer: 
    image: bolingcavalry/kafka:0.0.1
    links: 
      - zk_server:zkhost
    restart: always

docker-compose.yml中配置了四個容器:
1. zookeeper是官方的;
2. 其他三個都是用剛剛製作的bolingcavalry/kafka做映象生成的;
3. kafka_server在啟動時執行了start_server.sh指令碼把服務啟動起來了;
4. message_producer和message_consumer都僅僅是將kafka環境安裝好了,以便於通過命令列傳送或者訂閱訊息,但是這兩個容器本身並未啟動server;
5. kafka_server,message_producer,message_consumer都通過link引數連線到了zookeeper容器,並且message_producer還連線到了kafka server,因為傳送訊息的時候會用到kafka server的ip地址;

現在開啟終端,在docker-compose.yml所在目錄下執行docker-compose up -d,即可啟動所有容器;

至此,本地環境搭建已經成功了,我們可以通過命令列體驗kafka的訊息釋出訂閱服務,具體的命令可以參考上一節。

以上就是本地搭建kafka的全過程。