在项目中使用kafka的场景有很多,尤其是实时产生的数据流,例如:电商数据、电信数据、统计等,通过kafka可以结合flink进行大数据分析。所以第一步就是要集成kafka。springboot已经将kafka集成到框架里了,只需要引用依赖就可以简单使用。
一、引入依赖
<!-- spring-kafka --> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>2.8.6</version> </dependency>
二、在application.yml中配置信息
spring:
kafka:
# 以逗号分隔的地址列表,用于建立与Kafka集群的初始连接(kafka 默认的端口号为9092)
bootstrap-servers: 192.168.1.199:9092
producer:
# 发生错误后,消息重发的次数。
retries: 0
#当有多个消息需要被发送到同一个分区时,生产者会把它们放在同一个批次里。该参数指定了一个批次可以使用的内存大小,按照字节数计算。
batch-size: 16384
# 设置生产者内存缓冲区的大小。
buffer-memory: 33554432
# 键的序列化方式
key-serializer: org.apache.kafka.common.serialization.StringSerializer
# 值的序列化方式
value-serializer: org.apache.kafka.common.serialization.StringSerializer
# acks=0 : 生产者在成功写入消息之前不会等待任何来自服务器的响应。
# acks=1 : 只要集群的首领节点收到消息,生产者就会收到一个来自服务器成功响应。
# acks=all :只有当所有参与复制的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应。
acks: all
consumer:
# 自动提交的时间间隔 在spring boot 2.X 版本中这里采用的是值的类型为Duration 需要符合特定的格式,如1S,1M,2H,5D
auto-commit-interval: 1S
# 该属性指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该作何处理:
# latest(默认值)在偏移量无效的情况下,消费者将从最新的记录开始读取数据(在消费者启动之后生成的记录)
# earliest :在偏移量无效的情况下,消费者将从起始位置读取分区的记录
auto-offset-reset: earliest
# 是否自动提交偏移量,默认值是true,为了避免出现重复数据和数据丢失,可以把它设置为false,然后手动提交偏移量
enable-auto-commit: true
# 键的反序列化方式
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
# 值的反序列化方式
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
listener:
# 在侦听器容器中运行的线程数。
concurrency: 4
三、 生产者
@RestController
@RequestMapping("/producer")
public class producerController {
@Autowired
private CallBackService callBackService;
@Autowired
KafkaTemplate<String, String> kafkaTemplate;
/**
* 列表
*/
@RequestMapping("/list")
public void list() {
List<CallBack> callBacks = callBackService.listMaps(10); // 从数据库读取10条记录测试
for (CallBack callBack : callBacks) {
String json = JSONObject.toJSONString(callBack);
kafkaTemplate.send("callcdr", json); // 发送数据到kafka
System.out.println(json);
}
}
}
四、消费者
/**
* @Classname KafkaSimpleConsumer
* @Description 单个消费者
* @Date 2019-05-14 10:08
*/
@Slf4j
@Component
public class KafkaConsumerTest {
// 简单消费者,groupId可以任意起
@KafkaListener(groupId = "ConsumerX", topics = "callcdr")
public void consumer1_1(ConsumerRecord<String, Object> record, @Header(KafkaHeaders.RECEIVED_TOPIC) String topic, Consumer consumer) {
System.out.println("消费记录:" + record.value());
}
}
五、使用BigData tools查看kafka情况
在IDEA里安装BigData tools
消费完成后consumerX为空。