分布式系统<3>

1.zk的详细使用
	1.zk的节点分为持久节点和临时节点
		 1.持久节点------>会做一个持久化操作
		 2.临时节点----->是和客户端会话连接的

在这里插入图片描述

我们通常创建的节点叫做持久节点 意味着可以持久化的 
我们也可以创建临时节点

在这里插入图片描述

create -e /luban 1
我们也可以使用create -e 命令创造临时节点 临时节点就意味着当我们关闭客户端的时候这个节点会消失
临时节点不能再创建子节点
zk对每个节点的最大数据量有一个上线 1M

 create -s /lvhao3 "22"
 顺序节点

在这里插入图片描述
在这里插入图片描述

每当我们使用 get命令的时候 

在这里插入图片描述

在这里插入图片描述

zk里面每一个操作,不管你是create set 都会有一个自己的事务,也就是说每次事务都有一个id, 
创建一个节点的时候 事务Id是多少呢  ,m代表你修改的事务Id   p  操作子节点的一个事务Id

在这里插入图片描述
在这里插入图片描述

zk的acl
任何一个客户端都可以连接上 并且可以操作这些节点,呢么我在生产上,肯定有一些节点不允许去写,或者去更改,zk也有他的权限控制

在这里插入图片描述

getAcl /lvhao2  可以查看某个节点的权限
world anyone
cdrwa  代表 我当前这个节点任何人都可以操作 创建 删除 修改 查询 以及更改权限,

在这里插入图片描述

我们可以使用setAcl更改权限,比如说我此时吧权限更改为这个node只能创建,  然后当修改的时候就会报错

在这里插入图片描述

https://blog.csdn.net/liuxiao723846/article/details/79391650  //权限  看大佬博客
https://blog.csdn.net/qq_45895388/article/details/114315746 // zk 看大佬的博客

在这里插入图片描述

addouth digest: zhangsan:12345   // 首先你要加这个用户  // 类似于登录 关于用户认证

// 谁可以吧吧这个节点删除
		只有一个办法 删除物理文件
zk的watch机制
   //默认的watch
        ZooKeeper client = new ZooKeeper("localhost:2181", 10000, new Watcher() {
    
    
            @Override
            public void process(WatchedEvent event) {
    
    
                System.out.println("连接的时候   " + event);
            }
        });
此时我用原生的客户端连接zk  在 客户端连接的时候会吧这个zk打印处出来

在这里插入图片描述

他这个watch 是一个默认的watch,在连接的时候执行watch  我们也可以针对于一个节点进行监听
       byte[] data = client.getData("/node5", new Watcher() {
    
    
            @Override
            public void process(WatchedEvent event) {
    
    
                if( Event.EventType.NodeDataChanged.equals(event.getType())){
    
    
                    System.out.println("1------>改变");
                }
            }
        }, new Stat());
比如说 当数据进行改变的时候,触发这个watch机制 但是 原生的watch机制只能用一次,当我再进行改变的时候 不会触发
基于这个事件监听器实现消费订阅

在这里插入图片描述

 当我们程序这样写的话 就会设置一个默认监听器
client.getData("/data",true,new Stat())  //  默认监听器

在这里插入图片描述

client.getData("/data",false,new Stat())  如果这样的话就不会设置监听器  
Zookeeper异步API调用:AsyncCallback
watch 机制和 AsyncCallback 的区别
Watcher关注的是节点的状态变化,AsyncCallback关注的是API调用返回结果,一个是监听节点将来的变化,一个是获取节点当前的状态或数据,所以两者并不冲突,也可以共存。

在这里插入图片描述

原生的客户端有一点不好的就是当对一个节点进行wanch监听的时候,只会触发一次 ,所以有一种现在通用的客户端 Curator

在这里插入图片描述

        CuratorFramework client = CuratorFrameworkFactory.newClient(
                "localhost:2181",
                //重试策略 循环3次m ,每隔100ms 重试一次
                new RetryNTimes(3, 100));
        client.start();
        //  1.执行什么操作 2. 操作在什么地方
//        client.create().withMode(CreateMode.EPHEMERAL)
//                .forPath("/data","1".getBytes());
//
        String path = "/node5";
        NodeCache nodeCache = new NodeCache(client, path);
        nodeCache.start();
        nodeCache.getListenable().addListener(new NodeCacheListener() {
    
    
            @Override
            public void nodeChanged() throws Exception {
    
    
                System.out.println("11");
            }
        });
   System.in.read();
此时我们配置的重试策略是 循环3次m ,每隔100ms 重试一次
他这个框架是针对于一个节点的进行的缓存
zk的作用
1. 统一命名服务
2. 配置中心
3. 利用顺序节点可以生成全局唯一id
4. 分布式锁
5. 监控系统 [https://blog.csdn.net/u011486068/article/details/50971796]

猜你喜欢

转载自blog.csdn.net/weixin_43689953/article/details/116142151