#夏日挑战赛# 一文搞懂SpringBoot与Kakfa的整合 原创
0.阅读完本文你将会学到
- 一些linux的常用命令
- 如何在linux上安装JDK、ZooKeeper、Kafka
- 轻量级的Spring与Kafka的整合
Kafka起初是由LinkedIn公司采用Scala语言开发的一个多分区、多副本且基于ZooKeeper协调的分布式消息系统,现已被捐献给Apache基金会。
目前Kafka已经定位为一个分布式流式处理平台,它以高吞吐、可持续化、可水平扩展、支持流数据处理等多种特性而被广泛使用。
关于Kafka名字的由来,另有一段佳话。如果你的记忆力还不错的话,应该会记得高中有一篇课文叫做《变形记》,它的作者正是奥地利小说家Franz Kafka。笔者本人也非常喜欢他的《城堡》一作。而Apache Kafka的作者大学的时候也非常喜欢Franz Kafka,所以就将这个系统命名为Kafka。
现在让我们打开电脑,一起实践吧!
如果你的电脑上已经安装了Kafka,可以跳过第一部分,直接进入第二部分哦。
1. Kafka的安装与设置
安装Kafka之前,我们需要安装Java以及ZooKeeper。
1.1 安装JDK
1. 确认系统是否已安装过Java
安装JDK之前我们先确认下系统是否已安装过JDK,如下操作:
如果没有任何信息,则表示系统没有安装过Java。
如果想要卸载已经安装过的JDK,则可以执行下方的命令。
2. 安装Java
下面开始安装Java,这里以1.8为例。
通过这个命令我们可以看见Java 1.8版本的所有文件。
然后我们可以通过这个命令安装Java 1.8版本的所有文件。
当控制台返回Complete之后,显示Java已经安装成功。
3. 确认Java安装成功
使用下面这个命令进行确认
结果显示如下,表示已安装成功。
使用yum安装的时候,环境变量就自动配好了。
1.2 安装ZooKeeper
1. 创建目录data并且下载3.7.0版本的ZooKeeper
2. 解压
3. 修改配置文件
输入vi zoo.cfg之后,需要按i进入insert模式才能做修改。修改完毕请先按ESC退出insert模式,进入命令行模式,再按连续两个大写ZZ进行保存并退出。
将dataDir=/tmp/zookeeper
修改成dataDir=/data/apache-zookeeper-3.7.0-bin/data
3. 创建对应的data目录
4. 启动ZooKeeper
进入ZooKeeper的bin目录并且启动服务
Zookeeper成功后将会出现下面信息:
下面是其他几个常用命令
1.3 安装kafka
1. 下载版本为3.0.0的kakfa
2. 解压
3. 启动
config/server.properties
中的zookeeper.connect
的默认地址是localhost:2181
,如果你的Zookeeper安装在本机,保持默认即可。
现在你已经成功启动了Kafka,恭喜你终于迈出了第一步!
2. Spring与Kafka的整合
2.1 配置pom
我们需要在pom.xml里面添加Kafka的依赖:
文中的demo应用将是一个Spring Boot的应用,你可以在这里方便快捷地创建一个Spring Boot的应用。
2.2 配置Topic
我们先来回顾下什么是topic:
在 Kafka 中,使用一个类别属性来划分数据的所属类,划分数据的这个类称为 topic 。如果把 Kafka 看做为一个数据库, topic 可以理解为数据库中的一张表, topic 的名字即为表名。
之前我们可以通过命令行创建Topic
现在由于有了Kafka中AdminClient的引入,我们可以在程序中创建topic。
我们需要添加KafkaAdmin这个bean,它可以自动地带入NewTopic的所有bean的topic。
2.3 生产消息
为了创建消息,我们首先需要配置一个ProducerFactory。ProducerFactory设置了创建Kafka Producer实例的策略。
然后我们需要一个KafkaTemplate,它包装了一个Producer实例,并提供了向Kafka Topic发送消息的方法。
Producer实例是线程安全的。在整个应用环境中使用单例会有更高的性能。KakfaTemplate实例也是线程安全的,建议使用一个实例。
2.3.1 Producer配置
2.3.2 发布消息
我们可以使用KafkaTemplate来发送消息。
sendAPI返回一个ListenableFuture对象。如果我们想阻止发送线程,并获得关于已发送消息的结果,我们可以调用ListenableFuture对象的get API。该线程将等待结果,但它会减慢producer的速度。
Kafka是一个快速的流处理平台。因此,最好是异步处理结果,这样后续的消息就不会等待前一个消息的结果了。
我们可以通过回调来做到这一点:
2.4 消费消息
2.4.1 Consumer配置
为了消费消息,我们需要配置一个ConsumerFactory和一个KafkaListenerContainerFactory。一旦这些bean在Spring bean工厂中可用,就可以使用@KafkaListener注解来配置基于POJO的consumer。
配置类中需要有@EnableKafka注解,以便在Spring管理的bean上检测@KafkaListener注解。
2.4.2 消费消息
我们可以为一个topic实现多个listener,每个都有不同的group ID。此外,一个consumer可以监听来自不同topic的消息。
Spring还支持使用监听器中的@Header注解来检索一个或多个消息头。
2.4.3 消费特定分区的信息
注意,我们创建的话题jayxu
只有一个分区。
然而,对于一个有多个分区的topic,@KafkaListener可以明确地订阅一个有initial offset
的topic的特定分区。
由于在这个监听器中,initialOffset
被设置为0,所以每次初始化这个监听器时,所有之前消耗的0和3分区的消息都会被重新消费。
如果我们不需要设置offset,我们可以使用@TopicPartition注解的partitions属性,只设置没有offset的分区。
2.4.4 为监听器添加消息过滤器
我们可以通过添加一个自定义的过滤器来配置监听器来消费特定类型的消息。这可以通过给KafkaListenerContainerFactory设置一个RecordFilterStrategy来完成。
然后我们可以配置一个监听器来使用这个容器工厂。
在这个监听器中,所有符合过滤器的信息都将被丢弃。
2.5 自定义消息转换器
到目前为止,我们只涵盖了发送和接收字符串的消息。然而,我们也可以发送和接收自定义的Java对象。这需要在ProducerFactory中配置适当的序列化器,在ConsumerFactory中配置解序列化器。
让我们看看一个简单的bean类,我们将把它作为消息发送。
2.5.1 生产自定义消息
在这个例子中,我们将使用JsonSerializer。
让我们看看ProducerFactory和KafkaTemplate的代码。
我们可以使用这个新的KafkaTemplate来发送Greeting信息。
2.5.2 消费自定义消息
同样地,让我们修改ConsumerFactory和KafkaListenerContainerFactory,以正确地反序列化Greeting消息。
spring-kafka的JSON序列化器和反序列化器使用Jackson库,这也是spring-kafka项目的可选Maven依赖。
所以,让我们把它添加到我们的pom.xml中。
建议不要使用Jackson的最新版本,而是使用spring-kafka的pom.xml中加入的版本。
最后,我们需要写一个监听器来消费Greeting消息。
3. 总结
在这篇文章中,我们介绍了如何安装Kafka以及Spring支持Apache Kafka的基本情况。我们简单学习了一下用于发送和接收消息的类。
在运行代码之前,请确保Kafka服务器正在运行,并且topic是手动创建的。
感谢您的观看,如果可以的话请三连支持!您也可以查看我的主页进行关注我的后续文章,非常感谢!
有用 感谢
写得很好呀 求关注
学到了 写得很不错~
感谢作者 带来很好的文章
学到了 写得很不错~