Zookeeper是开源的,如果想多了解Zookeeper或看它的源码,最好是能找到它的源码并在 IDE 里启动,可以debug看它咋执行的,能够帮助你理解其原理。

准备源码

所以我们很容易搞到它的源码,例如我们从GitHub上获取源码 或 从Apache官网获取可运行版本的压缩包(内含源码)。这里我下载的是3.4.13版本的,从GitHub拉取源码在idea运行时,编译不能通过,缺少类,原因是有些类需要data包下的类,但是没有这个data包,所以编译过不了,也就无法测试。

 
所以选择第二种,下载到 zookeeper-3.4.13.tar.gz 然后解压,和从GitHub上下载的还是有些差别的。
 

导入到IDE

然后将下载好的源码导入到idea。需创建resources目录把 conf 目录下的 log4j.properties 复制到该目录下,否则启动异常报找不到log4j.properties的错。

准备启动

然后我们找到 org.apache.zookeeper.server.quorum.QuorumPeerMain 这个类,这个是 zookeeper 的主入口,当你用脚本启动时其实运行的也是这个类。
 
题外话,看看启动脚本。
 
zkCli.sh脚本文件
 

zkCli.cmd

回来,我们打开这个类会看到有个main方法,看注释,我们需要在启动时指定配置文件。
 
/**
* To start the replicated server specify the configuration file name on
* the command line.要启动复制的服务器,请在命令行上指定配置文件名。
* @param args path to the configfile 配置文件的路径
*/
public static void main(String[] args) {
QuorumPeerMain main = new QuorumPeerMain();
try {
main.initializeAndRun(args);
} //some catchs...
  //some codes ...
     }
LOG.info("Exiting normally");
System.exit(0);
}

配置启动参数

首先运行这个类的main方法,会报错,说非法参数哦,如下

配置一下,在 Program arguments里添加配置文件的路径。

正式启动

再启动就成功了

测试是否启动成功

我们开启客户端连一下

连上了,并且有三个节点。

这段代码是一些初始化,并判断是单机启动还是集群启动

protected void initializeAndRun(String[] args)
throws ConfigException, IOException
{
QuorumPeerConfig config = new QuorumPeerConfig();
if (args.length == ) {
config.parse(args[]);
} // Start and schedule the the purge task
  DatadirCleanupManager purgeMgr = new DatadirCleanupManager(config
    .getDataDir(), config.getDataLogDir(), config
    .getSnapRetainCount(), config.getPurgeInterval());
purgeMgr.start(); if (args.length == 1 && config.servers.size() > ) {
System.out.println("=======集群模式=======");
runFromConfig(config);
} else {
System.out.println("=======单机模式=======");
LOG.warn("Either no config or no quorum defined in config, running "
          + " in standalone mode");
ZooKeeperServerMain.main(args);
}
}


单机版启动,到这里就结束了。篇幅原因,集群版下一篇再见。


转载请注明出处

Zookeeper_阅读源码第一步_在 IDE 里启动 zkServer(单机版)的更多相关文章

  1. Zookeeper_阅读源码第一步_在 IDE 里启动 zkServer(集群版)

    上篇文章Zookeeper_阅读源码第一步_在 IDE 里启动 zkServer(单机版)讲了在 idea 里以单机的方式启动zookeeper,这篇介绍一下以集群的方式启动. 集群方式启动,才会真正 ...

  2. 2018-11-21 手工翻译Vue.js源码第一步:14个文件重命名

    背景 对现有开源项目的代码进行翻译(文件名/命名/注释) · Issue #107 · program-in-chinese/overview 简单地说, 通过翻译源码, 提高项目代码可读性(对于母语 ...

  3. spring源码第一章_获取源码并将源码转为eclipse工程

    1.通过http://gitforwindows.org/下载github 2.通过http://services.gradle.org/distributions/下载gradle:gardle类似 ...

  4. 【转】使用 vim + ctags + cscope + taglist 阅读源码

    原文网址:http://my.oschina.net/u/554995/blog/59927 最近,准备跟学长一起往 linux kernel 的门里瞧瞧里面的世界,虽然我们知道门就在那,但我们还得找 ...

  5. How Tomcat works — 一、怎样阅读源码

    在编程的道路上,通过阅读优秀的代码来提升自己是很好的办法.一直想阅读一些开源项目,可是没有合适的机会开始.最近做项目的时候用到了shiro,需要做集群的session共享,经过查找发现tomcat的s ...

  6. 使用 vim + ctags + cscope + taglist 阅读源码

    转自:http://my.oschina.net/u/554995/blog/59927 最近,准备跟学长一起往 linux kernel 的门里瞧瞧里面的世界,虽然我们知道门就在那,但我们还得找到合 ...

  7. 阅读源码,从ArrayList开始

    前言 为啥要阅读源码?一句话,为了写出更好的程序. 一方面,只有了解了代码的执行过程,我们才能更好的使用别人提供的工具和框架,写出高效的程序.另一方面,一些经典的代码背后蕴藏的思想和技巧很值得学习,通 ...

  8. 阅读源码(IV)

    往期系列: <由阅读源码想到> <由阅读源码想到 | 下篇> <阅读源码(III)> Eric S.Raymond的写于2014年的<How to learn ...

  9. 转载~Linux 平台下阅读源码的工具

    Linux 平台下阅读源码的工具 前言 看源代码是一个程序员必须经历的事情,也是可以提升能力的一个捷径.个人认为: 要完全掌握一个软件的方法只有阅读源码在Windows下有sourceinsight这 ...

