Kafka——SpringBoot整合Kafka


文章目录

  • Kafka——SpringBoot整合Kafka
  • 简介
  • maven配置
  • spring配置
  • 生产者
  • 同步发送
  • 异步发送
  • 消费者
  • 调用
  • 同步发送
  • 异步发送
  • 参考



简介

SpringBoot整合Kafka,开启生产者服务并使用Web接口的方式向Kafka集群发送消息,同时开启一个消费者服务作为消息接受消费,模拟Web环境下的消息生产和消费过程

maven配置

添加maven依赖,主要有springboot、spring-kafka整合依赖、springboot-web

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-test</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

spring配置

spring配置写在application.yml中,将原来在代码中的配置转移到了配置文件里面,具体配置项的内容在org.springframework.boot.autoconfigure.kafka下KafkaProperties类中。这里选择了几个关键配置属性进行配置,如Kafka集群、生产者和消费者的键、值序列化器和反序列化器

server:
  port: 8081
spring:
  kafka:
    bootstrap-servers: 192.168.108.128:9092,192.168.108.129:9092,192.168.108.130:9092
    producer:
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
    consumer:
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      enable-auto-commit: true
      auto-commit-interval: 100

生产者

生产者调用web api接口请求,通过KafkaTemplete类进行发送,在Controller层注入KafkaTemplete,他的泛型即为键和值的类型,这里都用String类型的。生产者发送消息主要有同步发送和异步发送两种方式

@RestController
@Slf4j
@RequestMapping("/producer")
public class KafkaProduerController {
    @Autowired
    private KafkaTemplate<String, String> kafkaTemplate;
}

同步发送

同步发送消息通过调用KafkaTemplete的send()方法。由于同步发送不关心是否发送成功,所以调用后不需要返回值

@PostMapping("/sync")
public String sendSync() {
for (int i = 0; i < 20; i++) {
kafkaTemplate.send("spring-kafka-sync", "spring-data-" + i);
}
return Kafka.SUCCESS.getValue();
}

异步发送

异步发送同样是调用KafkaTemplete的send()方法,由于异步发送需要知道消息是否发送成功才进行下一条消息的发送,因此会返回一个ListenableFuture对象,并且给该对象添加回调事件,来对消息发送成功或失败事件进行响应和处理

@PostMapping("/async")
public String sendAsync(){
String topic = "spring-kafka-async";
for (int i = 0; i < 20; i++) {
ListenableFuture<SendResult<String, String>> sendReult = kafkaTemplate.send(topic, "spring-kafka-async-"+i);
sendReult.addCallback(new ListenableFutureCallback<SendResult<String, String>>() {
    @Override
    public void onFailure(Throwable throwable) {
    log.error(topic +"--send failed");
    log.error(throwable.getMessage());
    }

    @Override
    public void onSuccess(SendResult<String, String> stringStringSendResult) {
    log.info(topic+" --send success");
    log.info(topic+" partition: "+ stringStringSendResult.getRecordMetadata().partition());
    log.info(topic+" offset: "+ stringStringSendResult.getRecordMetadata().offset());
    }
    });

    }
return Kafka.SUCCESS.getValue();
}

消费者

消费者通过在方法上加上@KafkaListeners注解来对Kafka中的Topic进行监听,当监听的Topic有消息时便会自动接收到消息

@Component
@Slf4j
public class ConsumerListener {
    @KafkaListeners({
            @KafkaListener(id = "spring-kafka-sync", topics = "spring-kafka-sync"),
            @KafkaListener(id = "spring-kafka-async", topics = "spring-kafka-async")
    })
    public void listen(String info) {
        log.info("consumer receive info: " + info);
    }
}

调用

同步发送

请求地址

控制台

springboot集成kafka写入mysql数据库 springboot kafka整合_kafka

异步发送

请求地址

控制台

springboot集成kafka写入mysql数据库 springboot kafka整合_java_02

从控制台可以观察到,同步发送全部发送成功才开始依次消费消息;异步发送一边发一边消费,但是发送和消费顺序依然一致。