搭建Kafka源码环境并测试

news2024/11/16 9:44:17

文章目录

  • 一、前言
  • 二、环境准备
  • 三、环境搭建
    • 3.1 JDK 环境搭建
    • 3.2 Scala 环境搭建
      • 3.2.1 配置 Scala 环境变量
      • 3.2.2 验证
    • 3.3 Gradle 环境搭建
      • 3.3.1 配置 Gradle 环境变量
      • 3.3.2 验证
    • 3.4 Zookeeper 环境搭建
      • 3.4.1 配置 Zookeeper 环境变量
      • 3.4.2 验证
    • 3.5 Kafka 源码搭建
      • 3.5.1 导入 Kafka 源码至 IDEA
      • 3.5.2 修改 build.gradle 配置
  • 四、源码代码结构
  • 五、核心 Core 目录代码结构
  • 六、源码部署验证
    • 6.1 core.main 下新建日志配置类
    • 6.2 修改 server.properties
    • 6.3 配置 Run Configurations
    • 6.4 发送、消费 message

一、前言

参考的博客是用的是 Kafka 2.7 版本的,于是我这里也采用 2.7 版本,理由是这个版本还保存着 zookeeper,生产环境比较稳定

二、环境准备

  • JDK:1.8.0_241
  • Scala:2.12.8
  • Gradle:6.6
  • Zookeeper:3.4.14

三、环境搭建

3.1 JDK 环境搭建

直接使用本地环境

3.2 Scala 环境搭建

下载链接:Scala 2.12.8 | The Scala Programming Language (scala-lang.org)

3.2.1 配置 Scala 环境变量

vim ~/.bash_profile

# 安装的路径
export SCALA_HOME=/Users/gabriel/Environment/scala-2.12.8
export PATH=$PATH:$SCALA_HOME/bin

source ~/.bash_profile

3.2.2 验证

输入 scala -version 看到提示则成功

3.3 Gradle 环境搭建

下载链接:Gradle Distributions

下载版本为 gradle-6.6-bin

3.3.1 配置 Gradle 环境变量

vim ~/.bash_profile

# 安装的路径
export GRADLE_HOME=/Users/gabriel/Environment/gradle-6.6
export PATH=$PATH:$GRADLE_HOME/bin

source ~/.bash_profile

3.3.2 验证

输入 gradle -version 看到提示则成功

3.4 Zookeeper 环境搭建

下载链接:Index of /dist/zookeeper/zookeeper-3.4.14 (apache.org)

3.4.1 配置 Zookeeper 环境变量

vim ~/.bash_profile

# 安装的路径
export ZK_HOME=/Users/gabriel/Environment/zookeeper-3.4.14
export PATH=$PATH:$ZK_HOME/bin

source ~/.bash_profile  

创建 data 文件夹用于存放日志数据,并在 cfg 文件中指定

cd zookeeper-3.4.14
mkdir data

cd conf
mv zoo_sample.cfg zoo.cfg
# 修改 zoo.cfg 内的配置
dataDir=/Users/gabriel/Environment/zookeeper-3.4.14/data

3.4.2 验证

sh zkServer.sh start

输出提示则成功

3.5 Kafka 源码搭建

下载链接:Apache Kafka

这里选择了 2.7.0 版本

3.5.1 导入 Kafka 源码至 IDEA

Setting 里面需要配置 Gradle Home 为本地地址 /Users/gabriel/Environment/gradle-6.6

3.5.2 修改 build.gradle 配置

这里是我第一次使用 gradle 构建项目,基本原理和 maven 差不多,刚好学习一下

需要把镜像文件下载服务器更换为国内的私服,否则会相当慢,直接导致 “time out” 报错。

进入 kafka 源码包,修改 build.gradle 文件,在原来配置上,添加 ali 私服配置。

buildscript {
    repositories {
      maven {
        url 'https://maven.aliyun.com/nexus/content/groups/public/'
      }
      maven {
        url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'
      }
      // 插件下载地址
      maven {
        url 'https://maven.aliyun.com/repository/gradle-plugin'
      }
  }
}
 