随机推荐

  1. eclipse+MyEclipse+WebLogic开发简单的EJB

    转载自http://blog.sina.com.cn/s/blog_678530f60100hxaf.html 说是转载,其实这是我个人在几年前新浪博客上发表的文章. 帮导师搞了一周的EJB,总算初步 ...

  2. sql server编写通用脚本实现获取一年前日期的方法

    问题: 在数据库编程开发中,有时需要获取一年前的日期,以便以此为时间的分界点,查询其前后对应的数据量.例如:1. 想查询截止到一年前当天0点之前的数据量,以及一年前当天0点开始到现在的数据量.2. 想 ...

  3. 0x31 prime distance(质数)

    题目描述: 给定两个整数L和U,你需要在闭区间[L,U]内找到距离最接近的两个相邻质数C1和C2(即C2-C1是最小的),如果存在相同距离的其他相邻质数对,则输出第一对. 同时,你还需要找到距离最远的 ...

  4. Appium+python自动化(二十一)- 让猴子按你指令大闹手机,让你成为耍猴高手 - Monkey(猴子) - MonkeyScript(超详解)

    简介 一年一度的暑假如期而至,每年必不可少的,便是<西游记>这部经典电视连续剧的播出,作为一名90后,对于这部经典剧的情谊,就是观看已成为一种习惯.依然深刻的记得,小时候妈妈为了催促我睡觉 ...

  5. 从后端到前端之Vue(三)小结以及一颗真实的大树

    上一篇写了一下tab,下面整理一下用过的知识点,本想按照官网的文档,整理一下可以更清晰,结果也许是我的方法不对吧,总之更模糊了. 按照官网文档的顺序整理到了表单输入绑定之前,因为之前大致也就只涉及到这 ...

  6. Java 常见面试题整理

    操作系统 说一下线程和进程,它们的区别 同步和异步的区别 阻塞和非阻塞的区别 操作系统中死锁的四个必要条件 mmap和普通文件读写的区别,mmap的注意点 CPU密集型和IO密集型的区别 Linux ...

  7. Java 基础知识面试题

    equals与==有什么区别? (1)==是判断两个变量或实例是不是指向同一个内存空间 (2)equals是判断两个变量或实例所指向的内存空间的值是不是相同 Object有哪些公用方法? (1)equ ...

  8. Django的学习进阶(三)————ORM

    django框架是将数据库信息进行了封装,采取了 类——>数据表 对象——>记录 属性——>字段 通过这种一一对应方式完成了orm的基本映射官方文档:https://docs.dja ...

  9. Python_Day1_人人都爱列表

    列表由一系列按特定顺序排列的元素组成.你可以创建包含字母表中所有字母.数字0~9或 所有家庭成员姓名的列表;也可以将任何东西加入列表中,其中的元素之间可以没有任何关系. 鉴于列表通常包含多个元素,给列 ...

  10. linux初学者-进程篇

    linux初学者-进程篇 不管是windows还是linux,都有进程,那么什么是进程呢?进程就是cpu未完成的工作.下面会介绍一些关于系统中进程的查看以及管理的方法. 1.命令 1.1.命令使用 查 ...