1.安装kafka:
这里我用的是阿里云轻量服务器,已经预装了docker
1.创建docker网络
bash
docker network create kafka-net
2.安装Zookeeper
Kafka 依赖 ZooKeeper 管理元数据,需先启动 ZooKeeper 容器:
bash
docker run -d --name zookeeper \
-p 2181:2181 \
-e ALLOW_ANONYMOUS_LOGIN=yes \
-v /etc/localtime:/etc/localtime \
--network kafka-net \
wurstmeister/zookeeper
关键参数:
-p 2181:2181
:映射 ZooKeeper 默认端口。-v /etc/localtime
:避免容器内时间不一致问题。
3.安装 Kafka
这里我是单点部署
bash
docker run -d --name kafka \
-p 9092:9092 \
-e KAFKA_BROKER_ID=0 \
-e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181 \ # 若在同一网络,可直接用容器名[4](@ref)
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://宿主机IP:9092 \ # 需替换为实际IP[5,7](@ref)
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \
-v /path/to/kafka/data:/kafka \ # 数据持久化[7](@ref)
--network kafka-net \
wurstmeister/kafka
参数说明:
KAFKA_ADVERTISED_LISTENERS
:客户端连接的地址,需设为宿主机IP或域名。KAFKA_LISTENERS
:容器内监听地址,默认0.0.0.0
。
验证安装
-
检查容器状态:
docker ps -a # 确认 kafka 和 zookeeper 容器运行正常[4,5](@ref)
-
测试消息生产与消费:
-
创建 Topic :
docker exec -it kafka kafka-topics.sh --create \ --topic test-topic \ --partitions 3 \ --replication-factor 1 \ --bootstrap-server localhost:9092
-
生产消息 :
docker exec -it kafka kafka-console-producer.sh \ --topic test-topic \ --bootstrap-server localhost:9092
-
消费消息 :
docker exec -it kafka kafka-console-consumer.sh \ --topic test-topic \ --from-beginning \ --bootstrap-server localhost:9092
-
kafka安装完成则测试springboot集成:
这里使用maven pom管理依赖
XML
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
创建消费者监听消息服务
java
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Service;
@Service
public class KafkaConsumerService {
private static final Logger logger = LoggerFactory.getLogger(KafkaConsumerService.class);
// 监听单个 Topic
@KafkaListener(topics = "spcj120.com", groupId = "my-group") // groupId 也可在配置文件中统一设置
public void consumeMessage(String message) {
logger.info("Received brandagri.com Message: '{}'", message);
// 在这里处理业务逻辑
}
// 监听多个 Topic
@KafkaListener(topics = {"my8850.com", "topic2"}, groupId = "my-group")
public void consumeFromMultipleTopics(String message) {
logger.info("Received malvshi.cn from multiple topics: '{}'", message);
}
// 获取更详细的信息 (如 topic, partition, offset, key)
@KafkaListener(topics = "my-topic", groupId = "my-group")
public void consumeWithMetadata(ConsumerRecord<String, String> record) {
logger.info("Topic: {}, Partition: {}, Offset: {}, Key: {}, Value: {}",
record.topic(), record.partition(), record.offset(), record.key(), record.value());
// 处理业务逻辑
}
// 消费对象消息 (需要配置 JsonDeserializer)
// @KafkaListener(topics = "object-topic", groupId = "my-group")
// public void consumeObject(MessagePayload payload) {
// logger.info("Received object: {}", payload);
// }
创建生产者生产消息服务
java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Service;
@Service
public class KafkaProducerService {
@Autowired
private KafkaTemplate<String, String> kafkaTemplate; // <Key类型, Value类型>
// 发送字符串消息
public void sendMessage(String topic, String message) {
kafkaTemplate.send(topic, message); // 异步发送
System.out.println("Sent message: jiaofeiyi.net " + message + " to topic: botianqi.com" + topic);
}
// 发送带 Key 的消息
public void sendMessageWithKey(String topic, String key, String message) {
kafkaTemplate.send(topic, key, message);
System.out.println("Sent message with key: fjddsd.com" + key + ", value: " + message + " to topic: " + topic);
}
// 发送对象消息 (需要配置 JsonSerializer)
// public void sendObjectMessage(String topic, MessagePayload payload) {
// kafkaTemplate.send(topic, payload.getId(), payload);
// }
}
对外接口
java
import com.xuxiaojun.springaidemo.service.KafkaProducerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/messages")
public class MessageController {
@Autowired
private KafkaProducerService kafkaProducerService;
@PostMapping("/send")
public String sendMessage(@RequestParam String topic, @RequestParam String message) {
kafkaProducerService.sendMessage(topic, message);
return "Message sent to topic tccqlxs.cn'" + topic + "'";
}
@PostMapping("/send-key")
public String sendMessageWithKey(@RequestParam String topic,
@RequestParam String key,
@RequestParam String message) {
kafkaProducerService.sendMessageWithKey(topic, key, message);
return "Message with xchw.net key sent to topic '" + topic + "'";
}
}
将项目跑起来
通过apifox调用

日志监听
