Zookeeper:客户端API操作

IDEA环境搭建

1.创建一个maven工程

2.导入依赖

    <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>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.5.7</version>
        </dependency>
    </dependencies>

3)拷贝log4j.properties文件到项目根目录

需要在项目的 src/main/resources 目录下,新建一个文件,命名为“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

4)创建包,创建类

创建zookeeper客户端

public class Zktest {
    private static String connectString = "180.76.106.99:2181,120.48.39.100:2181,152.136.194.161:2181";
    private static int sessionTimeout = 200000;
    private ZooKeeper zkClient = null;
    //创建zookeeper客户端
    @Before
    public void init() throws IOException {
        zkClient = new ZooKeeper(connectString, sessionTimeout, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                System.out.println("----------------------------");
                // 再次启动监听
                List<String> children = null;
                try {
                    children = zkClient.getChildren("/", true);
                    for(String child:children){
                        System.out.println(child);
                    }
                } catch (KeeperException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }


            }
        });
    }
    //创建子节点
    @Test
    public void create() throws InterruptedException, KeeperException {
             // 参数 1:要创建的节点的路径; 参数 2:节点数据 ; 参数 3:节点权限 ;参数 4:节点的类型 
        String tinstu = zkClient.create("/tinstu", "tin".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    }
    //获取子节点并监听节点变化
     /*
    *在idea中看到: zookeeper  sanguo tinstu 在shell中删除tinstu,控制台里面输出zookeeper  sanguo
     */
    @Test
    public void get() throws InterruptedException, KeeperException {
        //这里写true,代表走上面初始化的Watcher,此处也可以自己new
        List<String> children = zkClient.getChildren("/", true);
        for(String child:children){
            System.out.println(child);
        }
        // 延时阻塞
        Thread.sleep(Long.MAX_VALUE);
    }
    //判断节点是否存在
    @Test
    public void ex() throws InterruptedException, KeeperException {
        Stat sanguo = zkClient.exists("/sanguo", false);
        System.out.println(sanguo==null?"不存在":"存在");
        //存在sanguo,所以输出存在
    }
}

 客户端向服务端写数据原理

请求发给leader

只要超过半数的服务端完成write,就会进行第4步 应答给 客户端

请求发给follower

请求发给f,先写给l,l在写给f,超过半数后,l应答给被请求的f,f在应答给客户端

 

阅读剩余
THE END