springboot项目整合kafka实现消息队列

一、Docker镜像、容器准备:

1.1拉取镜像:

前提是虚拟机安装了docker,可以自行看其他文章进行安装

bash 复制代码
docker pull ubuntu/kafka 
docker pull zookeeper

1.2运行容器

先启动zookeeper容器,因为kafka依赖于zookeeper

bash 复制代码
docker run -d \
	--network zk_k\ #指定网络
​	-p 2181:2181 \ #暴露端口
​	-v /mydata/zookeeper/data:/data  \  #数据挂载,先创建/mydata/zookeeper/data目录
​	--name zookeeper \ #指定容器名称
 	 zookeeper:latest  #镜像名称

启动kafka容器

bash 复制代码
# 启动 kafka
docker run -d  -p 9092:9092 \
--name kafka \
--network hmall \
-e KAFKA_BROKER_ID=0 \
-e KAFKA_ZOOKEEPER_CONNECT=192.168.31.130:2181 \ # 连接上一步运行的zookeeper容器
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://192.168.31.130:9092 \ # kafka服务监听设置,IP为当前主机IP
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 \ # 默认就好了
-v /mydata/kafka/config:/opt/kafka/config \ # 数据挂载,同样先创建好目录,上一步类似
-v /mydata/kafka/logs:/opt/kafka/logs \
ubuntu/kafka:latest

本文是单机部署,有兴趣做集群部署的可以参考文章

二、创建一个springboot项目

2.1导入kafka依赖

xml 复制代码
 <!--kafka-->
 <dependency>
      <groupId>org.springframework.kafka</groupId>
      <artifactId>spring-kafka</artifactId>
 </dependency>

2.2application.properties配置

先去虚拟机/mydata/kafka/config目录修改consumer.properties文件,如图所示

同样provider.properties也要改

yml 复制代码
#运行kafka服务的主机IP和kafka端口
spring.kafka.bootstrap-servers=192.168.31.130:9092
#组id,在consumer.properties文件修改 
spring.kafka.consumer.group-id=my-group
#表示开启消费者自动提交偏移量
spring.kafka.consumer.enable-auto-commit=true
#表示自动提交偏移量的时间间隔为 3000 毫秒。
spring.kafka.consumer.auto-commit-interval=3000

2.3编写消息生产者

java 复制代码
@Component
@Slf4j
public class KafkaProvider {
	//kafka依赖注入
    @Autowired
    private KafkaTemplate kafkaTemplate;
	
    public void send(String topic, String message) {
        log.info("发送消息到Kafka topic: {}; 消息内容: {}", topic, message);
        kafkaTemplate.send(topic, message);//执行发送消息
        log.info("生产者消息发送成功");
    }
}

2.4编写消息消费者

java 复制代码
@Component
@Slf4j
public class KafkaConsumer {
	//对主题topic_name进行监听,当生产者对主题topic_name生产消息,该消费者就会监听到,然后进行消息消费
    @KafkaListener(topics = {"topic_name"})
    //ConsumerRecord 对象存储消息及对消息的处理
    public void receive(ConsumerRecord record){
    	//监听到消息后的业务逻辑处理
        log.info("消费者接收到消息 message: {}", record.value());
    }
}

2.5测试

java 复制代码
@RestController
public class KafkaController {

    @Autowired
    private KafkaProvider kafkaProvider;

    @RequestMapping("/send")
    public String send(String topic, String message) {
        kafkaProvider.send(topic,message);
        return "success";
    }
}

测试结果如图所示

浏览器发送消息如图

消费者消费了消息如图

生产者生产消息如图

踩坑

如果没有修改配置文件的server.properties里的advertised.listeners=PLAINTEXT://192.168.31.130:9092就报如图所示的错

相关推荐
步行cgn19 分钟前
Spring Boot 将配置绑定到第三方对象详解
spring boot·后端·python
凤山老林22 分钟前
Spring Boot 集成 Apache Kafka Streams 构建流处理应用:状态存储、窗口聚合与
spring boot·kafka·apache
Flynt12 小时前
把公司项目迁到 Spring Boot 4.0:编译通过只是开始
java·spring boot·后端
yxlalm15 小时前
5.3解决超卖问题
java·spring boot·超卖
边境悍匪17 小时前
蜗牛学苑 Java 智能体学习 Day39|SpringAI 会话存储、Function‑Call 工具调用、MCP 思维导图复盘
java·开发语言·spring boot·学习·阿里云
xcl092518 小时前
全民健身智慧管理系统实战指南:从架构设计到部署落地
java·spring boot
Bs_MoneyMagnet18 小时前
基于springboot+vue的宠物殡葬管理平台的设计与实现 源码+文档
java·javascript·vue.js·spring boot·后端·宠物
ly768919 小时前
生产环境 Spring Boot 应用内存泄漏排查实战
java·spring boot·spring·内存泄漏·threadlocal·gc日志·堆转储
小楼昨夜又东风12620 小时前
kafka、rocketmq、rabbitmq,有什么区别
kafka·rabbitmq·rocketmq
行百里er20 小时前
Spring Insight 里上报 Span 为什么用 JDK HttpClient 而不是 RestTemplate
spring boot·spring cloud·监控