Spring Boot 集成 Kafka

1.导入依赖



    org.springframework.kafka
    spring-kafka

2.在 application.yml 中配置kafka

spring:
  #kafka
  kafka:
    bootstrap-servers: localhost:9092
    producer:
      retries: 0
      batch-size: 16384
      buffer-memory: 33554432
      acks: 1
    consumer:
      group-id: TestGroup
      auto-offset-reset: earliest
      enable-auto-commit: false
      auto-commit-interval: 5000
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
    listener:
      concurrency: 3
      ack-mode:manual_immediate

#=============== provider  =======================
# retris:
# 写入失败时,重试次数。当leader节点失效,一个repli节点会替代成为leader节点,此时可能出现写入失败,
# 当retris为0时,produce不会重复。retirs重发,此时repli节点完全成为leader节点,不会产生消息丢失。

# batch-size:
# 每次批量发送消息的数量,produce积累到一定数据,一次发送

# buffer-memory:
# produce积累数据一次发送,缓存大小达到buffer.memory就发送数据

# acks:
# 控制发送记录在服务端的持久化
# acks = 0 如果设置为零,则生产者将不会等待来自服务器的任何确认,该记录将立即添加到套接字缓冲区并视为已发送。
# 在这种情况下,无法保证服务器已收到记录,并且重试配置将不会生效(因为客户端通常不会知道任何故障),为每条记录返回的偏移量始终设置为-1。
# acks = 1 这意味着leader会将记录写入其本地日志,但无需等待所有副本服务器的完全确认即可做出回应,在这种情况下,如果leader在确认记录后立即失败,但在将数据复制到所有的副本服务器之前,则记录将会丢失。
# acks = all 这意味着leader将等待完整的同步副本集以确认记录,这保证了只要至少一个同步副本服务器仍然存活,记录就不会丢失,这是最强有力的保证,这相当于acks = -1的设置。
# 设置选项:all, -1, 0, 1

#=============== consumer  =======================
# group-id:
# 指定默认消费者group id --> 由于在kafka中,同一组中的consumer不会读取到同一个消息,依靠groud.id设置组名

# auto-offset-reset:
# smallest和largest才有效,如果smallest重新0开始读取,如果是largest从logfile的offset读取。一般情况下我们都是设置smallest

# enable.auto.commit:true --> 设置自动提交offset

# auto-commit-interval:
# 如果'enable.auto.commit'为true,则消费者偏移自动提交给Kafka的频率(以毫秒为单位),默认值为5000。设定时间内没提交的会再次消费

# key-deserializer, value-deserializer
# 指定消息key和消息体的编解码方式
# value-deserializer 默认使用 org.apache.kafka.common.serialization.StringDeserializer,只支持文本消息。
# value-deserializer 使用 org.springframework.kafka.support.serializer.JsonDeserializer可以让消息支持JSON

#=============== listener  =======================
# concurrency:
# 同时处理消费的线程数,kafkaListener就可以多线程消费了
# ack-mode:
# MANUAL_IMMEDIATE手动提交,每消费一条就提交一次,而不是MANUAL中的一批,确保服务重启不重复消费,也不交给spring自动提交,自己提交;
# 改项对应enable-auto-commit为false
# 手动ack消息确认机制,手动调用Acknowledgment.acknowledge()后立即提交.

3.编写kafka生产监听器

@Slf4j
@Component
public class KafkaProducerListener implements ProducerListener {

    @Override
    public void onSuccess(ProducerRecord producerRecord, RecordMetadata recordMetadata) {
        log.info("消费发送成功 offset:" + recordMetadata.offset());
    }

    @Override
    public void onError(ProducerRecord producerRecord, RecordMetadata recordMetadata, Exception exception) {
        log.error("消费发送失败 内容:" + producerRecord.value() + ",消费发送失败 分区:" + producerRecord.partition());
        exception.printStackTrace();
    }
}

4.注册kafka生产监听器

@Configuration
public class KafkaConfig {

    @Bean
    public KafkaTemplate kafkaTemplate(KafkaProducerListener kafkaProducerListener, ProducerFactory pf) {
        KafkaTemplate kafkaTemplate = new KafkaTemplate<>(pf);
        kafkaTemplate.setProducerListener(kafkaProducerListener);
        return kafkaTemplate;
    }
}

5.编写kafka消费监听器

@Slf4j
@Component
public class KafkaConsumerListener {

    @KafkaListener(topicPattern = "kafka-topic")
    public void onMessage(ConsumerRecord record, Acknowledgment ack){
        log.info("接收到kafka[{}]消息!", SystemConstants.KAFKA_TOPC);
        log.info("partition:{}", record.partition());
        log.info("offset:{}", record.offset());
        log.info("value:" + record.value());
        TimeUnit.SECONDS.sleep(1);
        //提交消息
        ack.acknowledge();
    }
}

6.测试kafka,生产消息

@RestController
public class KafkaProducerController {

    @Autowired
    private KafkaTemplate kafkaTemplate;

    @GetMapping("/message/send/{msg}")
    public boolean sendMsg(@PathVariable("msg") String msg) {
        kafkaTemplate.send("kafka-topic", msg);
        return true;
    }
}


7.调用接口,查看控制台是否打印kafka信息,如果有则成功!

你可能感兴趣的:(消息中间件,相关,SpringBoot,相关,kafka,spring,boot)