实操讲解:消息队列Kafka(Java后端):Spring Boot整合Kafka从消息发送到基础消费Demo演示

📅 2026/7/7 6:56:29
实操讲解:消息队列Kafka(Java后端):Spring Boot整合Kafka从消息发送到基础消费Demo演示
实操讲解:Spring Boot整合Kafka(Java后端)从消息发送到基础消费Demo演示Spring Boot整合Kafka的核心路径,是先理解“生产者发送消息、Kafka暂存消息、消费者监听消息、接口触发验证”这条完整链路。本文围绕一个最小可运行的入门项目展开,系统讲清楚Apache Kafka(Apache Kafka, Kafka)的核心概念、Spring Boot项目结构、依赖配置、主题配置、生产者代码、消费者代码、接口验证方式和常见问题处理方法。读完之后,读者不仅能够跑通一个Kafka Demo,还能知道每一段代码为什么这样写、每一个配置项负责什么、消息从接口到消费者到底经历了哪些步骤。文章目录实操讲解:Spring Boot整合Kafka(Java后端)从消息发送到基础消费Demo演示一、概述:为什么要先用最小案例理解Kafka1.1 Kafka适合解决什么问题1.2 Spring Boot为什么适合整合Kafka二、Kafka基础概念:先把消息链路中的角色分清楚2.1 Producer:生产者2.2 Consumer:消费者2.3 Topic:主题2.4 Partition:分区2.5 Consumer Group:消费者组三、项目结构:最小可运行工程由哪些部分组成3.1 项目模块说明3.2 消息流转链路四、环境准备:依赖、Kafka服务和配置前提4.1 Maven依赖配置4.2 Kafka服务运行检查五、配置文件:让Spring Boot知道连接哪个Kafka5.1 使用`application.yml`配置Kafka六、Topic配置:让消息有明确的投递位置6.1 为什么建议显式创建Topic6.2 Topic配置类代码七、应用启动类:启动Spring Boot容器7.1 启动类的作用八、生产者实现:通过KafkaTemplate发送消息8.1 生产者的职责8.2 生产者代码九、消费者实现:通过@KafkaListener监听消息9.1 消费者的职责9.2 消费者代码十、控制器实现:通过HTTP接口触发消息发送10.1 为什么需要Controller10.2 控制器代码十一、运行验证:从接口请求到控制台消费日志11.1 启动Spring Boot应用11.2 调用默认Topic发送接口11.3 调用指定Topic发送接口十二、运行流程拆解:一条消息到底经历了什么12.1 完整链路拆解12.2 为什么不是Controller直接调用Consumer十三、常见问题:照着写也跑不起来的原因13.1 Kafka服务没有启动13.2 Topic名称不一致13.3 消费者组理解错误13.4 Offset导致旧消息不再重复消费13.5 序列化和反序列化不匹配十四、从入门走向业务实践的扩展方向14.1 多消费者组实现“一条消息,多类业务处理”14.2 分区提升并发处理能力14.3 生产环境还需要考虑可靠性十五、总结:Spring Boot整合Kafka应该掌握什么一、概述:为什么要先用最小案例理解Kafka1.1 Kafka适合解决什么问题Kafka是一个分布式流处理平台,它最常见的用途是作为系统之间的异步消息中间层。简单来说,一个系统不再直接调用另一个系统,而是先把消息发送到Kafka,再由其他系统按需消费这条消息。在实际项目中,Kafka常见于以下场景:场景不使用Kafka的问题使用Kafka后的变化用户注册后发短信注册接口要等待短信接口返回注册只负责发消息,短信服务异步处理下单后扣库存订单系统和库存系统强耦合订单发送消息,库存独立消费日志采集每个服务直接写入分析系统服务写入Kafka,分析系统统一消费数据同步多系统之间同步链路复杂Kafka作为统一消息通道业务通知一个动作触发多个系统多个消费者组各自消费同一消息Kafka的价值不只是“传消息”,更重要的是解耦、削峰、异步化和提高系统扩展能力。1.2 Spring Boot为什么适合整合KafkaSpring Boot通过自动配置和注解机制,降低了Kafka客户端的使用门槛。在原生Kafka客户端中,开发者需要手动创建生产者、消费者、序列化器、连接配置和轮询逻辑。而在Spring Boot项目中,常用做法是:能力Spring Boot中的实现方式发送消息KafkaTemplate接收消息@KafkaListener配置连接地址spring.kafka.bootstrap-servers配置消费者组spring.kafka.consumer.group-id配置序列化方式Serializer / Deserializer创建TopicNewTopic或 Kafka命令行对于入门学习来说,Spring Boot整合Kafka的最佳方式不是一开始研究所有高级机制,而是先跑通消息发送和消费闭环。二、Kafka基础概念:先把消息链路中的角色分清楚2.1 Producer:生产者生产者(Producer)是向Kafka发送消息的角色。在本文项目中,生产者对应的是KafkaProducer类,它通过KafkaTemplate把字符串消息发送到指定主题。生产者可以理解为“消息的发起方”。例如订单系统在订单创建成功后,向Kafka发送一条“订单已创建”的消息。2.2 Consumer:消费者消费者(Consumer)是从Kafka读取并处理消息的角色。在本文项目中,消费者对应的是KafkaConsumer类,它通过@KafkaListener监听主题,一旦有新消息,就自动执行消费方法。消费者可以理解为“消息的处理方”。例如短信系统监听订单消息,收到后发送短信通知。2.3 Topic:主题主题(Topic)是Kafka中用于分类存放消息的逻辑容器。不同业务消息通常使用不同Topic,例如:业务类型Topic示例用户注册user_register_topic订单创建order_created_topic支付成功payment_success_topic日志采集system_log_topic本文示例test_topic1Topic解决的是“消息应该放在哪里”的问题。2.4 Partition:分区分区(Partition)是Topic在物理层面的拆分单位,它决定了Kafka的并发能力和局部有序性。一个Topic可以有一个或多个Partition。需要注意的是:Kafka只能保证同一个Partition内部的消息有序,不能天然保证整个Topic全局有序。例如,一个订单业务如果要求同一个订单ID的消息按顺序处理,通常会把订单ID作为消息Key,让相同订单ID的消息进入同一个Partition。2.5 Consumer Group:消费者组消费者组(Consumer Group)是一组共同消费同一Topic的消费者集合。同一个消费者组内,一条消息通常只会被其中一个消费者实例消费;不同消费者组之间互不影响,可以各自消费同一条消息。例如:消费者组用途是否能消费同一条消息sms_group发送短信可以email_group发送邮件可以stat_group统计分析可以同组多个实例分摊同一类任务组内只由一个实例处理消费者组是理解Kafka消费行为的关键概念。三、项目结构:最小可运行工程由哪些部分组成3.1 项目模块说明一个最小Spring Boot Kafka项目,至少需要依赖配置、启动类、Topic配置、生产者、消费者、控制器和应用配置文件。推荐项目结构如下:src # 项目源码根目录 └── main # 主程序目录 ├── java # Java源码目录 │ └── com # 公司或组织域名反写的一级包 │ └── example # 示例项目包名 │ └── kafkastudy1 # 当前Kafka学习项目包名 │ ├── KafkaStudy1Application.java # Spring Boot启动类 │ ├── KafkaTopicConfig.java # Kafka主题配置类 │ ├── KafkaProducer.java # Kafka消息生产者 │ ├── KafkaConsumer.java # Kafka消息消费者 │ └── KafkaController.java # HTTP接口控制器 └── resources # 项目资源配置目录 └── application.yml # Spring Boot应用配置文件这几个文件之间的关系可以理解为:文件作用KafkaStudy1Application.java启动Spring Boot应用KafkaTopicConfig.java创建或声明Kafka主题KafkaProducer.java封装消息发送逻辑KafkaConsumer.java监听并消费Kafka消息KafkaController.java通过HTTP接口触发消息发送application.yml配置Kafka地址、序列化方式、主题和消费者组3.2 消息流转链路一次完整请求会经过以下步骤:步骤参与者动作第一步用户/接口调用方请求/publish接口第二步KafkaController接收请求参数第三步KafkaProducer调用KafkaTemplate发送消息第四步Kafka服务端接收消息并写入Topic第五步KafkaConsumer监听Topic并消费消息第六步控制台/业务逻辑打印或处理消费结果这个链路跑通,说明Spring Boot和Kafka的基础整合已经完成。四、环境准备:依赖、Kafka服务和配置前提4.1 Maven依赖配置在编写Java代码之前,需要先引入Spring Web和Spring Kafka依赖。Spring Web用于提供HTTP接口,Spring Kafka用于连接Kafka并封装生产者、消费者能力。!-- 在pom.xml中声明Spring Web依赖,用于提供HTTP接口能力 --dependency!-- 定义一个Maven依赖开始 --groupIdorg.springframework.boot/groupId!-- 指定依赖所属组织为Spring Boot --artifactIdspring-boot-starter-web/artifactId!-- 引入Spring MVC和内置Web服务器支持 --/dependency!-- 定义一个Maven依赖结束 --!-- 在pom.xml中声明Spring Kafka依赖,用于整合Apache Kafka --dependency!-- 定义一个Maven依赖开始 --groupIdorg.springframework.kafka/groupId!-- 指定依赖所属组织为Spring Kafka --artifactIdspring-kafka/artifactId!-- 引入KafkaTemplate、KafkaListener等核心能力 --/dependency!-- 定义一个Maven依赖结束 --这两项依赖分别解决两个问题:spring-boot-starter-web让项目能够暴露POST接口,spring-kafka让项目能够发送和消费Kafka消息。4.2 Kafka服务运行检查在启动Spring Boot应用之前,需要保证Kafka服务已经运行,并且能够通过localhost:9092访问。下面命令适合在Linux终端、macOS终端或Windows Git Bash中执行。kafka-topics.sh --bootstrap-server localhost:9092--list# 连接本机Kafka并列出所有Topic,用于确认Kafka服务是否可访问如果命令能够正常返回Topic列表,说明Kafka连接基本正常。如果命令卡住或报连接失败,Spring Boot应用后续也无法正常发送消息。五、配置文件:让Spring Boot知道连接哪个Kafka5.1 使用application.yml配置Kafka下面使用application.yml展示配置。相比application.properties,YAML更适合在博客中分层解释,并且支持每行后面添加注释。