一、安装kafka
准备:需提前准备好hadoop集群和并且在集群中配置好zookeeper
1、解压
本次使用的Kafka压缩包版本为:
将其上传至/opt/software目录下,然后解压至/opt/module/目录下
tar -zxvf kafka_2.12-3.0.0.tgz -C /opt/module
2、配置
到/opt/module/kafka_2.12-3.0.0/config路径下,打开编辑server.properties配置文件,总共需要修改3处:
broker.id=0
log.dirs=/opt/module/kafka_2.12-3.0.0/datas
zookeeper.connect=hadoop102:2181,hadoop103:2181,hadoop104:2181/kafka
3、同步
在/opt/module目录下,使用指令 xsync kafka_2.12-3.0.0/来同步kafka数据,同步完成后,在另外两台机器中,修改server.properties配置文件中的broker.id分别为1 和 2(也就是是hadoop102的broker.id=0,hadoop103的broker.id=1,Hadoop04的broker.id=2);
4、配置环境变量
因为之前配置Hadoop的时候,在目录/etc/profile.d目录下,新建了一个my_env.sh配置文件来专用于写环境变量,所以进入该文件,添加:
#KAFKA
export KAFKA_HOME=/opt/module/kafka_2.12-3.0.0
export PATH=$PATH:$KAFKA_HOME/bin
然后执行source /etc/profile来实现资源
然后使用xsync /etc/profile指令来讲环境变量同步到另外两台机器上
注意,通过过去后,也需要在另外两台机器上执行source /etc/profile 指令
二、启动与停止
在配置完成之后,如果想要启动kafka,那么必须先讲zookeeper集群启动起来,使用zk.sh start启动zookeeper集群,然后使用bin/kafka-server-start.sh -daemon config/server.properties指令来启动kafka,停止指令是bin/kafka-server-stop.sh
这种启动方式比较费事麻烦,所以写一个脚本来进行一次性启动和停止集群:
#!/bin/bash
case $1 in
"start"){
for i in hadoop102 hadoop103 hadoop104
do
echo -------------- kafka $i 启动 ---------------
ssh $i "/opt/module/kafka_2.12-3.0.0/bin/kafka-server-start.sh -daemon /opt/module/kafka_2.12-3.0.0/config/server.properties"
done
}
;;
"stop"){
for i in hadoop102 hadoop103 hadoop104
do
echo -------------- kafka $i 停止 ---------------
ssh $i "/opt/module/kafka_2.12-3.0.0/bin/kafka-server-stop.sh"
done
}
;;
esac
此后,开启和关闭kafka集群的指令为:
kf.sh start 开启
kf.sh stop 关闭
三、整合springboot
1、新建一个springboot的项目
2、编写生产者
在项目中创建一个controller包,包中创建ProduceController生产者类
代码如下
package com.song.kafka.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author songxh
* @create 2022-07-31-15:03
*/
@RestController
public class ProduceController {
@Autowired
private KafkaTemplate<String, String> kafka;
@RequestMapping("/song")
public String data(String msg) {
//通过kafka发送出去
kafka.send("first", msg);
return "ok";
}
}
在application.properties中配置集群以及序列化key和value
代码如下
#连接kafka集群
spring.kafka.bootstrap-servers=hadoop102:9092,hadoop103:9092
#key和value的序列化
spring.kafka.producer.key-serializer=org.apache.kafka.common.serialization.StringSerializer
spring.kafka.producer.value-serializer=org.apache.kafka.common.serialization.StringSerializer
3、创建一个消费者
在虚拟机中开启集群,创建一个消费者
kf.sh status 开启kafka集群 注意,开启kafka集群之前需要开启zookeeper
bin/kafka-console-consumer.sh --bootstrap-server hadoop102:9092 --topic first
创建一个topic为first的消费者
此时便可以运行springboot程序,访问
localhost:8080/song?msg="hello",返回ok表示发送成功
此时集群这边也接受到该消息
以上便是整合springboot,并且使用springboot实现生产者,虚拟机实现消费者
4、使用springboot来实现消费者
创建一个config包,包下创建一个KafkaConsumer类作为消费者的配置类
代码如下
package com.song.kafka.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.kafka.annotation.KafkaListener;
/**
* @author songxh
* @create 2022-07-31-15:39
*/
@Configuration
public class KafkaConsumer {
@KafkaListener(topics = "first")
public void consumerTopic(String msg){
System.out.println("收到的消息"+msg);
}
}
在application.properties中添加消费者需要的配置
代码如下
#接受消息的时候,key和value的反序列化
spring.kafka.consumer.key-deserializer=org.apache.kafka.common.serialization.StringDeserializer
spring.kafka.consumer.value-deserializer=org.apache.kafka.common.serialization.StringDeserializer
#消费者组的id
spring.kafka.consumer.group-id=song
启动springboot,查看是否成功
成功接收到消息,配置成功!