Zookeeper从入门到精通系列之--1.Zookeeper的API操作

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Haidaiya/article/details/84726982

一 IDEA环境搭建

1.1 创建一个maven项目

在pom.xml添加如下依赖

    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.8.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.10</version>
        </dependency>
    </dependencies>

在src/resource下面添加一个文件log4j.properties,里面的内容添加上

log4j.rootLogger=INFO, stdout  
log4j.appender.stdout=org.apache.log4j.ConsoleAppender  
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout  
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n  
log4j.appender.logfile=org.apache.log4j.FileAppender  
log4j.appender.logfile.File=target/spring.log  
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout  
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n  

二 使用代码测试Zookeeper

2.1 编写代码之前的思考

每次再写代码之前请想一想,我要写的是什么?Zookeeper分为客户端和服务端,服务端是那个102,103,104三台服务器对吧,那我们写客户端就相当于使用代码去连接Zookeeper的客户端对吧。还记得使用JDBC连接数据库吗,导包,加载驱动,URL,用户名,密码。。。。。。思考到这里就可以了。

2.2 测试Zookeeper客户端

  • 创建TestZookeeper类
  • 看到下面这么长的代码不要害怕,我先做解释,然后再看会好一点
  1. init()方法主要用于建立一个Zookeeper的客户端,直接new Zookeeper()即可,里面有三个参数,第一个是ip+端口,表示连接的主机客户端;第二个是超长连接时间2s;第三个是监听器,这个先不管
  2. 直接看getNodeAndWatch(),getChildern()表示获取Zookeeper集群上的子节点,并且对这个节点监听就是那个true表达的含义,此时重点来了,既然对   /    这个路径添加了监听,那么当   /    下发生变化,他会怎么做呢?还记得init()中的new watch()吗?里面有process()方法,上面我说先不管,现在管他了,当变化之后,客户端就会执行这个process方法,那么他会先输出子节点对吧,还有,之前上一篇博客中说过监听只执行一次,所以为了一直监听,我们需要在process中再次监听,一直往返执行,才能实现一直监听,是不是明白了很多
  3. Thread.sleep(Long.MAX_VALUE)是让那个线程不死,这样才能一直监听对吧。
  4. 下面我再根据输出结果来分析一波

删除了wangleijia,会发现少了wangleijia

增加节点wangleijia,下面就多了wangleijia

扫描二维码关注公众号,回复: 4398741 查看本文章
package com.haidai.zookeeper;

import org.apache.zookeeper.*;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.util.List;

public class A_textZookeeper {
    private ZooKeeper zkCli;
    //在zoo.cfg中clientPort=2181
    private String connect = "hadoop102:2181,hadoop103:2181,hadoop104:2181";
    //会话超时2秒
    private int sessionTimeout = 2000;
    List<String> childs;

    //1初始化zoo客户端
    @Before
    public void init() throws IOException {

        zkCli = new ZooKeeper(connect, sessionTimeout, new Watcher() {
            public void process(WatchedEvent event) {
                try {
                    System.out.println("-----------监听前------------");
                    childs = zkCli.getChildren("/", true);
                    for (String child : childs) {
                        System.out.println(child);
                    }
                    System.out.println("-----------监听后------------");
                } catch (KeeperException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
    }
    //2创建字节点
    @Test
    public void createNode() throws KeeperException, InterruptedException {
        /*
         * path	节点在的路径
         * data	节点上的内容(Zookeeper的规定)
         * acl	访问的权限
         * createMode	创建的节点类型(4类)
         */
        String path = zkCli.create("/wangleijia", "wanglei".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println(path);
    }
    //3获取字节点并监视子节点的变化
    @Test
    public void getNodeAndWatch() throws KeeperException, InterruptedException {
        System.out.println("-----------监听前------------");
        childs = zkCli.getChildren("/", true);
        for (String child : childs) {
            System.out.println(child);
        }
        System.out.println("-----------监听后------------");
        Thread.sleep(Long.MAX_VALUE);
    }
}

2.3 总结

这样子,我觉的Zookeeper我已经解释的很清楚了,总结一下:Zookeeper是一个提供协调服务的框架,它主要核心是文件系统和通知机制,文件系统像Linux,通知机制是监听器,在客户端中使用watch,在API中new Watch()。还有一些面试会问到的,比如选举机制。

猜你喜欢

转载自blog.csdn.net/Haidaiya/article/details/84726982