**安装方式:**macOS/Windows + Docker Desktop + Apache 官方镜像 + KRaft + SASL/PLAIN 用户密码认证的单节点开发环境
简介:为什么使用这种方式,主要就是本地极简安装,confluentinc/cp‑kafka不适合本地调试使用,更适合生产部署使用,而且本地部署也会有各种奇奇怪怪的问题,所以博主推荐的本地极简安装方式就是这种:macOS/Windows + Docker Desktop + Apache 官方镜像 + KRaft + SASL/PLAIN 用户密码认证的单节点开发环境
环境准备(主要):Mac/Windows、Docker
1、安装Docker,Mac/Windows在官网下载Docker安装即可:Docker官网
2、确认Docker Desktop 已启动
bash
docker version
docker compose version
3、新建目录和配置文件(可自定义,后续使用的时候替换脚本中映射挂载的路径即可)
博主使用mac/windows直接创建目录也可,目前为了展示方便使用命令行
bash
mkdir -p ~/kafka-sasl/secrets
cd ~/kafka-sasl
4、创建的目录下创建文件
-
创建文件:broker_jaas.conf
KafkaServer { org.apache.kafka.common.security.plain.PlainLoginModule required username="admin" password="admin-secret" user_admin="admin-secret" user_alice="alice-secret"; };这定义了两个账号:
admin/admin-secret:Broker 内部通信和管理员用途alice/alice-secret:应用客户端账号
-
创建文件:client.properties
security.protocol=SASL_PLAINTEXT sasl.mechanism=PLAIN sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="alice" password="alice-secret"; -
创建文件:compose.yaml
需要注意:
- 文件中的ip:192.168.5.2是博主本人的ip,需要自行更换为localhost,或者主机ip
- 没做kafka数据持久化,删除容器,数据会丢失,如需持久化存储,在volumes下配置持久化挂载目录即可
yamlservices: kafka: image: apache/kafka:4.3.1 container_name: kafka hostname: kafka ports: - "9092:9092" # 只读挂载认证文件;没有数据卷 volumes: # 这块需要填写文件broker_jaas.conf所在的路径,:只处理前面部分 - /Users/wyl/Desktop/Workspace/kafka/broker_jaas.conf:/etc/kafka/secrets/broker_jaas.conf:ro - /Users/wyl/Desktop/Workspace/kafka/client.properties:/etc/kafka/secrets/client.properties:ro # 如需持久化存储Kafka数据,在下面再增加一条挂载路径即可 environment: KAFKA_NODE_ID: "1" KAFKA_PROCESS_ROLES: "broker,controller" CLUSTER_ID: "4L6g3nShT-eMCtK--X86sw" KAFKA_CONTROLLER_LISTENER_NAMES: "CONTROLLER" KAFKA_CONTROLLER_QUORUM_VOTERS: "1@kafka:29093" KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: "CONTROLLER:PLAINTEXT,BROKER:SASL_PLAINTEXT,CLIENT:SASL_PLAINTEXT" KAFKA_LISTENERS: "CONTROLLER://:29093,BROKER://:19092,CLIENT://:9092" KAFKA_ADVERTISED_LISTENERS: "BROKER://kafka:19092,CLIENT://192.168.5.2:9092" KAFKA_INTER_BROKER_LISTENER_NAME: "BROKER" KAFKA_SASL_ENABLED_MECHANISMS: "PLAIN" KAFKA_SASL_MECHANISM_INTER_BROKER_PROTOCOL: "PLAIN" KAFKA_OPTS: "-Djava.security.auth.login.config=/etc/kafka/secrets/broker_jaas.conf" KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: "1" KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: "1" KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: "1" KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: "0"
5、启动并检查(这块可以直接Docker Desktop上查看,也可终端检查)
终端启动/检查如下
# 终端启动
docker compose up -d
# 终端检查,查看日志
docker compose logs -f kafka
# 查看运行情况
docker ps
日志出现 Kafka 启动完成后,按 Ctrl-C 退出日志查看即可,容器仍会运行。
6、创建 Topic
docker exec -it kafka /opt/kafka/bin/kafka-topics.sh \
--bootstrap-server kafka:19092 \
--command-config /etc/kafka/secrets/client.properties \
--create \
--topic demo \
--partitions 1 \
--replication-factor 1
7、测试收发消息
先开一个消费者终端
docker exec -it kafka /opt/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server kafka:19092 \
--consumer.config /etc/kafka/secrets/client.properties \
--topic demo \
--from-beginning
再开另一个终端发送(生产者)
docker exec -it kafka /opt/kafka/bin/kafka-console-producer.sh \
--bootstrap-server kafka:19092 \
--producer.config /etc/kafka/secrets/client.properties \
--topic demo
输入任意文本并回车,消费者应立即收到。
消费者窗口示例:
Last login: Sat Aug 29 16:12:34 on ttys001
wyl@weiyilindeMacBook-Pro kafka % docker exec -it kafka /opt/kafka/bin/kafka-console-consumer.sh \
--bootstrap-server kafka:19092 \
--consumer.config /etc/kafka/secrets/client.properties \
--topic demo \
--from-beginning
Option --consumer.config is deprecated and will be removed in a future version. Use --command-config instead.
The consumer rebalance protocol (KIP-848) is production-ready! Set group.protocol=consumer to try it out. See https://kafka.apache.org/documentation/#consumer_rebalance_protocol
ret
你好
在吗?
hello kafka
生产者窗口示例:
Last login: Sat Aug 29 17:31:01 on ttys000
wyl@weiyilindeMacBook-Pro kafka % docker exec -it kafka /opt/kafka/bin/kafka-console-producer.sh \
--bootstrap-server kafka:19092 \
--producer.config /etc/kafka/secrets/client.properties \
--topic demo
Warning: --producer.config is deprecated and will be removed in a future version. Use --command-config instead.
>ret
>你好
>在吗?
>hello kafka
>