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就报如图所示的错

相关推荐
記億揺晃着的那天43 分钟前
告别误操作!Spring Boot 多环境配置隔离与启动守卫实战
java·spring boot·后端·环境隔离
skywalker_112 小时前
SpringBoot速通(实战教学)
java·spring boot·redis·rpc·ssm·mybatis-plus
码不停蹄的玄黓2 小时前
Spring Boot 实现过滤器(Filter)三种常用方式
java·spring boot·后端
Flittly4 小时前
【AgentScope Java新手村系列】(4)结构化输出
java·spring boot·spring·ai
阿坤带你走近大数据4 小时前
如何保证kafka中的数据一致性
分布式·kafka
阿坤带你走近大数据4 小时前
Kafka中的分区概念
分布式·kafka
kuonyuma6 小时前
MyBatis入门·注解操作
java·spring boot·mysql·spring·mybatis
我登哥MVP7 小时前
SpringCloud 核心组件解析:服务链路追踪
java·spring boot·后端·spring·spring cloud·java-ee·maven
惜缘破军8 小时前
基于 Spring Boot 3 和 Spring Cloud 2023 的微服务基础框架 hdfk7-boot
spring boot·后端·微服务