kafka安装配置集群

400 阅读3分钟

一、安装kafka

准备:需提前准备好hadoop集群和并且在集群中配置好zookeeper

1、解压

本次使用的Kafka压缩包版本为:

image.png

将其上传至/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的项目

image.png

image.png

image.png

image.png

2、编写生产者

在项目中创建一个controller包,包中创建ProduceController生产者类

image.png

代码如下

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

image.png

代码如下

#连接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表示发送成功

image.png

此时集群这边也接受到该消息

image.png

以上便是整合springboot,并且使用springboot实现生产者,虚拟机实现消费者

4、使用springboot来实现消费者

创建一个config包,包下创建一个KafkaConsumer类作为消费者的配置类

image.png

代码如下

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中添加消费者需要的配置

image.png

代码如下

#接受消息的时候,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,查看是否成功

image.png

image.png

成功接收到消息,配置成功!