Linux环境下Kafka 学习安装与使用(SpringBoot整合)
个人学习记录
个人实际操作简化记录
欢迎大家观看海贼王原章:Linux环境下Kafka的安装与使用(SpringBoot整合云服务器上的Kafka)
1.下载kafka
- kafak 官网:http://kafka.apache.org/
- 下载地址:http://archive.apache.org/dist/kafka/2.3.1/
推荐下载国内镜像:https://www.apache.org/dyn/closer.cgi?path=/kafka/2.5.1/kafka_2.13-2.5.1.tgz
2.在Linux下安装Kafka
Xftp Xshell 个人免费申请
https://www.netsarang.com/zh/free-for-home-school/
2.1 使用Xftp 将Kafka 传输到云服务器/虚拟机指定位置
看文件位置 没有文件夹就随便创建一个
2.2 使用Xshell 连接云服务器/ 虚拟机
先进入 文件夹
cd /usr/local/src/software
解压 压缩包:
tar -zxvf kafka_2.13-2.5.1.tgz
进入文件夹
cd kafka_2.13-2.5.1
在给文件夹权限:
pwd /usr/local/src/sofware/kafka_2.13-2.5.1
进入bin目录查看:
2.3 在config目录中修改修改配置
cd /usr/local/src/software/kafka_2.13-2.5.1/config
zookeeper.properties
- 先创建data文件夹
- cd /usr/local/src/software/kafka_2.13-2.5.1
- 创建 用于存放zookeeper运行后来的数据
- mkdir data
- 在给文件夹权限
- pwd /usr/local/src/software/kafka_2.13-2.5.1/data
- 复制 这路径
- /usr/local/src/software/kafka_2.13-2.5.1/data
然后进入config
cd /usr/local/src/software/kafka_2.13-2.5.1/config
目录修改 zookeeper.properties配置 文件:vim zookeeper.properties
按 Ins scrlk 切换insert 修改完 按Esc 在 :
输入wq
server.properties
然后修改 server.properties
配置文件
vim server.properties
在 vim 中输入 /log.dir
快速定位到要修改的位置:
# A comma separated list of directories under which to store log files
log.dirs=/usr/local/src/software/kafka_2.13-2.5.1/data/kafka-logs
:wq 退出
3.启动Kafka
3.1先启动keeper 在启动Kafka
因为 Kafka 依赖 Zookeeper
- 进入
bin
目录下执行: ./zookeeper-server-start.sh …/config/zookeeper.properties 命令,以指定配置文件启动zookeeper 服务, 守护进程启动方式,在结尾加一个&
zookeeper
服务启动后,打开一个新窗口,执行./kafka-server-start.sh ../config/server.properties
命令,启动Kafka
服务,守护进程启动方式,在结尾加一个 &- 然后我们可以在刚才新建的 data 目录下看到 Kafka 和 zookeeper 的启动日志文件
- /usr/local/src/software/kafka_2.13-2.5.1/data 在打ll
3.2关闭zookeeper 和 kafka
- 在
bin
目录下关闭zookeeper
./zookeeper-server-stop.sh - 关闭kafka
./kafka-server-stop.sh
4.使用Kafak
以Kafka消息发布订阅(topics)功能为例
4.1 创建主题
进入 bin 目录,执行 ./kafka-topics.sh --create --bootstrap-server xxx.xxxx.xxx:9092 --replication-factor 1 --partitions 1 --topic test
命令,创建一个主题
4.2查看所有主题
./kafka-topics.sh --list --bootstrap-server xxx.xxxx.xxx:9092
4.3生产者(producer)向Kafka某个主题发消息
./kafka-console-producer.sh --broker-list xxx.xxxx.xxx:9092 --topic test
4.4 消费者(consumer)从Kafka某个主题上接收消息
./kafka-console-consumer.sh --bootstrap-server x.xxx.xx.xxx:9092 --topic test --from-beginning
5.SpringBoot 整合Kafka
5.1Maven依懒
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
<version>2.3.7.RELEASE</version>
</dependency>
5.2 配置Kafka
# kafka 配置
spring:
kafka:
bootstrap-servers: x.xxx.xxx.xxx:9092
# 消费者配置
consumer:
# 消费者分组的id,可以在 kafka 的 config 目录下的 consumer.properties 配置
group-id: test-consumer-group
# 是否自动提交消费者的偏移量
enable-auto-commit: true
# 自动提交的频率
auto-commit-interval: 3000
5.3测试使用
生产者
package com.blog.po;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.kafka.core.KafkaTemplate;
import org.springframework.stereotype.Component;
/**
* 生产者
*/
@Component
public class KafkaProducer {
@Autowired
private KafkaTemplate kafkaTemplate;// 注入kafkaTemplate
/**
* 发送消息
*
* @param topic 消息主题
* @param content 消息内容
*/
public void sendMessage(String topic, String content){
kafkaTemplate.send(topic, content);
}
}
消费者
package com.blog.po;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.springframework.kafka.annotation.KafkaListener;
import org.springframework.stereotype.Component;
/**
* 消费者
*/
@Component
public class KafkaConsumer {
/**
* 消费者订阅的主题为test
* 就是通过 @KafkaListener(topics = {"test"}) 注解实现的
*
* @param record 接收的消息被封装成 ConsumerRecord 对象
*/
@KafkaListener(topics = {"test"})
public void handleMessage(ConsumerRecord record){
System.out.println(record.value());
}
}
测试
特别特别注意 很坑
踩坑:连远程Kafka报错UnknownHostException
解决问题: https://blog.youkuaiyun.com/chang_harry/article/details/103501369
package com.blog;
import com.blog.po.KafkaProducer;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
public class KafkaTests {
@Autowired
private KafkaProducer kafkaProducer;// 注入生产者kafkaProducer
@Test
public void testKafka(){
// 生产者发送消息
kafkaProducer.sendMessage("test","吖屎啦,梁非凡");
kafkaProducer.sendMessage("test","学习使我忘了夜宵");
// 进行下线程阻塞,模仿消费者消费消息的过程
try {
Thread.sleep(1000 * 3);// 10s
} catch (InterruptedException e){
e.printStackTrace();
}
}
}
结果: