使用zookeeper源码来搭建服务端

学习zookeeper除了阅读网络上已经整理好的文献外,要深入学习离不开对于源码的阅读,下面贴出使用zookeeper源码来搭建服务端的步骤:

 

zookeeper服务端搭建:

从git上下载经过处理的源码(非官网):https://github.com/HelloZola/zookeeper-branch-3.5.6

该源码是使用git上zookeeper最新开源源码,并通过版本回退,而且在本地机器经过修改以达到可直接下载使用和运行,可进行调试和学习之用,最新的官方源码可访问:https://github.com/apache/zookeeper,源码距离直接使用运行,还需要进过gradle等工具的处理和对异常情况的手动修改(例如中找不到依赖代码等)。

下载源码之后,通过maven的方式导入IDE,maven download依赖包和编译后,即完成源码的导入:

Idea的导入zookeeper服务端项目效果截图

zookeeper源码分了几个模块,除了主要的zookeeper-server外,其它的模块均可在maven官网找到依赖包进行替代。而主要的核心代码也都在zookeeper-server中。

相关配置都在conf目录下面:

 

 

源码导入并编辑通过后,根据以下说明进行配置和启动,

单机启动:
ZooKeeperServerMain

集群启动:
QuorumPeerMain

启动参数:
-Dlog4j.configuration=file:E:/idea-workspace/zk3.5.6/zookeeper-branch-3.5.6/conf/log4j.properties

project arguments:
E:\idea-workspace\zk3.5.6\zookeeper-branch-3.5.6\conf\zoo.cfg

ps:启动参数路径不能有空格,否则报乱码不知名错误,导致不能启动

 

zookeeper测试客户端demo搭建:

从git上下载已有的客户端demo:https://github.com/HelloZola/zk-client-demo

客户端demo只是为了方便服务端的调试,故这里不采用源码的方式

代码导入idea后zookeeper客户端项目的效果:

 

下一步打开DemoTest单元测试类进行测试

package com.client.nameserver;

import com.config.ConfigConstants;
import org.I0Itec.zkclient.ZkClient;
import org.I0Itec.zkclient.serialize.SerializableSerializer;
import org.apache.zookeeper.CreateMode;
import org.junit.Before;
import org.junit.Test;

import java.util.Date;

public class DemeTest {

    private static ZkClient zkClient = null;

    @Before
    public void before() {
        zkClient = new ZkClient(ConfigConstants.zkServerPath, 60000, 60000, new SerializableSerializer());
    }


    @Test
    public void test() {
        System.out.println("hello");
    }

    /**
     * 创建节点
     */
    @Test
    public void createNodeTest() {

        System.out.println("conneted ok!");
        User user = new User();
        user.setId("1");
        user.setName("testUser");

        /**
         * testUserNode" :节点的地址
         * user:数据的对象
         * CreateMode.PERSISTENT:创建的节点类型
         */
        String createPath = "/testUserNode" + new Date().getTime();
        String path = zkClient.create(createPath, user, CreateMode.PERSISTENT_SEQUENTIAL);
        //输出创建节点的路径
        System.out.println("createPath:" + path);
        System.out.println("created path:" + path);
    }

    @Test
    public void lockTets() {
        try {
            zkClient.createEphemeral("hhh");
            System.out.println("done");
        } catch (Exception e) {
            System.out.println("not done");
        }
    }


}

 

运行测试:

第一步启动服务端:

这里启动的是单机版,启动参数截图如下:

开始debug:

