1.下载并启动Kafka
- 通过
https://mirrors.tuna.tsinghua.edu.cn/apache/kafka/2.4.1/kafka_2.13-2.4.1.tgz
下载Kafka - 解压后先在根文件夹中创建子级的
tmp/zookeeper
文件夹 - 并在 config 配置文件夹中,找到
zookeeper.properties
文件,修改dataDir 的值为以上新建的文件夹的路径 - 继续在刚才使用的 tmp 文件夹下创建
kafka-logs
文件夹,并打开 config 下的server.properties
文件,修改log.dirs
属性的值为以上文件夹路径
提示:其实以上配置的2个文件夹的位置是可以随意指定的,甚至直接使用默认的位置也是可行的,配置的主要目的是使得以上配置的文件夹的位置是明确的,并且,Kafka在运行之前会读取以上文件中的文件(如果存在的话),在运行过程中也会产生文件,如果以上2个文件夹中的文件存在版本差异,会导致Kafka不可用,所以,在第1次使用Kafka之前,必须保证以上配置的2个文件夹是空的!
- 配置完成后,接下来,需要启动Kafka,在启动Kafka之前,需要先启动ZooKeeper,并使用zookeeper.properties 作为启动参数:
- 然后,再启动Kafka,使用 server.properties 作为启动参数:
提示:如果执行不成功,请检查当前电脑的环境变量的配置。
2.关于Kafka
Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。
Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 这种动作(网页浏览,搜索和其他用户的行动)是在现代网络上的许多社会功能的一个关键因素。 这些数据通常是由于吞吐量的要求而通过处理日志和日志聚合来解决。对于像Hadoop一样的日志数据和离线分析系统,但又要求实时处理的限制,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,也是为了通过集群来提供实时的消息。
尽管Kafka的功能非常强大,但是,在许多应用场景中,开发人员将它作为“消息队列”服务来使用!用于将大量并行的请求处理过程改为串行的模式。
3.使用Kafka
使用Kafka的核心在于“一方将消息发送给Kafka,另一方接收从Kafka发出的消息”!在使用Kafka之前,需要添加依赖 spring-kafka 、 gson :
<!-- https://mvnrepository.com/artifact/org.springframework.kafka/spring- kafka --> <dependency> <groupId>org.springframework.kafka</groupId> <artifactId>spring-kafka</artifactId> <version>2.6.3</version> </dependency> <!-- https://mvnrepository.com/artifact/com.google.code.gson/gson --> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> <version>2.8.6</version> </dependency>
Gson是Google公司开发的工具,可以实现对象与JSON格式的字符串之间的相互转换。
- 在使用Kafka之前,需要在启动类的声明之前添加 @EnableKafka 注解
- 为了保证对象与JSON格式的字符串之间的相互转换,在启动类中配置Gson对象交由Spring框架进行管理
- 使用控制器作为将消息发送给Kafka,当接收到“发布问题”的请求时,向Kafka服务器发出消息
关于以上 KafkaTemplate 的自动装配中,配置了 required=false ,是因为开发工具对此次的自动装配存在误判,开发工具认为无法自动装配,会报错,其实并不会出现无法装配的问题!为了使得开发工具不会报错,所以添加配置 required=false 。
以上方式首先使用gson将对象转换为JSON字符串,然后在使用kafka进行消息的处理。
同时,使用Kafka时还要求配置Group ID,需要在 application.properties 中添加配置:
# Kafka的Group Id
spring.kafka.consumer.group-id=当前项目名称
当消息已经可以发出后,就需要有订阅者来接收该消息(由于订阅者接收到消息后会处理具体的任务,所以也称之为消费者),使用服务层处理消息队列中的请求