首页 体育 教育 财经 社会 娱乐 军事 国内 科技 互联网 房产 国际 女人 汽车 游戏

3.ZooKeeper源码环境搭建

2020-05-16

在系列的前两篇文章中,介绍了ZooKeeper环境的树立,对创立、删去、修正节点等场景用命令行的方法进行了测验,让咱们对ZooKeeper环境树立及常用命令行有开端的知道,也为树立ZooKeeper的开发环境、出产环境起到了抛砖引玉的作用。也介绍了用Java来完成API的调用,包括节点的增、删、改、查。通过对这两篇的学习,让咱们对ZooKeeper的运用有了开端知道,也可用于完成系列后边华章要介绍的命名服务、集群办理、分布式锁、负载均衡、分布式行列等。

在前两篇中,强调了阅览英文文档的重要性,也带领咱们解读了部分官方文档,想传达出的理念是ZooKeeper没有幻想中的那么难,阅览官方文档也没那么难。后边的华章中,结合官方文档,在实战演练和解读源码的基础上加深了解。

上联:说你行你就行不可也行

下联:说不可就不可行也不可

横批:不服不可

阅览源码就跟这个对联如出一辙,就看你选上联,仍是下联了!

这一篇开端源码环境的树立, here we go !

许多老铁留言说很想研读些github上的开源项目,但代码clone下来后总呈现这样或那样奇奇怪怪的问题,很影响学习的积极性。学习ZooKeeper的源码特别如此,许多人clone代码后,报各种错,提示少各种包。问了下度娘ZooKeeper源码环境,搜出来的文章真的差强人意,有些文章错的居然十分离谱。这儿我从头树立了一遍,也会介绍遇到的一些坑。

许多老铁上来一堆猛操作,从github上下载了ZooKeeper源码后,按惯例方法导入IDEA,最终发现少各种包。起先我也是这样弄的,认为ZooKeeper是用Maven来构建的,细心去了解了下ZooKeeper的版别前史,其实是用的Ant。现在一般用的Maven或Gradle,很少见到Ant的项目了,这儿不对Ant多做介绍。

Ant官网地址: https://ant.apache.org/bindownload.cgi

下载解压后,跟装备jdk相同装备几个环境变量:

//修正为自己本地装置的目录
ANT_HOMT=D:\apache-ant-1.10.7 
PATH=%ANT_HOME%/bin
CLASSPATH=%ANT_HOME%/lib

装备好后,测验下Ant是否装置成功。 ant -version ,得到如下信息则代表装置成功:

Apache Ant version 1.10.7 compiled on September 1 2019

Ant的装置跟JDK的装置和装备十分类似,这儿不做过多介绍。

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

猿人谷在写本篇文章时,releases列表里的最新版别为 release-3.5.6 ,咱们以此版别来进行源码环境的树立。

切换到源码地点目录,运转 ant eclipse 将项目编译并转成eclipse的项目结构。

这个编译进程会比较长,差不多等了7分钟。假如编译成功,会呈现如下成果:

上面现已将项目编译并转成eclipse的项目结构,按eclipse的方法导入项目。

将源码导入IDEA后在 org.apache.zookeeper.Version 中发现许多赤色正告,很明显少了 org.apache.zookeeper.version.Info 类。

查询源码得知是用来发布的时分生成版别用的,咱们仅仅研读源码,又不发布版别所以直接写死就ok了。

即新增Info类:

package org.apache.zookeeper.version;
public interface Info {
 int MAJOR = 3;
 int MINOR = 5;
 int MICRO = 6;
 String QUALIFIER = null;
 String REVISION_HASH = c11b7e26bc554b8523dc929761dd28808913f091 
 String BUILD_DATE = 10/08/2019 20:18 GMT 
}

针对单机版别和集群版别,别离对应两个发动类:

这儿咱们只做单机版的测验。

zoo.cfg里的内容做点修正,便利日志查询。dataDir和dataLogDir依据自己的状况设定。

dataDir=E:\02private\1opensource\zk\zookeeper\dataDir
dataLogDir=E:\02private\1opensource\zk\zookeeper\dataLogDir

运转主类 org.apache.zookeeper.server.ZooKeeperServerMain ,将zoo.cfg的完好途径装备在Program arguments。

运转 ZooKeeperServerMain ,得到的成果如下:

Connected to the target VM, address: '127.0.0.1:0', transport: 'socket'
log4j:WARN No appenders could be found for logger .
log4j:WARN Please initialize the log4j system properly.
log4j:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.

奉告日志无法输出,日志文件装备有误。这儿需求指定日志文件log4j.properties。

在VM options装备,即指定到conf目录下的log4j.properties:

-Dlog4j.configuration=file:E:/02private/1opensource/zk/zookeeper/conf/log4j.properties

装备后从头运转 ZooKeeperServerMain ,输出日志如下,

