Kafka-使用springBoot连接

注意事项

连接kafka的电脑需要设置hosts如下:

192.168.1.251 node1
192.168.1.252 node2
192.168.1.253 node3

具体根据个人的实际情况配置

maven依赖

<dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>

application.yml配置

这里我配置了生产者和消费者两个,当然也可以只配置一个

kafka:
    bootstrap-servers: node1:9092,node2:9092,node3:9092 #Kafka集群
    producer:    #生产者配置
      retries: 0
      acks: 1    # 应答级别:多少个分区副本备份完成时向生产者发送ack确认(可选0、1、all/-1)
      batch-size: 16384 # 批量大小
      properties:
        linger:
          ms: 0   # 提交延时 当生产端积累的消息达到batch-size或接收到消息linger.ms后,生产者就会将消息提交给kafka   linger.ms为0表示每接收到一条消息就提交给kafka,这时候batch-size其实就没用了
      buffer-memory: 33554432 # 生产端缓冲区大小
      key-serializer: org.apache.kafka.common.serialization.StringSerializer #Kafka提供的序列化
      value-serializer: org.apache.kafka.common.serialization.StringSerializer #Kafka提供的反序列化类
    consumer:
      properties:
        group:
          id: defaultConsumerGroup # 默认的消费组ID
        session:
          timeout:
            ms: 120000 # 消费会话超时时间(超过这个时间consumer没有发送心跳,就会触发rebalance操作)
        request:
          timeout:
            ms: 180000 # 消费请求超时时间
      enable-auto-commit: true # 是否自动提交offset
      auto-offset-reset: latest # 当kafka中没有初始offset或offset超出范围时将自动重置offset 参数值earliest:重置为分区中最小的offset; latest:重置为分区中最新的offset(消费分区中新产生的数据); none:只要有一个分区不存在已提交的offset,就抛出异常;
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer #Kafka提供的序列化
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer #Kafka提供的反序列化类
      auto-commit-interval: 1000ms # 提交offset延时(接收到消息后多久提交offset)

1:spring.kafka.bootstrap-servers 配置kafak的broker地址,格式为 host:port,可以配置多个,用“,”隔开;

2:spring.kafka.client-id 发出请求时传递给服务器的ID,用于服务器端日志记录;

消费者配置

3:spring.kafka.consumer.bootstrap-servers 配置kafak customer 的broker地址,格式为 host:port,可以配置多个,用“,”隔开;优先级比spring.kafka.bootstrap-servers高,当不设置时,使用spring.kafka.bootstrap-servers的值;

4:spring.kafka.consumer.client-id 发出请求时传递给服务器的ID,用于服务器端日志记录,不设置时,系统会自动生成;

5:spring.kafka.consumer.group-id 设置当前消费者所在组的名称;

6:spring.kafka.consumer.enable-auto-commit 消费者的消费记录offset是否后台自动提交;

7:spring.kafka.consumer.auto-commit-interval 当消费者的消费记录offset是否后台自动提交时,多长时间自动提交一次;

8:spring.kafka.consumer.auto-offset-reset 当Kafka中没有初始偏移量或服务器上不再存在当前偏移量时该怎么办,

earliest:自动将偏移量重置为最早的偏移量;

latest:自动将偏移量重置为最迟的偏移量;

none:如果未找到消费者组的先前偏移量,则将异常抛出给消费者;

exception:向消费者抛出异常;

9:spring.kafka.consumer.max-poll-records 一次调用poll()返回的最大记录数,默认是500;

10:spring.kafka.consumer.fetch-max-wait 当没有足够的数据(数据的大小不小于 fetch.min.bytes)返回给客户端时,服务器最大阻塞时间;

11:spring.kafka.consumer.fetch-min-size 服务器应为获取请求返回的最小数据量(以字节为单位)

12:spring.kafka.consumer.heartbeat-interval 消费者协调员之间心跳的预期时间(单位是毫秒)

13:spring.kafka.consumer.key-deserializer 消费者所有keys的序列化类,默认是 org.apache.kafka.common.serialization.StringDeserializer

14:spring.kafka.consumer.value-deserializer 消费者所有values的序列化类,默认是 org.apache.kafka.common.serialization.StringDeserializer

15:spring.kafka.consumer.properties 消费者其他属性配置,类型 java.util.Map<java.lang.String,java.lang.String>;

生产者配置

1:spring.kafka.producer.bootstrap-servers 配置kafak produce的broker地址,格式为 host:port,可以配置多个,用“,”隔开;优先级比spring.kafka.bootstrap-servers高,当不设置时,使用spring.kafka.bootstrap-servers的值;

2:spring.kafka.producer.client-id 发出请求时传递给服务器的ID,用于服务器端日志记录,不设置时,系统会自动生成;