allprojects {
    repositories {
      maven {
        url 'https://maven.aliyun.com/nexus/content/groups/public/'
      }
      maven {
        url 'https://maven.aliyun.com/nexus/content/repositories/jcenter'
      }
      // 插件下载地址
      maven {
        url 'https://maven.aliyun.com/repository/gradle-plugin'
      }
  }
}

Bug 1:

疯狂报错如下,好像是 gradle 的插件找不到,从对应的阿里云地址也下载不下来

解决方案:在上面配置 maven 下载地址的地方加上专门的插件下载地址

A problem occurred configuring root project 'kafka-2.7.0-src'.
> Could not resolve all artifacts for configuration ':classpath'.
   > Could not find gradle.plugin.com.github.spotbugs.snom:spotbugs-gradle-plugin:4.4.4.
     Searched in the following locations:
       - https://maven.aliyun.com/nexus/content/groups/public/gradle/plugin/com/github/spotbugs/snom/spotbugs-gradle-plugin/4.4.4/spotbugs-gradle-plugin-4.4.4.pom
       - https://maven.aliyun.com/nexus/content/repositories/jcenter/gradle/plugin/com/github/spotbugs/snom/spotbugs-gradle-plugin/4.4.4/spotbugs-gradle-plugin-4.4.4.pom
       - https://dl.bintray.com/content/netflixoss/external-gradle-plugins/gradle/plugin/com/github/spotbugs/snom/spotbugs-gradle-plugin/4.4.4/spotbugs-gradle-plugin-4.4.4.pom
     Required by:
         project :
   > Could not find org.gradle:test-retry-gradle-plugin:1.1.6.
     Searched in the following locations:
       - https://maven.aliyun.com/nexus/content/groups/public/org/gradle/test-retry-gradle-plugin/1.1.6/test-retry-gradle-plugin-1.1.6.pom
       - https://maven.aliyun.com/nexus/content/repositories/jcenter/org/gradle/test-retry-gradle-plugin/1.1.6/test-retry-gradle-plugin-1.1.6.pom
       - https://dl.bintray.com/content/netflixoss/external-gradle-plugins/org/gradle/test-retry-gradle-plugin/1.1.6/test-retry-gradle-plugin-1.1.6.pom
     Required by:
         project :

Possible solution:
 - Declare repository providing the artifact, see the documentation at https://docs.gradle.org/current/userguide/declaring_repositories.html

然后直接点右上角的小图标下载依赖

依赖下载完以后需要编译源代码(源代码中可以看到编译的 build 目录),这样子后面部署 kafka.Kafka 启动类然后使用脚本创建 producer、consumer 的时候,才能成功。手动输入命令如下:

./gradlew clean build -x test

或者直接右侧 gradle build,不过其中需要经过很多 test 测试,上面手动跳过

四、源码代码结构

在这里插入图片描述

重点看下其中几个重要的模块:

  • bin 目录:保存 Kafka 工具脚本,包括 kafka-server-start 和 kafka-console-producer 等脚本都存放在这里

  • clients 目录:保存 Kafka 客户端代码,比如生产者和消费者的代码都在该目录下(对于 Kafka 而言都是客户端)

  • config 目录:保存 Kafka 的配置文件,其中比较重要的配置文件是 server.properties

  • connect 目录:保存 Connect 组件的源代码。 Kafka Connect 组件是用来实现 Kafka 与外部系统之间的实时数据传输的。

  • core 目录:保存 Broker 端代码。Kafka 服务器端代码全部保存在该目录下(这对于 Kafka 而言是服务端)

  • generator 目录:Kafka 消息类处理模块,主要是根据 clients 模块下的 message json 文件生成对应的 java 类,在 build.gradle 文件中,可以看到定义了一个任务 processMessages

  • raft 目录:raft 一致性协议相关。

五、核心 Core 目录代码结构

