Zookeeper笔记④——监听器触发流程、CloseSession操作和ACL操作

本文详细介绍了Zookeeper中监听器的触发流程,包括客户端发送请求、服务端接收处理以及客户端接收响应和触发监听器的过程。同时,讲解了CloseSession操作,从客户端发送CloseSession命令到服务端处理的步骤。此外,还探讨了Zookeeper的ACL操作,包括权限介绍、添加和设置用户、设置权限以及服务端验证权限的机制,以及ACL操作可能存在的问题。
摘要由CSDN通过智能技术生成

监听器触发流程

客户端发送请求

这里是通过getData请求注册一个默认监听器
在这里插入图片描述
这里将监听器对象个监听的节点封装起来,并且存放在客户端中,同时也会把监听器的信息封装到request对象中,但是注意这里只是把是否存在监听器发送过去。

public byte[] getData(final String path, Watcher watcher, Stat stat)
    throws KeeperException, InterruptedException
 {
   
    final String clientPath = path;
    PathUtils.validatePath(clientPath);

    // the watch contains the un-chroot path
    WatchRegistration wcb = null;
    // 注册监听器
    // 这里会将监听器对象和节点路径封装起来
    if (watcher != null) {
   
        wcb = new DataWatchRegistration(watcher, clientPath);
    }

    final String serverPath = prependChroot(clientPath);

    RequestHeader h = new RequestHeader();
    h.setType(ZooDefs.OpCode.getData);
    GetDataRequest request = new GetDataRequest();
    request.setPath(serverPath);
    // 这里会将监听器信息放入request中
    // 这里只是将是否注册监听器传进去,并没有把监听器对象传进去
    request.setWatch(watcher != null);
    GetDataResponse response = new GetDataResponse();
    // 这个方法就是将请求向服务端发送过去
    // 并阻塞等待响应结果
    ReplyHeader r = cnxn.submitRequest(h, request, response, wcb);
    if (r.getErr() != 0) {
   
        throw KeeperException.create(KeeperException.Code.get(r.getErr()),
                clientPath);
    }
    if (stat != null) {
   
        DataTree.copyStat(response.getStat(), stat);
    }
    // 返回响应结果
    return response.getData();
}

服务端接收请求

这里直接从处理器链中分析,至于服务端通过NIO发送请求就不再分析了,可以参考下面的博文

单机服务端和客户端流程

  • PrepRequestProcessor

这个处理器并没有处理关于事件逻辑,下面是调用链

1.org.apache.zookeeper.server.RequestProcessor#processRequest
2.java.util.AbstractQueue#add
3.org.apache.zookeeper.server.PrepRequestProcessor#run
4.org.apache.zookeeper.server.PrepRequestProcessor#pRequest

pRequest方法就是这个处理器的真正的处理方法,这里getData请求只是作了ACL安全验证
在这里插入图片描述
然后就是进行下一个处理器

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值