Linux搭建单机版Kafka+EFAK

305 阅读4分钟

kafka概述

kafka是一个分布式流处理平台

  • Kafka作为一个集群,运行在一台或者多台服务器上.
  • Kafka 通过 topic 对存储的流数据进行分类。
  • 每条记录中包含一个key,一个value和一个timestamp(时间戳)。

流处理平台有以下三个特性:

  1. 可以让你发布和订阅流式的记录。这一方面与消息队列或者企业消息系统类似。
  2. 可以储存流式的记录,并且有较好的容错性。
  3. 可以在流式记录产生时就进行处理。

Kafka有四个核心的API:

  • The Producer API 允许一个应用程序发布一串流式的数据到一个或者多个Kafka topic。
  • The Consumer API 允许一个应用程序订阅一个或多个 topic ,并且对发布给他们的流式数据进行处理。
  • The Streams API 允许一个应用程序作为一个流处理器,消费一个或者多个topic产生的输入流,然后生产一个输出流到一个或多个topic中去,在输入输出流中进行有效的转换。
  • The Connector API 允许构建并运行可重用的生产者或者消费者,将Kafka topics连接到已存在的应用程序或者数据系统。比如,连接到一个关系型数据库,捕捉表(table)的所有变更内容。

那么kafka使用的场景有哪些??

它可以用于两大类别的应用:

  1. 构造实时流数据管道,它可以在系统或应用之间可靠地获取数据。 (相当于message queue)
  2. 构建实时流式应用程序,对这些流数据进行转换或者影响。 (就是流处理,通过kafka stream topic和topic之间内部进行变化)

Kafka下载安装

传送门

上传并解压到Linux的指定文件目录下:

解压命令:tar -zxvf kafka_2.11-1.0.0.tar.gz

image-20230410160730776

解压完之后新建文件夹:kafka_logs用来存放kafka运行日志

image-20230410161638258

接下来修改 /etc/profile环境配置文件

#kafka配置
export KAFKA_HOME=/home/projectTool/kafka_2.11-1.0.0
export PATH=${KAFKA_HOME}/bin:$PATH
​
然后退出并保存配置文件
使用 source /etc/profile 进行刷新环境变量
​

打开解压目录下的/config文件夹中的server.properties文件

进行以下配置修改:

#本地所有IP监听端口号:8099
listeners=PLAINTEXT://0.0.0.0:8099
#对外开放IP:端口号
advertised.listeners=PLAINTEXT://1.15.240.215:8099
#设置端口号
port=8099
#这个配置的是kafka日志文件路径
log.dirs=/home/projectTool/Kafka_logs
#配置Zookeeper的运行IP:端口,进行连接
zookeeper.connect=localhost:2181
#Zookeeper超时连接等待的秒数
zookeeper.connection.timeout.ms=6000
#启用删除topic的功能,默认为true
delete.topic.enable=true

启动kafka

注意要先运行Zookeeper

启动命令:守护进程启动

kafka-server-start.sh -daemon  /home/projectTool/kafka_2.11-1.0.0/config/server.properties &

输入命令jps 查看kafka进程

image-20230410165839731

安装Kafka-eagle 可视化

传送门

上传解压到指定文件夹:

image-20230411084705523

然后继续解压

image-20230411084735164

打开解压的目录中的system-config.properties

