欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

zookeeper基本命令、java应用

程序员文章站 2024-03-16 10:36:10
...

基本命令

创建 -e临时节点 -s顺序节点
create (-e -s) path data

查询节点
ls path

更新数据
set path data

查询数据
get -s path
dataversion在数据变化后会+1
zookeeper基本命令、java应用
查看当前节点的角色是leader\follower
./zkServer.sh status

删除,提供cas删除
delete path [version]

Java客户端

引入依赖

<dependency>
   <groupId>org.apache.zookeeper</groupId>
   <artifactId>zookeeper</artifactId>
   <version>3.5.3-beta</version>
</dependency>

权限ACL

通过ACL可以对节点访问进行权限控制

使用zkCli时,ACL的格式由::三段组成。
schema:可以取下列值:world, auth, digest, host/ip
id: 标识身份,值依赖于schema做解析。
acl:就是权限:cdwra分别表示create, delete,write,read, admin

ZooKeeper zooKeeper = new ZooKeeper("192.168.97.139:2181,192.168.97.123:2181,192.168.97.119",
        5000, new Watcher() {
    @Override
    public void process(WatchedEvent watchedEvent) {
        System.out.println("哈哈");
    }
});
zooKeeper.addAuthInfo("digest","foo:true".getBytes());
System.out.println(zooKeeper.getState());
String path = zooKeeper.create("/testacl2","hhajava".getBytes(), ZooDefs.Ids.CREATOR_ALL_ACL, CreateMode.PERSISTENT);

连接zookeeper后,通过zookeeper.addAuthInfo给这个客户端加上一个信息。然后创建节点,注意ZooDefs.Ids.CREATOR_ALL_ACL代表是拥有权限才能够访问。
zookeeper基本命令、java应用
第一次访问该节点报错,通过addauth 加入权限认证,第二次访问就能够获取到数据

            // 1、同步创建节点
           String path = zooKeeper.create("/java","hhajava".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);//持久化节点
            System.out.println(path);
            // 2、删除节点 version 对应 get -s path的 dataversion
            zooKeeper.delete("/java",1);

部分方法中,可以传入watcher。它提供了一种机制,当watch的节点发生变化,客户端将会收到watch的信息。分布式锁也是基于这种反馈机制。

 // 4、获取子节点
            List<String> list = zooKeeper.getChildren("/java", new Watcher() {
                @Override
                public void process(WatchedEvent watchedEvent) {
                    System.out.println("节点产生变化"+watchedEvent.getPath());
               }
            });
            for (String a :list){
                System.out.println(a);
            }

            // 获取节点数据
            byte[] data1 = zooKeeper.getData("/java", new Watcher() {
                @Override
                public void process(WatchedEvent watchedEvent) {
                    System.out.println(watchedEvent.getPath()+"数据改变");
                }
            }, new Stat());
            System.out.println(new String(data1));

//            // 更新节点数据
            zooKeeper.setData("/java","31231".getBytes(),2);

Curator客户端框架

引入依赖

<dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.0.1</version>
        </dependency>
<!--        提供分布式锁实现-->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>4.0.1</version>
        </dependency>
// 1、创建节点
          CuratorFramework client =  CuratorFrameworkFactory.builder()
                  .connectString("192.168.97.139:2181")
                .sessionTimeoutMs(5555)
                .retryPolicy(new RetryOneTime(111))
                .build();
        client.start();
//        client.create().forPath("/curator","test".getBytes());

        // 全局id
        String path = client.create().withMode(CreateMode.PERSISTENT_SEQUENTIAL).forPath("/quanjuid","222".getBytes());
        System.out.println(path);
        // 2、分布式锁
        InterProcessMutex lock = new InterProcessMutex(client,"/lock");

        for(int i = 0 ;i <30;i++){

            new Thread(new Runnable() {
                @Override
                public void run() {
                    try {
                        lock.acquire();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                    System.out.println("a的值-------------"+a);
                    a++;
                    try {
                        lock.release();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }

全局id 主要利用了顺序节点会自动在创建节点后添加序号
zookeeper基本命令、java应用
分布式锁只要利用了临时有序节点特性和watch机制。针对读请求,查询之前的节点没有写请求就可以共享。针对写请求,当写请求是第一个节点才会获得锁。每个节点watch前一个节点,避免羊群效应(当锁释放,多个请求同时去争抢创建节点)。因为是临时节点,当客户端占用锁时失去连接也就会删除这个节点释放锁。