与网络教程的两点区别
# 拉取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
说明
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_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-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-console-producer.bat --broker-list [local-ip]:9092 --topic demo-request
如上操作即可实现生产者发送消息,消费者接收消息了
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()
其他未考虑到的,或考虑的不周全的,请大佬指出,共同学些!
参考链接:
如果侵权,请联系删除!