能够得知单机版发动成功,单机版服务端地址为127.0.0.1:2181。

通过运转 ZooKeeperServerMain 得到的日志,能够得知ZooKeeper服务端现已发动,服务的地址为 127.0.0.1:2181 。发动客户端来进行衔接测验。

客户端的发动类为 org.apache.zookeeper.ZooKeeperMain ,进行如下装备:

即客户端衔接127.0.0.1:2181,获取节点 /yuanrengu 的信息。

下面带领咱们一同看看客户端发动的源码。 这儿要给咱们说下我阅览源码的习气,许多老铁认为阅览源码便是顺着代码看,这样也没啥不对,仅仅许多开源项目代码量惊人,这么个干观点,简单留意力涣散也简单看花眼。我一般是根据某个功用点,从进口开端debug跑一遍,澄清这个功用的“代码线”,就像跑马圈块地儿相同,澄清楚功用有关的代码,了解参数传递的进程,这样看代码时就更有针对性,也能扫除许多搅扰代码。

main里就两行代码,通过debug得知args里包括的信息便是上面咱们装备在 Program arguments 里的信息:

public ZooKeeperMain throws IOException, InterruptedException {
 // 用于解析参数里的命令行的
 cl.parseOptions;
 System.out.println);
 // 用于衔接ZooKeeper服务端
 connectToZK);
 }

通过下图能够看出,解析参数后,就测验衔接127.0.0.1:2181,即ZooKeeper服务端。cl.getOption得到的便是127.0.0.1:2181。

能够很清楚的得知解析args的进程,主要从 -server , -timeout , -r , - 这几个维度来进行解析。

protected void connectToZK throws InterruptedException, IOException {
 // 用于判别现在ZooKeeper衔接是否还有用
 // zk.getState.isAlive 留意这个会话是否有用的判别,客户端与 Zookeeper衔接断开不一定会话失效
 if .isAlive) {
 zk.close;
 // 此刻newHost为127.0.0.1:2181
 host = newHost;
 // 判别是否为只读形式,关于只读形式的概念在前一篇文章中有介绍
 boolean readOnly = cl.getOption != null;
 // 用于判别是否树立安全衔接
 if  != null) {
 System.setProperty), new MyWatcher, readOnly);
 }

ZKClientConfig.SECURE_CLIENT 现已被标示为deprecation了:

/**
 * Setting this to true will enable encrypted client-server communication.
 @SuppressWarnings
 public static final String SECURE_CLIENT = ZooKeeper.SECURE_CLIENT;

debug检查要害点处的信息,能够得知这是树立一个ZooKeeper衔接的进程

下图看看几处要害信息:

Integer.parseInt)为30000。

至此完成了ZooKeeperMain main = new ZooKeeperMain;的整个进程。简略点说便是:

一同来看下run的代码:

void run throws CliException, IOException, InterruptedException {
 // cl.getCommand得到的是 “get”,便是上文传进来的
 if  == null) {
 System.out.println.newInstance;
 Object completor =
 completorC.getConstructor.newInstance;
 Method addCompletor = consoleC.getMethod);
 addCompletor.invoke;
 String line;
 Method readLine = consoleC.getMethod;
 while readLine.invoke)) != null) {
 executeLine;
 } catch  {
 LOG.debug;
 jlinemissing = true;
 } catch  {
 LOG.debug;
 jlinemissing = true;
 } catch  {
 LOG.debug;
 jlinemissing = true;
 } catch  {
 LOG.debug;
 jlinemissing = true;
 } catch  {
 LOG.debug;
 jlinemissing = true;
 if  {
 System.out.println);
 String line;
 while ) != null) {
 executeLine;
 } else {
 // 处理传进来的参数
 processCmd;
 System.exit;
 }

通过下图能够看出 processCmd; 里 cl 包括的信息:

debug到 processCmd 就到了决战时间。里边的 processZKCmd 便是中心了,代码太长,只说下processZKCmd里的要点代码,获取节点/yuanrengu的信息:

由于我之前没有创立过/yuanrengu节点,会抛反常 org.apache.zookeeper.KeeperException$NoNodeException: KeeperErrorCode = NoNode for /yuanrengu , 如下图所示:

通过上面的进程后exitCode为1,履行System.exit;退出。

至此带领咱们dubug了一遍org.apache.zookeeper.ZooKeeperMain,上面我说过,阅览源码干看作用很小,只要debug才干有助于整理流程和思路,也能清楚参数传递的进程发生了什么改变。

上面咱们介绍了源码环境的树立进程,运转运转主类 org.apache.zookeeper.server.ZooKeeperServerMain 发动ZooKeeper服务端,运转 org.apache.zookeeper.ZooKeeperMain 衔接服务端。

每个人操作的方法不相同,有或许遇到的问题也不相同,树立进程中遇到什么问题,咱们能够在谈论区留言。

热门文章

随机推荐

推荐文章