Zookeeper(四)源码解析

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
全局流量管理 GTM,标准版 1个月
简介: Zookeeper(四)源码解析

源码构建

源码地址:https://github.com/apache/zookeeper

  1. 使用git clone 源码
  2. 选择分支,我这里选择的是3.5.5分支

源码结构如图:

源码结构.png

  • zookeeper-recipes: 示例源码
  • zookeeper-client: C语言客户端
  • zookeeper-server:主体源码
  1. 刚打开时会发现缺少一大堆的类,根据README.md文件中的说明,我们首先需要先在根目录maven clean + install一次

如果出现类似由于java-doc生成文档失败导致install失败的话,可以将pom.xml文件中的doc项目类插件注释掉重新install

  1. 此时我们所需要的类就会生成到各个项目的target中,但是还是会少一个类org.apache.zookeeper.version.Info
    在包路径下新增类,发布版本时用的,对我们来说没啥用
package org.apache.zookeeper.version;
public interface Info {
    int MAJOR=3;
    int MINOR=5;
    int MICRO=5;
    String QUALIFIER=null;
    int REVISION=-1; //TODO: remove as related to SVN VCS
    String REVISION_HASH="390fe37ea45dee01bf87dc1c042b5e3dcce88653";
    String BUILD_DATE="08/27/2020 03:28 GMT";
}
  1. 打开bin目录下的脚本文件,找到启动类,分别为
  • 客户端:org.apache.zookeeper.ZooKeeperMain
  • 服务端:
  • 单机启动:org.apache.zookeeper.server.ZooKeeperServerMain
  • 集群启动:org.apache.zookeeper.server.quorum.QuorumPeerMain
  1. 此时启动是起不起来的,会报缺少配置文件的错,conf文件下编写配置文件
  • zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=data
clientPort=2181

这里可能会出现找不到类的一些错误,需要将pom文件中相关依赖的scope为provided的改为compile,也可以直接注释,因为默认就是compile

  1. 配置服务启动类的arg参数,Program arguments中填写配置文件的绝对路径,如:D:\zookeeper\conf\zoo.cfg
  2. 启动单机Zookeeper服务端
  3. 接下来尝试启动集群模式的Zookeeper,同样需要编写三份zoo.cfg,并且在数据卷路径下编写myid文件

    集群配置.png
  4. 将配置文件地址配到Program arguments栏中,启动QuorumPeerMain
  5. 启动客户端,客户端默认连接本机2181端口号,在参数栏中指定 server ip:port 可指定连接地址

源码解析

  • 加载配置
  • 开启清理旧日志线程
  • 初始化对外服务(NIO 或 Netty)
  • 初始化会话管理
  • 将日志和快照文件的数据加载到内存中
  • 启动NIO|Netty
  • 开始选举

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
19天前
|
缓存 Java 程序员
Map - LinkedHashSet&Map源码解析
Map - LinkedHashSet&Map源码解析
39 0
|
19天前
|
算法 Java 容器
Map - HashSet & HashMap 源码解析
Map - HashSet & HashMap 源码解析
29 0
|
19天前
|
存储 Java C++
Collection-PriorityQueue源码解析
Collection-PriorityQueue源码解析
33 0
|
19天前
|
安全 Java 程序员
Collection-Stack&Queue源码解析
Collection-Stack&Queue源码解析
44 0
|
17天前
|
存储
让星星⭐月亮告诉你,HashMap的put方法源码解析及其中两种会触发扩容的场景(足够详尽,有问题欢迎指正~)
`HashMap`的`put`方法通过调用`putVal`实现,主要涉及两个场景下的扩容操作:1. 初始化时,链表数组的初始容量设为16,阈值设为12;2. 当存储的元素个数超过阈值时,链表数组的容量和阈值均翻倍。`putVal`方法处理键值对的插入,包括链表和红黑树的转换,确保高效的数据存取。
39 5
|
18天前
|
Java Spring
Spring底层架构源码解析(三)
Spring底层架构源码解析(三)
|
18天前
|
XML Java 数据格式
Spring底层架构源码解析(二)
Spring底层架构源码解析(二)
|
19天前
|
算法 Java 程序员
Map - TreeSet & TreeMap 源码解析
Map - TreeSet & TreeMap 源码解析
29 0
|
19天前
|
Java 容器
Collection-LinkedList源码解析
Collection-LinkedList源码解析
11 0
|
19天前
|
存储 Java 编译器
Collection-ArrayList源码解析
Collection-ArrayList源码解析
13 0

推荐镜像

更多