在这里插入图片描述

  • admin 包:执行管理命令的功能;
  • api 包:封装请求和响应 DTO 对象;
  • cluster 包:集群对象,例如 Partition 类代表一个分区,Replica 类代表一个分区副本;
  • common 包:通用类,比如异常类
  • consumer 包:只有一个类 BaseConsumerRecord,后面会丢弃该包,用 clients 包下 org.apache.kafka.clients.consumer.ConsumerRecord 代替;
  • controller 包: 和 kafkaController(kc)相关的类,重点模块,一个kafka集群只有一个leader kafkaController,该kafkaController负责分区管理,副本管理,并保证集群信息在集群中同步;
  • coordinator 包:保存了消费者端的 GroupCoordinator 代码和用于事务的 TransactionCoordinator 代码。对 coordinator 包进行分析,特别是对消费者端的 GroupCoordinator 代码进行分析,是 Broker 端协调者组件设计原理的关键;
  • log 包:保存了 Kafka 最核心的日志结构代码,包括日志、日志段、索引文件等, 另外,该包下还封装了 Log Compaction 的实现机制,是非常重要的源码包;
  • network 包:封装了 Kafka 服务器端网络层的代码,特别是 SocketServer.scala 这个文件,是 Kafka 实现 Reactor 模式的具体操作类,非常值得一读;
  • server 包:顾名思义,它是 Kafka 的服务器端主代码,里面的类非常多,很多关键的 Kafka 组件都存放在这里,比如状态机、Purgatory 延时机制等;
  • tools 包:工具类。

六、源码部署验证

最终其实就是在第三章编译完 kafka 所有文件的基础上,要启动 core 目录下和 broker 相关的类,启动类就是 kafka-2.7.0-src/core/src/main/scala/kafka/Kafka.scala

6.1 core.main 下新建日志配置类

在 core/main 下新建 resources 目录,再将 config/log4j.properties 拷贝到该目录下
在这里插入图片描述

这是为了避免启动报错“SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder””

6.2 修改 server.properties

修改 server.properties 中的 log.dirs 值,变为本地目录,

/Users/gabriel/Desktop/DiveinCode/kafka-2.7.0-src 下新建 kafka-logs 目录,修改配置如下

log.dirs=/Users/gabriel/Desktop/DiveinCode/kafka-2.7.0-src/kafka-logs

6.3 配置 Run Configurations

在这里插入图片描述

6.4 发送、消费 message

上面已经搭建好 Kafka Broker 的部署环境,并且编译成功了所有和 producer、consumer 有关的文件类,现在使用 Kafka 自带的脚本工具测试 producer 和 consumer

整体流程如下:

  1. 创建 topic

    进入 kafka-2.7.0-src/bin 通过 kafka-topics.sh 命令来创建一个名为 topicjxz 的 topic(前提代码已经 build 编译完),zookeeper 的地址我是先通过 sh zkServer.sh start 启动,然后 zkCli 启动客户端找到的:

    sh kafka-topics.sh --zookeeper localhost:2181 --create --topic topicjxz --replication-factor 1 --partitions 1
    

在这里插入图片描述

  1. 通过 kafka-console-consumer.sh 命令启动一个命令行的 consumer 来消费 topicjxz 这个 topic
sh kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic topicjxz

在这里插入图片描述

  1. 重新启动一个命令行终端,通过 kafka-console-producer.sh 命令启动一个命令行的 producer 向 topicjxz 这个 topic 中生产数据
sh kafka-console-producer.sh --bootstrap-server localhost:9092 --topic topicjxz

在这里插入图片描述
在这里插入图片描述

至此,我们发现已经将整个 producer、broker、consumer 的链路部署起来并测试成功了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1638015.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

44. UE5 RPG 初始化敌人的属性

在正常的游戏中,我们应该考虑如何去初始化角色属性,并且要给角色分好类型。比如,在我们游戏中,我们如何去初始化小兵的属性,并且还要实现小兵随着等级的增长而增加属性。而且就是小兵也有类型的区分,比如我…

