一个简单kafka使用例子

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

验证安装

  1. 检查容器状态​:

    复制代码
    docker ps -a  # 确认 kafka 和 zookeeper 容器运行正常[4,5](@ref)
  2. 测试消息生产与消费​:

    • 创建 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调用

日志监听