1. 前言
昨天20210917涉及到kafka相关的业务,虽然直接连接别人搭建好的环境就行,但是本着学习与分享,自己在本地也部署了下,就顺便写个docker的文档吧。
Kafka是一个开源流处理平台,由Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。
本地搭建有多种方式直接在window配置环境搭建,这种需要安装很多环境(jdk、gradle、scale、zookeeper、kafka), 虚拟机上搭建,还有就是最简洁高效方便的docker.
2. 安装运行
2.1. 下载镜像
分别将zookeeper和kafka两个镜像下载下来
docker pull wurstmeister/zookeeper
docker pull wurstmeister/kafka
2.2. 启动容器
- 启动zookeeper
docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper
- 启动kafka
docker run -d --name kafka --publish 9092:9092 \
--link zookeeper \
--env KAFKA_ZOOKEEPER_CONNECT=192.168.31.64:2181 \
--env KAFKA_ADVERTISED_HOST_NAME=192.168.31.64 \
--env KAFKA_ADVERTISED_PORT=9092 \
--env KAFKA_LOG_DIRS=/kafka/logs-1 \
wurstmeister/kafka
192.168.31.64为你宿主机器实际的IP,你可以理解为你window本机的IP,命令行下输入ipconfig可查看到,window下运行不了,把 \ 去掉不换行
3. 执行命令
3.1. 创建topic
- 创建名为test的topic,包含一个分区和一个 Replica
docker exec kafka kafka-topics.sh --create --zookeeper 192.168.31.64:2181 --replication-factor 1 --partitions 1 --topic test
- 查看是否成功,可列出kafka下的topic
docker exec kafka kafka-topics.sh --list --zookeeper 192.168.31.64:2181
3.2. 创建消息
如上一步没有创建topic,执行下面内容也会自动创建topic
- 发送消息
执行后可以输入一些数据
docker exec -it kafka kafka-console-producer.sh --broker-list 192.168.31.64:9092 --topic test
- 接受消息
docker exec -it kafka kafka-console-consumer.sh --bootstrap-server 192.168.31.64:9092 --topic test
执行上面可看到之前输入的消息不在,如果要获取之前的消息,需要使用下面的语句:
docker exec -it kafka kafka-console-consumer.sh --bootstrap-server 192.168.31.64:9092 --topic test --from-beginning
3.3. 容器里执行
以上命令也可以到kafka的容器里执行,/opt/kafka/bin目录下执行 .sh文件,效果是一样。
docker exec -it kafka /bin/bash
cd /opt/kafka/bin
kafka-topics.sh --create --zookeeper 192.168.31.64:2181 --replication-factor 1 --partitions 1 --topic test
kafka-topics.sh --list --zookeeper 192.168.31.64:2181
kafka-console-producer.sh --broker-list 192.168.31.64:9092 --topic test
kafka-console-consumer.sh --bootstrap-server 192.168.31.64:9092 --topic test --from-beginning
以上环境就搭建好了,本地代码调用就用192.168.31.64:9092,如:kafka消息队列的写入个性化广告数据
4. Docker Compose启动容器
上面的安装运行步骤麻烦,可以直接通过通过 Docker Compose 进行启动,一句简单的启动语句就搞定。
docker-compose up -d
docker-compose.yml 文件内容如下:
version: '3'
services:
zookeeper:
image: wurstmeister/zookeeper
restart: unless-stopped
hostname: zookeeper
ports:
- "2181:2181"
container_name: zookeeper
# kafka version: 1.1.0
# scala version: 2.12
kafka:
image: wurstmeister/kafka
ports:
- "9092:9092"
environment:
KAFKA_ADVERTISED_HOST_NAME: 192.168.31.64
KAFKA_ZOOKEEPER_CONNECT: "zookeeper:2181"
KAFKA_BROKER_ID: 1
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
KAFKA_CREATE_TOPICS: "stream-in:1:1,stream-out:1:1"
KAFKA_LOG_DIRS: "/kafka/logs"
depends_on:
- zookeeper
container_name: kafka