zookeeper基本命令、java应用

基本命令

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

查询节点
ls path

更新数据
set path data

查询数据
get -s path
dataversion在数据变化后会+1
在这里插入图片描述
查看当前节点的角色是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代表是拥有权限才能够访问。
在这里插入图片描述
第一次访问该节点报错,通过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 主要利用了顺序节点会自动在创建节点后添加序号
在这里插入图片描述
分布式锁只要利用了临时有序节点特性和watch机制。针对读请求,查询之前的节点没有写请求就可以共享。针对写请求,当写请求是第一个节点才会获得锁。每个节点watch前一个节点,避免羊群效应(当锁释放,多个请求同时去争抢创建节点)。因为是临时节点,当客户端占用锁时失去连接也就会删除这个节点释放锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值