efak.zk.cluster.alias=cluster1
#配置你的kafka集群(ip:端口),多个地址ip用逗号隔开
cluster1.zk.list=xxx.xxx.xxx.xxx:2181
#cluster2.zk.list=xdn10:2181,xdn11:2181,xdn12:2181
######################################
# zookeeper enable acl
######################################
cluster1.zk.acl.enable=false
cluster1.zk.acl.schema=digest
cluster1.zk.acl.username=test
cluster1.zk.acl.password=test123
######################################
# broker size online list broker在线数量
######################################
cluster1.efak.broker.size=20
######################################
# zk client thread limit Zookeeper 客户端线程限制
######################################
kafka.zk.limit.size=16
######################################
# EFAK webui port 可视化页面端口
######################################
efak.webui.port=8048
######################################
# EFAK enable distributed
######################################
efak.distributed.enable=false
efak.cluster.mode.status=master
######################################
# EFAK 主节点地址和端口
######################################
efak.worknode.master.host=1.15.240.215
efak.worknode.port=8085
######################################
# kafka jmx acl and ssl authenticate
#jmx acl 和SSL认证
######################################
cluster1.efak.jmx.acl=false
cluster1.efak.jmx.user=keadmin
cluster1.efak.jmx.password=keadmin123
cluster1.efak.jmx.ssl=false
cluster1.efak.jmx.truststore.location=/data/ssl/certificates/kafka.truststore
cluster1.efak.jmx.truststore.password=ke123456
​
######################################
# kafka offset storage
# kafka偏移存贮设置
######################################
cluster1.efak.offset.storage=kafka
cluster2.efak.offset.storage=zk
​
######################################
# kafka jmx uri
######################################
cluster1.efak.jmx.uri=service:jmx:rmi:///jndi/rmi://%s/jmxrmi
​
######################################
# kafka metrics, 15 days by default
# kafka 数据,默认15天
######################################
efak.metrics.charts=true
efak.metrics.retain=15######################################
# kafka sql topic records max
# kafka SQL主题记录限制
######################################
efak.sql.topic.records.max=5000
efak.sql.topic.preview.records.max=10######################################
# delete kafka topic token
#删除主题的token码
######################################
efak.topic.token=keadmin
​
######################################
# kafka sasl authenticate
# Kafka sasl身份验证
######################################
cluster1.efak.sasl.enable=false
cluster1.efak.sasl.protocol=SASL_PLAINTEXT
cluster1.efak.sasl.mechanism=SCRAM-SHA-256
cluster1.efak.sasl.jaas.config=org.apache.kafka.common.security.scram.ScramLoginModule required username="kafka" password="kafka-eagle";
cluster1.efak.sasl.client.id=
cluster1.efak.blacklist.topics=
cluster1.efak.sasl.cgroup.enable=false
cluster1.efak.sasl.cgroup.topics=
cluster2.efak.sasl.enable=false
cluster2.efak.sasl.protocol=SASL_PLAINTEXT
cluster2.efak.sasl.mechanism=PLAIN
cluster2.efak.sasl.jaas.config=org.apache.kafka.common.security.plain.PlainLoginModule required username="kafka" password="kafka-eagle";
cluster2.efak.sasl.client.id=
cluster2.efak.blacklist.topics=
cluster2.efak.sasl.cgroup.enable=false
cluster2.efak.sasl.cgroup.topics=
​
######################################
# kafka ssl authenticate
# Kafka ssl 身份验证
######################################
cluster3.efak.ssl.enable=false
cluster3.efak.ssl.protocol=SSL
cluster3.efak.ssl.truststore.location=
cluster3.efak.ssl.truststore.password=
cluster3.efak.ssl.keystore.location=
cluster3.efak.ssl.keystore.password=
cluster3.efak.ssl.key.password=
cluster3.efak.ssl.endpoint.identification.algorithm=https
cluster3.efak.blacklist.topics=
cluster3.efak.ssl.cgroup.enable=false
cluster3.efak.ssl.cgroup.topics=
​
######################################
# kafka sqlite jdbc driver address
# kafka sqlite 数据库配置
######################################
#efak.driver=org.sqlite.JDBC
#efak.url=jdbc:sqlite:/hadoop/kafka-eagle/db/ke.db
#efak.username=root
#efak.password=www.kafka-eagle.org######################################
# kafka mysql jdbc driver address
# kafka mysql 数据库配置
######################################
efak.driver=com.mysql.cj.jdbc.Driver
efak.url=jdbc:mysql://127.0.0.1:3306/ke?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
efak.username=ke
efak.password=123456

配置完可视化的配置文件后,再去修改环境配置:

vim /etc/profile

将下面的添加到文件的末尾

export KE_HOME=/home/projectTool/kafka-eagle-bin-3.0.1/efak-web-3.0.1
export PATH=${KE_HOME}/bin:$PATH

保存退出,刷新配置

source /etc/profile

启动EFAK:

cd /***/kafka-eagle/bin

 ./ke.sh start

 ./ke.sh status

正常启动代码:

image-20230411091158017

下面就是打开可视化页面

image-20230411091359317

image-20230411091343279

Spring Boot集成Kafka

1、引入依赖:

<!-- kafkfa -->
        <dependency>
            <groupId>org.springframework.kafka</groupId>
            <artifactId>spring-kafka</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.kafka</groupId>
                    <artifactId>kafka-clients</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.kafka</groupId>
            <artifactId>kafka-clients</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.75</version>
        </dependency>

2、 application.yml 配置

# 应用服务 WEB 访问端口
server:
  port: 21011
spring:
  application:
    name: mp-controller-center
  profiles:
    active: prod
  kafka:
  #填写kafka配置文件里的对外开放IP:端口号
    bootstrap-servers: 1.15.240.215:8099
    #生产者
    producer:
      retries: 10
      key-serializer: org.apache.kafka.common.serialization.StringSerializer
      value-serializer: org.apache.kafka.common.serialization.StringSerializer
     # 消费者
    consumer:
      group-id: ${spring.application.name}-test
      key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
      value-deserializer: org.apache.kafka.common.serialization.StringDeserializer

3、代码编写

@Autowired
//kafka 数据模板是以键值对形式存储的
    private KafkaTemplate<String,String> kafkaTemplate;

    @GetMapping("/hello")
    public String hello(){
        //建立主题为rc-topic的值
        kafkaTemplate.send("rc-topic","测试");
        return "ok";
    }

    @ApiOperation("获取所有角色")
    @GetMapping("/getAllRoles")
    public List<JokerRole> getAllRoles() {
        logger.info("success");
        List<JokerRole> list = jokerRoleService.getAllRoles();
        //建立主题为AllRoles的值
        kafkaTemplate.send("AllRoles", list.toString());
        return list;
    }
//kafka监听key为rc-topic的值
@KafkaListener(topics = "rc-topic")
    public void onMessage(String message){
        if(!StringUtils.isEmpty(message)){
            System.out.println(message);
        }
    }

可视化页面数据:

image-20230411094047555

image-20230411094128511

image-20230411094142551

这是所有主题列表

image-20230411094238539

这是rc-topic数据测试

image-20230411094402891

这是AllRoles测试数据

image-20230411094528025

注:程序创建topic时报错could not be established. Broker may not be available

解决办法就是kafka的配置文件修改

#本地所有IP监听端口号:8099
listeners=PLAINTEXT://0.0.0.0:8099
#对外开放IP:端口号
advertised.listeners=PLAINTEXT://1.15.240.215:8099

至此,单机版的kafka的搭建结束