3:spring.kafka.producer.acks 生产者要求数据有多少个副本接收到数据才算发送成功,类型是java.lang.String,

“0” :表示生产者数据发送到leader就算写入成功,但是如果leader在把数据写到本地磁盘时报错,就会数据丢失,akcs设置为0时,kafka可以达到最大的吞吐量;

“1":表示生产者数据发送到leader并写入到磁盘才算写入成功,但是如果数据在同步到其他副本时,leader挂了,其他副本被选举为新leader,那么就会有数据丢失;

“-1”, “all“:表示生产者把数据发送到leader,并同步到其他副本,才算数据写入成功,这种模式一般不会产生数据丢失,但是kafka的吞吐量会很低;

4:spring.kafka.producer.batch-size 默认批处理大小(以字节为单位)。 小批量将使分批变得不那么普遍,并且可能会降低吞吐量(零批量将完全禁用批处理)。

5:spring.kafka.producer.buffer-memory 生产者可以用来缓冲等待发送到服务器的记录的内存总字节数。

6:spring.kafka.producer.compression-type 生产者生成的所有数据的压缩类型

7:spring.kafka.producer.key-deserializer 生产者所有keys的序列化类,默认是 org.apache.kafka.common.serialization.StringDeserializer

8:spring.kafka.producer.value-deserializer 生产者所有values的序列化类,默认是 org.apache.kafka.common.serialization.StringDeserializer

9:spring.kafka.producer.retries 当数据发送失败时,可以重试发送的次数

10:spring.kafka.producer.transaction-id-prefix 不为空时,为生产者启用事务支持

11:spring.kafka.producer.properties 生产者其他属性配置,类型 java.util.Map<java.lang.String,java.lang.String>;

spring-kafka 消费者监听器

1:spring.kafka.listener.type 监听类型,类型 Listener.Type,

Type.SINGLE:一次调用一个ConsumerRecord的端点,默认

Type.BATCH:用一批ConsumerRecords调用端点。

2:spring.kafka.listener.ack-modeauto.commit.enable 设置为false时,表示kafak的offset由customer手动维护,spring-kafka提供了通过ackMode的值表示不同的手动提交方式;

AckMode.RECORD 当每一条记录被消费者监听器(ListenerConsumer)处理之后提交

AckMode.BATCH 当每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后提交

AckMode.TIME 当每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后,距离上次提交时间大于TIME时提交

AckMode.COUNT 当每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后,被处理record数量大于等于COUNT时提交

AckMode.COUNT_TIME 上述TIM 或 COUNT 有一个条件满足时提交

AckMode.MANUAL 当每一批poll()的数据被消费者监听器(ListenerConsumer)处理之后, 手动调用Acknowledgment.acknowledge()后提交

AckMode.MANUAL_IMMEDIATE 手动调用Acknowledgment.acknowledge()后立即提交

3:spring.kafka.listener.client-id 监听器的使用者的client.id属性的前缀

4:spring.kafka.listener.concurrency 在监听器容器中运行的线程数,表示启动多少个并发的消费者,这个值不能大于实际消费的主题的分区数

5:spring.kafka.listener.poll-timeout 消费者一次poll方法的超时时间,当在一次poll方法中,如果一次请求不到数据或者请求的数据小于设定的值,那么poll方法会继续执行请求,直到超时或者满足设置的条件

6:spring.kafka.listener.no-poll-threshold

7:spring.kafka.listener.ack-count 当 spring.kafka.listener.ack-mode 设置为 AckMode.COUNT 或者 AckMode.COUNT_TIME时生效,表示当一个poll数据消费后,处理的记录数大于多少时,触发提交

8:spring.kafka.listener.ack-time 当 **spring.kafka.listener.ack-mode 设置为 AckMode.TIME或者 AckMode.COUNT_TIME时生效,表示当一个poll数据消费后,距离上次提交时间大于 ack-time 时提交

9:spring.kafka.listener.idle-event-interval 发布空闲的消费者事件之间的时间(未接收到数据)

10:spring.kafka.listener.monitor-interval 无反应的消费者检查之间的时间。 如果未指定持续时间后缀,则将使用秒

测试监听者代码

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;

@Component
public class TestKafka {
    @KafkaListener(topics = {"first"})
    public void onMessage1(ConsumerRecord<?, ?> record){
        // 消费的哪个topic、partition的消息,打印出消息内容
        System.out.println("简单消费:"+record.topic()+"-"+record.partition()+"-"+record.value());
    }
}

我在生产者这边发送请求如下:

yml配置禁kafka_springboot

springboot端就能接收到数据

yml配置禁kafka_springboot_02