Connected to the target VM, address: '127.0.0.1:59563', transport: 'socket'
2020-10-14 14:10:27,655 [myid:] - INFO  [main:ManagedUtil@46] - Log4j found with jmx enabled.
2020-10-14 14:10:27,962 [myid:] - INFO  [main:QuorumPeerConfig@133] - Reading configuration from: E:\Projects\zookeeper-branch-3.5.6\conf/zoo.cfg
2020-10-14 14:10:27,968 [myid:] - INFO  [main:QuorumPeerConfig@385] - clientPortAddress is 0.0.0.0/0.0.0.0:2181
2020-10-14 14:10:27,969 [myid:] - INFO  [main:QuorumPeerConfig@389] - secureClientPort is not set
2020-10-14 14:10:27,979 [myid:] - INFO  [main:ZooKeeperServerMain@117] - Starting server
2020-10-14 14:10:27,984 [myid:] - INFO  [main:FileTxnSnapLog@103] - zookeeper.snapshot.trust.empty : false
2020-10-14 14:10:28,057 [myid:] - INFO  [main:Environment@109] - Server environment:zookeeper.version=3.5.6-c11b7e26bc554b8523dc929761dd28808913f091, built on 10/08/2019 20:18 GMT
2020-10-14 14:10:28,057 [myid:] - INFO  [main:Environment@109] - Server environment:host.name=2W2KA1RO30S5XSN
2020-10-14 14:10:28,057 [myid:] - INFO  [main:Environment@109] - Server environment:java.version=1.8.0_171
2020-10-14 14:10:28,057 [myid:] - INFO  [main:Environment@109] - Server environment:java.vendor=Oracle Corporation
2020-10-14 14:10:28,057 [myid:] - INFO  [main:Environment@109] - Server environment:java.home=C:\Program Files\Java\jdk1.8.0_171\jre
2020-10-14 14:10:28,057 [myid:] - INFO  [main:Environment@109] - Server environment:java.class.path=C:\Program Files\Java\jdk1.8.0_171\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\rt.jar;E:\IDEA Studio\drawing board\zk\zookeeper-branch-3.5.6\zookeeper-server\target\classes;E:\IDEA Studio\drawing board\zk\zookeeper-branch-3.5.6\zookeeper-jute\target\classes;G:\maven\repository\org\apache\yetus\audience-annotations\0.5.0\audience-annotations-0.5.0.jar;G:\maven\repository\io\netty\netty-handler\4.1.42.Final\netty-handler-4.1.42.Final.jar;G:\maven\repository\io\netty\netty-common\4.1.42.Final\netty-common-4.1.42.Final.jar;G:\maven\repository\io\netty\netty-buffer\4.1.42.Final\netty-buffer-4.1.42.Final.jar;G:\maven\repository\io\netty\netty-transport\4.1.42.Final\netty-transport-4.1.42.Final.jar;G:\maven\repository\io\netty\netty-resolver\4.1.42.Final\netty-resolver-4.1.42.Final.jar;G:\maven\repository\io\netty\netty-codec\4.1.42.Final\netty-codec-4.1.42.Final.jar;G:\maven\repository\io\netty\netty-transport-native-epoll\4.1.42.Final\netty-transport-native-epoll-4.1.42.Final.jar;G:\maven\repository\io\netty\netty-transport-native-unix-common\4.1.42.Final\netty-transport-native-unix-common-4.1.42.Final.jar;G:\maven\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;G:\maven\repository\org\slf4j\slf4j-log4j12\1.7.25\slf4j-log4j12-1.7.25.jar;G:\maven\repository\org\eclipse\jetty\jetty-server\9.4.17.v20190418\jetty-server-9.4.17.v20190418.jar;G:\maven\repository\javax\servlet\javax.servlet-api\3.1.0\javax.servlet-api-3.1.0.jar;G:\maven\repository\org\eclipse\jetty\jetty-http\9.4.17.v20190418\jetty-http-9.4.17.v20190418.jar;G:\maven\repository\org\eclipse\jetty\jetty-util\9.4.17.v20190418\jetty-util-9.4.17.v20190418.jar;G:\maven\repository\org\eclipse\jetty\jetty-io\9.4.17.v20190418\jetty-io-9.4.17.v20190418.jar;G:\maven\repository\org\eclipse\jetty\jetty-servlet\9.4.17.v20190418\jetty-servlet-9.4.17.v20190418.jar;G:\maven\repository\org\eclipse\jetty\jetty-security\9.4.17.v20190418\jetty-security-9.4.17.v20190418.jar;G:\maven\repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;C:\Dev tool\ideaIU-2017.2.5.win\lib\idea_rt.jar
2020-10-14 14:10:28,058 [myid:] - INFO  [main:Environment@109] - Server environment:java.library.path=C:\Program Files\Java\jdk1.8.0_171\bin;C:\windows\Sun\Java\bin;C:\windows\system32;C:\windows;C:\Program Files\Java\jdk1.8.0_171\bin;C:\Program Files\Java\jdk1.8.0_171\jre\bin;E:\apache-maven-3.3.3\bin;C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\windows\system32;C:\windows;C:\windows\System32\Wbem;C:\windows\System32\WindowsPowerShell\v1.0\;E:\work\mysql server\mysql-8.0.11-winx64\bin;C:\Program Files\TortoiseGit\bin;C:\Program Files\Git\cmd;E:\apache-maven-3.3.3\bin;C:\Program Files\Java\jdk1.8.0_171\bin;C:\Program Files\Java\jdk1.8.0_171\jre\bin;E:\apache-maven-3.3.3\bin;C:\Users\Administrator\AppData\Local\Microsoft\WindowsApps;E:\work\mysql server\mysql-8.0.11-winx64\bin;C:\Program Files (x86)\Python\Python37;;C:\Program Files (x86)\JetBrains\PyCharm 2019.1.1\bin;;E:\apache-maven-3.3.3\bin;.
2020-10-14 14:10:28,068 [myid:] - INFO  [main:Environment@109] - Server environment:java.io.tmpdir=C:\Users\ADMINI~1\AppData\Local\Temp\
2020-10-14 14:10:28,068 [myid:] - INFO  [main:Environment@109] - Server environment:java.compiler=<NA>
2020-10-14 14:10:28,068 [myid:] - INFO  [main:Environment@109] - Server environment:os.name=Windows 10
2020-10-14 14:10:28,069 [myid:] - INFO  [main:Environment@109] - Server environment:os.arch=amd64
2020-10-14 14:10:28,069 [myid:] - INFO  [main:Environment@109] - Server environment:os.version=10.0
2020-10-14 14:10:28,069 [myid:] - INFO  [main:Environment@109] - Server environment:user.name=Administrator
2020-10-14 14:10:28,069 [myid:] - INFO  [main:Environment@109] - Server environment:user.home=C:\Users\Administrator
2020-10-14 14:10:28,069 [myid:] - INFO  [main:Environment@109] - Server environment:user.dir=E:\IDEA Studio\drawing board\zk\zookeeper-branch-3.5.6
2020-10-14 14:10:28,069 [myid:] - INFO  [main:Environment@109] - Server environment:os.memory.free=113MB
2020-10-14 14:10:28,069 [myid:] - INFO  [main:Environment@109] - Server environment:os.memory.max=1804MB
2020-10-14 14:10:28,069 [myid:] - INFO  [main:Environment@109] - Server environment:os.memory.total=123MB
2020-10-14 14:10:28,072 [myid:] - INFO  [main:ZooKeeperServer@938] - minSessionTimeout set to 4000
2020-10-14 14:10:28,072 [myid:] - INFO  [main:ZooKeeperServer@947] - maxSessionTimeout set to 40000
2020-10-14 14:10:28,073 [myid:] - INFO  [main:ZooKeeperServer@166] - Created server with tickTime 2000 minSessionTimeout 4000 maxSessionTimeout 40000 datadir E:\idea-workspace\zk3.5.6\log\dataLogDir\version-2 snapdir E:\idea-workspace\zk3.5.6\log\dataDir\version-2
2020-10-14 14:10:28,123 [myid:] - INFO  [main:Log@193] - Logging initialized @1863ms to org.eclipse.jetty.util.log.Slf4jLog
2020-10-14 14:10:28,425 [myid:] - WARN  [main:ContextHandler@1588] - o.e.j.s.ServletContextHandler@654f0d9c{/,null,UNAVAILABLE} contextPath ends with /*
2020-10-14 14:10:28,425 [myid:] - WARN  [main:ContextHandler@1599] - Empty contextPath
2020-10-14 14:10:28,521 [myid:] - INFO  [main:Server@370] - jetty-9.4.17.v20190418; built: 2019-04-18T19:45:35.259Z; git: aa1c656c315c011c01e7b21aabb04066635b9f67; jvm 1.8.0_171-b11
2020-10-14 14:10:28,631 [myid:] - INFO  [main:DefaultSessionIdManager@365] - DefaultSessionIdManager workerName=node0
2020-10-14 14:10:28,632 [myid:] - INFO  [main:DefaultSessionIdManager@370] - No SessionScavenger set, using defaults
2020-10-14 14:10:28,656 [myid:] - INFO  [main:HouseKeeper@149] - node0 Scavenging every 600000ms
2020-10-14 14:10:28,792 [myid:] - INFO  [main:ContextHandler@855] - Started o.e.j.s.ServletContextHandler@654f0d9c{/,null,AVAILABLE}
2020-10-14 14:10:29,014 [myid:] - INFO  [main:AbstractConnector@292] - Started ServerConnector@ec756bd{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
2020-10-14 14:10:29,014 [myid:] - INFO  [main:Server@410] - Started @2768ms
2020-10-14 14:10:29,014 [myid:] - INFO  [main:JettyAdminServer@112] - Started AdminServer on address 0.0.0.0, port 8080 and command URL /commands
2020-10-14 14:10:29,022 [myid:] - INFO  [main:ServerCnxnFactory@135] - Using org.apache.zookeeper.server.NIOServerCnxnFactory as server connection factory
2020-10-14 14:10:29,032 [myid:] - INFO  [main:NIOServerCnxnFactory@673] - Configuring NIO connection handler with 10s sessionless connection timeout, 1 selector thread(s), 12 worker threads, and 64 kB direct buffers.
2020-10-14 14:10:29,036 [myid:] - INFO  [main:NIOServerCnxnFactory@686] - binding to port 0.0.0.0/0.0.0.0:2181

binding to port 0.0.0.0/0.0.0.0:2181

看到绑定端口,说明启动成功。

 

下一步,启动客户端进行测试,这里先测试一下创建一个持久的顺序节点,并且为了查看服务端的反应,我们在DataTree的createNode方法处打上断点。

接着启动客户端DemoTest的createNodeTest方法进行调试。

    @Test
    public void createNodeTest() {

        System.out.println("conneted ok!");
        User user = new User();
        user.setId("1");
        user.setName("testUser");

        /**
         * testUserNode" :节点的地址
         * user:数据的对象
         * CreateMode.PERSISTENT:创建的节点类型
         */
        String createPath = "/testUserNode" + new Date().getTime();
        String path = zkClient.create(createPath, user, CreateMode.PERSISTENT_SEQUENTIAL);
        //输出创建节点的路径
        System.out.println("createPath:" + createPath);
        System.out.println("created path:" + path);
    }

