文章目录
环境
虚拟机环境 CentOS7.8
单节点部署
kafka 4.1 配置
官方配置说明

!info
需要注意的是选择的时候需要选择特定的版本~
初始化目录
shell
# 创建数据目录
mkdir data
# 设置权限
chmod 777 data
docker-compose.yml
yml
services:
kafka:
container_name: kafka-v410
image: apache/kafka:4.1.0
ports:
- "9092:9092"
volumes:
- ./data:/var/lib/kafka/data # 数据目录
environment:
# 这里可以自行随机一个
CLUSTER_ID: "4L6g3nShT-eMCtK--X86sw"
# 当前 Kafka 节点的唯一 ID(在集群中必须唯一)
KAFKA_NODE_ID: 1
# 当前节点同时承担 broker(处理生产/消费请求)和 controller(管理集群元数据)角色
KAFKA_PROCESS_ROLES: "broker,controller"
# 只保留两个监听器:一个给客户端,一个给 controller
KAFKA_LISTENERS: PLAINTEXT://0.0.0.0:9092,CONTROLLER://0.0.0.0:9093
# 指定了外部可访问的地址和内部通信地址。
KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://192.168.117.132:9092
# 定义了不同监听器的安全协议
KAFKA_LISTENER_SECURITY_PROTOCOL_MAP: PLAINTEXT:PLAINTEXT,CONTROLLER:PLAINTEXT
# 指定哪些监听器名称用于 controller 通信(必须与 KAFKA_LISTENERS 中的名称一致)
KAFKA_CONTROLLER_LISTENER_NAMES: CONTROLLER
# 指定 broker 之间通信使用的监听器名称(必须与 advertised.listeners 中的名称一致)
# 此处使用 PLAINTEXT(对应 broker:19092),用于副本同步、leader 选举等内部流量
KAFKA_INTER_BROKER_LISTENER_NAME: PLAINTEXT
# 因为是单节点,且在容器内,用 "kafka"(服务名)或 "localhost" 都可以
# 但必须与 LISTENERS 中 CONTROLLER 的 host 一致 → 这里监听 0.0.0.0,所以用 kafka(Docker DNS)
KAFKA_CONTROLLER_QUORUM_VOTERS: "1@kafka:9093"
# 内部 __consumer_offsets 主题的副本数(单节点开发环境设为 1,避免 ISR 不足)
KAFKA_OFFSETS_TOPIC_REPLICATION_FACTOR: 1
# 事务状态日志主题(__transaction_state)所需的最小同步副本数(ISR)
# 单节点必须设为 1,否则无法写入事务
KAFKA_TRANSACTION_STATE_LOG_REPLICATION_FACTOR: 1
KAFKA_TRANSACTION_STATE_LOG_MIN_ISR: 1
# 消费者组初次加入时延迟触发再平衡的时间(毫秒),设为 0 可加快测试时的组协调速度
KAFKA_GROUP_INITIAL_REBALANCE_DELAY_MS: 0
# Kafka 4.1+ 新增的共享状态协调器主题(用于 Share Groups)的副本数(单节点设为 1)
KAFKA_SHARE_COORDINATOR_STATE_TOPIC_REPLICATION_FACTOR: 1
# 共享状态协调器主题的最小 ISR(单节点设为 1)
KAFKA_SHARE_COORDINATOR_STATE_TOPIC_MIN_ISR: 1
# 数据目录
KAFKA_LOG_DIRS: /var/lib/kafka/data
启动
shell
docker-compose up -d
运行记录

日志查看
shell
docker logs -f [容器ID]
测试
发送消息
java
@GetMapping("/testSend")
public String index() throws Exception {
for (int i = 0; i < 100; i++) {
kafkaTemplate.send("topic_test", "message:" + i);
}
return "ok";
}
接受消息
java
@Slf4j
@Component
public class KafkaConsumer {
/**
* 通用
*/
@KafkaListener(topics = "${kafka.topic-test}", concurrency = "8")
public void upstreamTopicHandler(List<String> messages) {
log.info(" string 批量消费到 {} 条数据", messages.size());
messages.clear();
}
}
配置文件
yml
spring:
threads:
virtual:
enabled: true
kafka:
bootstrap-servers: 192.168.117.132:9092
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
consumer:
group-id: store_gr_00
auto-offset-reset: latest
client-id: store_gr_00
max-poll-records: 1000
listener:
concurrency: 10