前言
Spring Kafka 无缝集成了 Spring Boot、Spring Framework 及其生态系统中的其他项目,如 Spring Cloud。通过与 Spring Boot 的自动配置结合,开发者可以快速启动和配置 Kafka 相关的功能。无需编写大量样板代码即可实现 Kafka 的生产和消费功能,在公司内部微服务项目中大量使用了该框架,以下是个人的一些记录。
笔者环境:springboot-2.7.14, java version “1.8.0_401”
一、Spring-kafka是什么?
Spring Kafka 是 Spring 框架的一个项目,旨在简化与 Apache Kafka 的集成。它提供了一组用于与 Kafka 通信的高级抽象和便利功能,使开发人员可以更轻松地在 Spring 应用程序中使用 Kafka 进行消息传递。
1. 什么是 Apache Kafka?
Apache Kafka 是一个分布式流处理平台,广泛用于构建实时数据管道和流应用程序。它具有以下几个关键功能:
- 发布和订阅记录流:类似于消息队列或企业消息传递系统。
- 存储记录流:存储数据流容错。
- 处理记录流:实时或批处理方式处理数据流。
2. 什么是 Spring Kafka?
Spring Kafka 是 Spring 框架的一个子项目,提供了用于与 Kafka 集成的便捷工具和抽象。Spring Kafka 包含在 Spring Boot 项目中,使得 Kafka 消息处理在 Spring 应用程序中变得更加容易和直观。
3. Spring Kafka 的主要功能
KafkaTemplate
:用于发送消息的模板类。
@KafkaListener
:用于消费消息的注解,支持自动并发和分区分配。
KafkaMessageListenerContaine
r:低级别的消息监听容器,提供了更大的灵活性。
事务支持:支持与 Kafka 的事务集成,确保消息的原子性和一致性。
错误处理:支持各种错误处理机制,包括重试、死信队列等。
4. 典型使用场景
- 消息驱动的微服务:使用 Kafka 作为微服务之间的消息传递中介。
- 实时数据处理:处理流式数据,如日志收集、监控和分析。
- 事件溯源:使用Kafka 记录所有事件,支持事件溯源和审计。
- 数据集成:连接不同的数据源和目标系统,实现数据集成和同步。
二、如何使用进行消息消费?
只需要简单四步步即可:引入依赖,配置消费者配置文件,配置 kafka configuration , 配置消费者监听器
1. 引入maven依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
2. 配置文件
以下仅用于参考:
server:
port: 8080
logging:
level:
root: info
spring:
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
# 开启事务管理
transaction:
management:
enabled: true
kafka:
bootstrap-servers: localhost:9092
# 消费监听接口监听的主题不存在时,默认会报错
listener:
missing-topics-fatal: false
template:
default-topic: events
producer:
# 当retris为0时,produce不会重复。retirs重发,此时repli节点完全成为leader节点,不会产生消息丢失。
retries: 0
#procedure要求leader在考虑完成请求之前收到的确认数,用于控制发送记录在服务端的持久化,其值可以为如下:
#acks = 0 如果设置为零,则生产者将不会等待来自服务器的任何确认,该记录将立即添加到套接字缓冲区并视为已发送。在这种情况下,无法保证服务器已收到记录,并且重试配置将不会生效(因为客户端通常不会知道任何故障),为每条记录返回的偏移量始终设置为-1。
#acks = 1 这意味着leader会将记录写入其本地日志,但无需等待所有副本服务器的完全确认即可做出回应,在这种情况下,如果leader在确认记录后立即失败,但在将数据复制到所有的副本服务器之前,则记录将会丢失。
#acks = all 这意味着leader将等待完整的同步副本集以确认记录,这保证了只要至少一个同步副本服务器仍然存活,记录就不会丢失,这是最强有力的保证,这相当于acks = -1的设置。
#可以设置的值为:all, -1, 0, 1
acks: 1
# 指定消息key和消息体的编解码方式
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
# 每次批量发送消息的数量,produce积累到一定数据,一次发送
#batch-size: 16384
# produce积累数据一次发送,缓存大小达到buffer.memory就发送数据
#buffer-memory: 33554432
consumer:
# 指定默认消费者group id --> 由于在kafka中,同一组中的consumer不会读取到同一个消息,依靠groud.id设置组名
group-id: events-group-1
# smallest和largest才有效,如果smallest重新0开始读取,如果是largest从logfile的offset读取。一般情况下我们都是设置smallest
auto-offset-reset: earliest
# enable.auto.commit:true --> 设置自动提交offset
enable-auto-commit: true
#如果'enable.auto.commit'为true,则消费者偏移自动提交给Kafka的频率(以毫秒为单位),默认值为5000。
auto-commit-interval: 100
# 指定消息key和消息体的编解码方式
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
properties:
spring.json.value.default.type: com.tan.kafka.model.Event
# 配置消费主题和消费者组2
kafka:
topic: events_test
group-2: events-group-2
group-3: events-group-3
group-5: events-group-5
里面的注释已经非常清晰了,相信都能看懂。
3. 配置kafka 消费者配置并使用注解启用
@EnableKafka
@Configuration
@Slf4j
public class KafkaConsumerConfig {
/**
* 创建一个Kafka消费者工厂,用于生产特定配置的Kafka消费者。
* @param consumerFactory
* @return
*/
@Bean
public ConcurrentKafkaListenerContainerFactory<String, Event> kafkaListenerContainerFactory<