使用qemu调试NVME driver

参考nvme驱动相关的博客,可以使用qemu buildroot进行nvme驱动的流程debug。 一、QEMU编译 首先需要编译qemu,可以参考QEMU编译。wget下载最新版本的QEMU,编译之前,最好检查下依赖包是否安装,避免安装过程出现各种错…

c++容器与算法概述

容器与算法 每个标准库容器都提供了begin() end() 函数&#xff0c;分别返回容器的头部位置和尾部位置。 I/O 流 对于自定义的类型&#xff1a; struct Entry {std::string name;int number;};如果需要使用标准输出需要重载<< 运算符&#xff0c;特别注意&#xff1a…

环形链表的经典问题

环形链表 环形链表的介绍链表中是否带环返回链表开始入环的第一个节点 本文主要介绍如何判断一个链表是否是环形链表&#xff0c;以及如何得到环形链表中的第一个节点。 环形链表的介绍 环形链表是一种链表数据结构&#xff0c;环形链表是某个节点的next指针指向前面的节点或指…

微软如何打造数字零售力航母系列科普05 - Azure中计算机视觉的视觉指南

Azure中计算机视觉的视觉指南 什么是计算机视觉&#xff1f;如何使用Microsoft Azure将计算机视觉功能集成到应用程序和工作流中&#xff1f; 作者&#xff1a;Nitya Narasimhan 编辑&#xff1a;数字化营销工兵 •11分钟阅读 什么是计算机视觉&#xff1f;如何使用Microso…

在树莓派安装 rpi-imager

步骤 安装 sudo apt install rpi-imager 我没有更新镜像源&#xff0c; 但是能安装完&#xff0c; 只是花的时间旧点。 烧写镜像 因为我是没有桌面的树莓派系统&#xff0c; 所以我这里执行的指令是不需要显示图形化界面的 man rpi-imager ## man指令查看说明 查看帮助手…

综合性练习(后端代码练习4)——图书管理系统

目录 一、准备工作 二、约定前后端交互接口 1、需求分析 2、接口定义 &#xff08;1&#xff09;登录接口 &#xff08;2&#xff09;图书列表接口 三、服务器代码 &#xff08;1&#xff09;创建一个UserController类&#xff0c;实现登录验证接口 &#xff…

服务运营 | 精选:用药难?用药贵?运筹学与统计学视角下的药物研发与管理

作者设计了一个多阶段博弈论模型来针对罕见病的不同补贴方案&#xff0c;分析政府、联盟、制药商和患者之间的相互作用。 制药商补贴为 α C \alpha C αC&#xff0c;其中 C C C是研发成本&#xff0c; α ∈ [ 0 , 1 ) \alpha \in [0,1) α∈[0,1)是政府总成本的比例。患者补…

vue3 依赖-组件tablepage-vue3 项目公共配置封装

github求⭐ 可通过github 地址和npm 地址查看全部内容 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例-汇总 vue3 依赖-组件tablepage-vue3说明文档&#xff0c;列表页快速开发&#xff0c;使用思路及范例&#xff08;Ⅰ&#…

模型智能体开发之metagpt-多智能体实践

参考&#xff1a; metagpt环境配置参考模型智能体开发之metagpt-单智能体实践 需求分析 之前有过单智能体的测试case&#xff0c;但是现实生活场景是很复杂的&#xff0c;所以单智能体远远不能满足我们的诉求&#xff0c;所以仍然还需要了解多智能体的实现。通过多个role对动…

Android11适配

一、分区存储 1.背景 Android 11 进一步增强了平台功能&#xff0c;为外部存储设备上的应用和用户数据提供了更好的保护。作为这项工作的一部分&#xff0c;平台引入了进一步的改进&#xff0c;以简化向分区存储的转换。 为了让用户更好地控制自己的文件&#xff0c;保护用户…

【华为】华为防火墙双机热备

