Spring Boot无缝对接Kafka实现生产者消费者
![5594a09470a54e98159deef885627548.png](https://i-blog.csdnimg.cn/blog_migrate/ca1fd4a596dbd6ad69461133c6e890f9.jpeg)
一、Spring Boot版本
本文采用的Spring Boot版本是2.1.6.RELEASE
org.springframework.boot
spring-boot-starter-parent
2.1.6.RELEASE
引入Kafka的依赖
org.springframework.kafka
spring-kafka
2.2.6.RELEASE
bootstrap.yml添加Kafka配置:
spring.kafka.producer.bootstrap-servers=192.168.3.4:9092
![ca775b6c070a864770da8a4fe1168532.png](https://i-blog.csdnimg.cn/blog_migrate/ce75e2c384fe2d8e3409a685eccacc44.jpeg)
二、Kafka基础知识
生产者
Kafka使用Producer作为生产者,将Broker推入生产数据
消息载体
Kafka使用Broker作为消息载体,由多个Kakfa服务器组成
消费者
Kafka使用Consumer作为消费者,从消息载体中获取Topic字节数据
Topic
Kafka使用Topic对消息进行拆分,通过将数据存放在不同Topic中,将消息村放入Topic中进行获取
消息生产者重试机制配置:
# 当写入失败时,重试次数。主节点失效,一个重复节点会替代成为主节点,此时可能出现写入失败,
# 当重试次数=0时,生产者不会重复。重试重发,此时重复节点完全成为领导节点,不会产生消息丢失。
spring.kafka.producer.retries=0
# 可以批量发送消息的个数,生产者积累到一定数据,一次发送
spring.kafka.producer.batch-size=8148
# 生产者积累数据一次发送,缓存大小达到buffer.memory就发送数据
spring.kafka.producer.buffer-memory=2911568
#生产者要求主节点在考虑完成请求之前收到的确认数,用于控制发送记录在服务端的持久化,
spring.kafka.producer.acks=1
# 指定消息key和消息体的编解码方式
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
![614ee599cef29d8d966803b48eba14ad.png](https://i-blog.csdnimg.cn/blog_migrate/39c488925b214c5481bb38eaaace736f.jpeg)
2.1生产者发送Kafka消息
@Autowired
private KafkaTemplate kafkaTemplate;
@GetMapping("/topic/send")
public boolean topicSend(@RequestParam String msg){
kafkaTemplate.send("defaultTopic",msg);
return true;
}
![94bf6afa17b319f6dae701218524c86c.png](https://i-blog.csdnimg.cn/blog_migrate/fa4b7df4c2d69cd33e0628c79f8ac977.jpeg)
2.2消费者接收数据
消费者Kafka配置:
# 指定Default Consumer分组 id --> 由于在kafka中,同一组中的消费者不会读取到同一个msg,依靠分组设置组名
spring.kafka.consumer.group-id=defaultTopic
# 最小和最大才有效,如果最小重新0开始读取,如果是最大从logfile的offset读取。一般情况下我们都是设置最小化
spring.kafka.consumer.auto-offset-reset=earliest
# 设置自动提交offset
spring.kafka.consumer.enable-auto-commit=true
#如果自动提交为true,则Consumer偏移自动提交给Kafka的频率,默认值为3000。
spring.kafka.consumer.auto-commit-interval=200
消费者接收数据:
@KafkaListener(topics = "defaultTopic")
public void onMessage(String msg){
System.out.println(msg);
}
![6187ff93b5cd319977ab3c6e1710550f.png](https://i-blog.csdnimg.cn/blog_migrate/6b6d95c5a6618a2f644bb1e24d1f5de3.jpeg)
2.3简单通信过程
2.3.1生产者
@Autowired
private KafkaTemplate kafkaTemplate;
/**
* 发送简单消息
* @param msg
* @return
*/
public String sendSimple(String msg){
kafkaTemplate.send(KafkaRestConfig.TOPIC1,msg);
return msg;
}
/**
* 发送对象消息
* @param obj
* @return
*/
public String sendTopicObj(Object testobj){
String msg = JSON.toJSONString(testobj);
kafkaTemplate.send(KafkaRestConfig.TOPIC2,msg);
return “成功”;
}
![954a747d29d140ddf043247f0845c5f8.png](https://i-blog.csdnimg.cn/blog_migrate/69367a0afd227f13c8dd09f74f2be580.jpeg)
2.3.2消费者
@KafkaListener(topics = "kafka-simple")
public void onMessage1(String msg){
log.info(msg);
log.info("kafka-simple接收结果:{}",msg);
}
@KafkaListener(topics = "kafka-object")
public void onMessage2(String object){
log.info(object);
Object obj = JSONUtil.parse(object);
log.info("kafka-object接收结果:{}",obj.toString());
}
![abfd6daf611db8ee95c154ad582e6252.png](https://i-blog.csdnimg.cn/blog_migrate/e8bd7c810f82fdb4151202f502169b03.jpeg)
三、总结
以上就是Kafka的简单通信,笔者水平有限,还望指正。