几点说明
- 小白的学习笔记,如有错误或不妥,请大佬指点
- 默认已在Windows系统下正确安装Docker
- 默认了解基本的Docker操作
- 默认正确安装并配置了Java
- 默认会Windows的基本操作
与网络教程的两点区别
- 服务在Docker,生产者和消费者在主机
- 引入Python代码
安装与运行zookeeper和kafka
拉取镜像
# 拉取zookeeper镜像
docker pull wurstmeister/zookeeper
# 拉取kafka镜像
docker pull wurstmeister/kafka
启动服务
# 启动zookeeper服务,容器名zookeeper,端口2181
docker run -d --name zookeeper -p 2181:2181 wurstmeister/zookeeper:latest
# 启动kafka服务,容器名kafka,端口9092,local-ip修改为本机IP
docker run -d --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=[local-ip]:2181/kafka -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://[local-ip]:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 wurstmeister/kafka:latest
如上操作即完成了Windows系统的在Docker上搭建Kafka服务
主机运行生产者和消费者
在Apache官网下载最新的kafka可执行包
网址:https://kafka.apache.org/downloads
基础操作
说明
- 其实这步操作没有什么实际意义,可以跳过
- 前文已说明过默认正确安装并配置Java环境
- 这里的文件包可以不依赖Docker在主机上直接运行
Setp1
解压下载的 kafka_2.13-3.4.0.tgz 文件包
Step2
修改kafka配置文件,好像也可以不改,但是我每次都会修改
文件1:config/zookeeper.properties
直接修改dataDir值,为某一个绝对路径即可
文件2:config/server.properties
修改listeners值,为你主机的IP和端口
修改advertised.listeners值,为你主机的IP和端口
修改log.dirs值,为某一个绝对路径即可
创建kafka主题
# 默认当前路径为 kafka_2.13-3.4.0
# 且该路径深度较浅,路径太深会导致无法运行报错
cd bin/windows
# 检查当前所有主题
.\kafka-topics.bat --list --bootstrap-server [local-ip]:9092
# 创建新主题demo-request
.\kafka-topics.bat --create --bootstrap-server [local-ip]:9092 --replication-factor 1 --partitions 1 --topic demo-request
# 可以再次检测所有主题
.\kafka-topics.bat --list --bootstrap-server [local-ip]:9092
启动kafka消费者
# 从当前位置消费【建议,更容易调试】
.\kafka-console-consumer.bat --bootstrap-server [local-ip]:9092 --topic demo-request
# 从头部开始消费
.\kafka-console-consumer.bat --bootstrap-server [local-ip]:9092 --topic demo-request --from-beginning
启动kafka生产者
启动生产者
.\kafka-console-producer.bat --broker-list [local-ip]:9092 --topic demo-request
如上操作即可实现生产者发送消息,消费者接收消息了
Python代码实现消息的生产与消费
安装两个python包
pip install kafka
pip install kafka-python
消费者代码
from kafka import KafkaProducer, KafkaConsumer
from kafka.errors import kafka_errors
import traceback
import json
def consumer_demo():
consumer = KafkaConsumer(
'demo-request',
bootstrap_servers='local-ip:9092'
)
for message in consumer:
print("receive, key: {}, value: {}".format(
json.loads(message.key.decode()),
json.loads(message.value.decode())
)
)
consumer_demo()
生产者代码
from kafka import KafkaProducer, KafkaConsumer
from kafka.errors import kafka_errors
import traceback
import json
def producer_demo():
# 假设生产的消息为键值对(不是一定要键值对),且序列化方式为json
producer = KafkaProducer(
bootstrap_servers=['local-ip:9092'],
key_serializer=lambda k: json.dumps(k).encode(),
value_serializer=lambda v: json.dumps(v).encode())
# 发送十条消息
for i in range(0, 10):
future = producer.send(
'demo-request',
key='count_num', # 同一个key值,会被送至同一个分区
value=str(i),
partition=0) # 向分区1发送消息
print("send {}".format(str(i)))
try:
future.get(timeout=10) # 监控是否发送成功
except kafka_errors: # 发送失败抛出kafka_errors
traceback.format_exc()
producer_demo()
总结
- 介绍了如何使用Docker启动kafka服务
- 介绍了如何在主机上使用Docker中的kafka服务
- 介绍了如何使用python代码使用Docker中的kafka服务
其他未考虑到的,或考虑的不周全的,请大佬指出,共同学些!
参考链接:
- https://blog.csdn.net/lmchhh/article/details/120147229
- https://cloud.tencent.com/developer/article/1892086
- https://zhuanlan.zhihu.com/p/279784873
- …
如果侵权,请联系删除!