【华为】华为防火墙双机热备 实验需求实验拓扑配置FW5-M前骤单臂路由和VRRP划分防火墙基本区域部署HRP&#xff08;华为心跳协议&#xff09; FW6-B前骤单臂路由和VRRP划分防火墙基本区域部署HRP&#xff08;华为心跳协议&#xff09; LSW2PC NATSNAT &#xff1a;Easy IPDNAT&…

汽车车灯的材料是什么?汽车车灯的灯罩如果破损破裂破洞了要怎么修复?

汽车车灯的材料主要包括灯罩和灯底座两部分&#xff0c;它们所使用的材料各不相同。 车灯罩的材料主要是透明且具有良好耐热性和耐紫外线性能的塑料。其中&#xff0c;聚碳酸酯&#xff08;PC&#xff09;是一种常用的材料&#xff0c;它具有高抗冲击性、耐化学品腐蚀和优良的…

redis核心数据结构——跳表项目设计与实现(跳表结构介绍,节点类设计,随机层级函数)

跳表结构介绍。跳表是redis等知名软件的核心数据结构&#xff0c;其实现的前提是有序链表&#xff0c;思想的本质是在原有一串存储数据的链表中&#xff0c;间隔地抽出一半元素作为上一级链表&#xff0c;并将抽提出的元素和原先的位置相关联&#xff0c;这样重复下去直到最上层…

使用 Python 和 OpenCV 进行实时目标检测的详解

使用到的模型文件我已经上传了&#xff0c;但是不知道能否通过审核&#xff0c;无法通过审核的话&#xff0c;就只能 靠大家自己发挥实力了&#xff0c;^_^ 目录 简介 代码介绍 代码拆解讲解 1.首先&#xff0c;让我们导入需要用到的库&#xff1a; 2.然后&#xff0c;设…

【数据结构-之八大排序(下),冒泡排序,快速排序,挖坑法,归并排序】

&#x1f308;个人主页&#xff1a;努力学编程’ ⛅个人推荐&#xff1a;基于java提供的ArrayList实现的扑克牌游戏 |C贪吃蛇详解 ⚡学好数据结构&#xff0c;刷题刻不容缓&#xff1a;点击一起刷题 &#x1f319;心灵鸡汤&#xff1a;总有人要赢&#xff0c;为什么不能是我呢 …

【MySQL | 第九篇】重新认识MySQL锁

文章目录 9.重新认识MySQL锁9.1MySQL锁概述9.2锁分类9.2.1锁的粒度9.2.2锁的区间9.2.3锁的性能9.2.4锁的级别 9.3拓展&#xff1a;意向锁9.3.1意向锁概述9.3.2意向锁分类9.3.3意向锁作用&#xff08;1&#xff09;意向锁的兼容互斥性&#xff08;2&#xff09;例子1&#xff08…

Springboot+vue+小程序+基于微信小程序的在线学习平台

一、项目介绍    基于Spring BootVue小程序的在线学习平台从实际情况出发&#xff0c;结合当前年轻人的学习环境喜好来开发。基于Spring BootVue小程序的在线学习平台在语言上使用Java语言进行开发&#xff0c;在数据库存储方面使用的MySQL数据库&#xff0c;开发工具是IDEA。…

主成分分析在R语言中的简单应用:使用mvstats包

在数据科学领域&#xff0c;主成分分析&#xff08;PCA&#xff09;是一种广泛使用的技术&#xff0c;主要用于数据降维和探索性数据分析。PCA可以帮助我们发现数据中的模式&#xff0c;减少数据集的复杂性&#xff0c;同时保持数据中最重要的特征。本文将介绍如何在R语言中使用…

STM32定时器中的编码器接口详解

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 文章目录 1. 编码器接口简介 2. 旋转编码器简介 3. 正交编码器工作模式 4. 基本结构 5. 编码器工作模式示例 6. 代码示例 6.1 Encoder.c 6.2 Encoder.h 6.3 main.c 1. 编码器接口简介 在STM32中&#xf…