执行客户端单元测试方式后,可以看到服务端立即进行了断点:

撤销断点后,可以看到客户端成功返回结果:

"C:\Program Files\Java\jdk1.8.0_171\bin\java" -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:59746,suspend=y,server=n -ea -Didea.test.cyclic.buffer.size=1048576 -Dfile.encoding=UTF-8 -classpath "C:\Dev tool\ideaIU-2017.2.5.win\lib\idea_rt.jar;C:\Dev tool\ideaIU-2017.2.5.win\plugins\junit\lib\junit-rt.jar;C:\Dev tool\ideaIU-2017.2.5.win\plugins\junit\lib\junit5-rt.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_171\jre\lib\rt.jar;E:\IDEA Studio\drawing board\zk\zk-client-demo\target\test-classes;E:\IDEA Studio\drawing board\zk\zk-client-demo\target\classes;G:\maven\repository\junit\junit\4.12\junit-4.12.jar;G:\maven\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;G:\maven\repository\org\apache\zookeeper\zookeeper\3.5.6\zookeeper-3.5.6.jar;G:\maven\repository\org\apache\zookeeper\zookeeper-jute\3.5.6\zookeeper-jute-3.5.6.jar;G:\maven\repository\org\apache\yetus\audience-annotations\0.5.0\audience-annotations-0.5.0.jar;G:\maven\repository\io\netty\netty-handler\4.1.42.Final\netty-handler-4.1.42.Final.jar;G:\maven\repository\io\netty\netty-common\4.1.42.Final\netty-common-4.1.42.Final.jar;G:\maven\repository\io\netty\netty-buffer\4.1.42.Final\netty-buffer-4.1.42.Final.jar;G:\maven\repository\io\netty\netty-transport\4.1.42.Final\netty-transport-4.1.42.Final.jar;G:\maven\repository\io\netty\netty-resolver\4.1.42.Final\netty-resolver-4.1.42.Final.jar;G:\maven\repository\io\netty\netty-codec\4.1.42.Final\netty-codec-4.1.42.Final.jar;G:\maven\repository\io\netty\netty-transport-native-epoll\4.1.42.Final\netty-transport-native-epoll-4.1.42.Final.jar;G:\maven\repository\io\netty\netty-transport-native-unix-common\4.1.42.Final\netty-transport-native-unix-common-4.1.42.Final.jar;G:\maven\repository\org\slf4j\slf4j-api\1.7.25\slf4j-api-1.7.25.jar;G:\maven\repository\org\slf4j\slf4j-log4j12\1.7.25\slf4j-log4j12-1.7.25.jar;G:\maven\repository\log4j\log4j\1.2.17\log4j-1.2.17.jar;G:\maven\repository\org\apache\curator\curator-framework\4.0.0\curator-framework-4.0.0.jar;G:\maven\repository\org\apache\curator\curator-client\4.0.0\curator-client-4.0.0.jar;G:\maven\repository\com\google\guava\guava\20.0\guava-20.0.jar;G:\maven\repository\org\apache\curator\curator-recipes\4.0.0\curator-recipes-4.0.0.jar;G:\maven\repository\com\101tec\zkclient\0.10\zkclient-0.10.jar" com.intellij.rt.execution.junit.JUnitStarter -ideVersion5 -junit4 com.client.nameserver.DemeTest,createNodeTest
Connected to the target VM, address: '127.0.0.1:59746', transport: 'socket'
log4j:WARN No appenders could be found for logger (org.I0Itec.zkclient.ZkConnection).
log4j:WARN No appenders could be found for logger (org.I0Itec.zkclient.ZkEventThread).
log4j:WARN Please initialize the log4j system properly.
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:WARN See http://logging.apache.org/log4j/1.2/faq.html#noconfig for more info.
conneted ok!
Disconnected from the target VM, address: '127.0.0.1:59746', transport: 'socket'
createPath:/testUserNode1602667476141
created path:/testUserNode16026674761410000000006

Process finished with exit code 0
至此,服务端代码搭建成功并测试通过。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值