1. Kafka安装
Kafka安装请参考我的另一篇博客,本文不再叙述。
2. 整合springboot和kafka
可参考springboot官方文档和例子https://spring.io/projects/spring-kafka
Spring Initializr快速生成springboot项目,springboot已经包含kafka的自动化配置,现在只需要添加kafka依赖即可:
<dependencies>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.2.8.RELEASE</version>
</dependency>
</dependencies>
生产者的application.yml如下:
server:
port: 33000
spring:
application:
name: kafka-producer
kafka:
bootstrap-servers: 192.168.0.214:9092,192.168.0.214:9093,192.168.0.214:9094
producer:
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
acks: all
transaction-id-prefix: kafka-tx- # 自动开启事务,springboot会自动装配kafka事务管理器
template:
default-topic: topic-default
生产消息:
@RestController
@RequestMapping("/kafka/")
public class KafkaController {
@Autowired
private KafkaTemplate<String, String> kafkaTemplate;
@GetMapping("send")
public void index(){
ListenableFuture<SendResult<String, String>> future = kafkaTemplate.sendDefault(message);
future.addCallback(success -> System.out.println("KafkaMessageProducer 发送消息成功!"),
fail -> System.out.println("KafkaMessageProducer 发送消息失败!"));
}
/**
* 开启事务发送
*/
@GetMapping("sendWithTx")
@Transactional(rollbackFor = Exception.class)
public void sendWithTx(){
ListenableFuture<SendResult<String, String>> future = kafkaTemplate.sendDefault(message);
future.addCallback(success -> System.out.println("KafkaMessageProducer 发送事务消息成功!"),
fail -> System.out.println("KafkaMessageProducer 发送事务消息失败!"));
}
@GetMapping("sendWithTx2")
public void sendWithTx2(){
kafkaTemplate.executeInTransaction(kafkaTemplate -> {
ListenableFuture<SendResult<String, String>> future = kafkaTemplate.sendDefault(message);
future.addCallback(success -> System.out.println("KafkaMessageProducer 发送事务消息成功!"),
fail -> System.out.println("KafkaMessageProducer 发送事务消息失败!"));
return null;
});
}
}
新建一个springboot项目,消费Kafka消息,application.yml如下:
server:
port: 33000
spring:
application:
name: kafka-consumer
kafka:
bootstrap-servers: 192.168.0.214:9092,192.168.0.214:9093,192.168.0.214:9094
template:
default-topic: topic-default
consumer:
enable-auto-commit: true
group-id: consumer-vip-all
auto-offset-reset: latest
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
# properties:
# isolation.level: read_committed # 事务隔离级别
消费消息:
@Component
public class KafkaConsumer {
@KafkaListener(topics = {"${spring.kafka.template.default-topic}"})
public void receive(@Payload String message, @Headers MessageHeaders headers){
System.out.println("[default] 接收到消息:" + message);
headers.keySet().forEach(key->System.out.println(key + ":" +headers.get(key)));
}
}