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);
}
}
调用
同步发送
请求地址
控制台
异步发送
请求地址
控制台
从控制台可以观察到,同步发送全部发送成功才开始依次消费消息;异步发送一边发一边消费,但是发送和消费顺序依然一致。