SpringBoot集成Kafka
1. 环境说明
- 在docker或windows中快速搭建zookeeper与kafka环境
- zookeeper版本:
apache-zookeeper-3.8.1-bin.tar.gz
- kafak版本:
kafka_2.13-3.4.0.tgz
- SpringBoot版本:
2.7.9
2. SpringBoot集成Kafka
1. 建立工程
在Idea的中通过
Spring Initializr
新建一个名为yuan-kafka-boot
的工程
2. pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.9</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.yuan</groupId>
<artifactId>yuan-kafka-boot</artifactId>
<version>1.0.0</version>
<name>yuan-kafka-boot</name>
<description>yuan-kafka-boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
3. application.yml
server:
servlet:
context-path: /
port: 2001
spring:
application:
name: yuan-kafka-boot
# 连接kafka集群
kafka:
# 多个主机用逗号隔开
bootstrap-servers: localhost:9092
# 生产者
producer:
# key与value的序列化
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
# 消费者
consumer:
# key与value的反序列化
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
group-id: boot-test-group
4. 编写生产者Controller
ProducerDemoController.java
如下
package com.yuan.producer;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/producer")
public class ProducerDemoController {
@Resource
private KafkaTemplate<String, String> kafkaTemplate;
/**
* 发送消息
*
* @param msg
* @return
*/
@RequestMapping("/sendMsg")
public String sendMsg(@RequestParam(name = "msg", defaultValue = "hello kafka") String msg) {
kafkaTemplate.send("boot-test", msg);
return "消息已发送";
}
}
5. 消费着监听topic接收消息
- 在类上面添加
@Component
或@Configuration
注解- 通过
@KafkaListener(topics = {"boot-test","test"})
注解监听主题中的消息
package com.yuan.consumer;
import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
@Component
@Configuration
@Slf4j
public class ConsumerDemo {
/**
* 监听topic-boot与test主题中的消息
*
* @param consumerRecord 消费着消息记录
*/
@KafkaListener(topics = {"boot-test", "test"})
public void consumerMsg(ConsumerRecord<?, ?> consumerRecord) {
log.info("{}{}{}", "接收到来自主题[" + consumerRecord.topic(), "],key为:" + consumerRecord.key(), "的消息==>>" + consumerRecord.value());
}
}