Zookeeper入门(二) --- 客户端常用命令、服务器上下线监听案例、分布式锁实现

四、客户端常用命令

命令行基本语法 功能描述
help 显示所有操作命令
ls [-w] [-s] path 使用 ls 命令来查看znode的子节点,
-w 监听子节点变化
-s 附加次级信息
create [-s] [-e] node value 创建节点
-s 带序列的(后面追加系统自增的数字)
-e 临时节点,重启或者超时时消失
get [-w] [-s] path 获得节点的值
-w 监听节点内容变化
-s 附加次级信息
set 设置/修改节点的具体值
stat 查看节点状态
delete 删除节点
deleteall 递归删除节点和其子节点

五、Zookeeper节点

5.1 节点数据信息

[zk: localhost:2181(CONNECTED) 0] ls -s /
[zookeeper]cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x9
cversion = 1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
  • czxid: 创建节点的事务 zxid 每次修改 ZooKeeper 状态都会产生一个 ZooKeeper 事务 ID。事务 ID 是 ZooKeeper 中所有修改总的次序。每次修改都有唯一的 zxid,如果 zxid1 小于 zxid2,那么 zxid1 在 zxid2 之前发生。
  • ctime: znode 被创建的毫秒数
  • mzxid: znode 最后更新的事务 zxid
  • mtime: znode 最后修改的毫秒数
  • pZxid: znode 最后更新的子节点 zxid
  • cversion: znode 子节点变化号,znode 子节点修改次数
  • dataversion: znode 数据变化号
  • aclVersion: znode 访问控制列表的变化号
  • ephemeralOwner: 如果是临时节点,这个是 znode 拥有者的 session id。如果不是临时节点则是 0
  • dataLength: znode 的数据长度
  • numChildren: znode 子节点数量

5.2 节点类型

image-20220220235036591

5.3 监听器原理

客户端注册监听它关心的目录节点,当目录节点发生变化(数据改变、节点删除、子目录节点增加删除)时,ZooKeeper 会通知客户端

监听机制保证 ZooKeeper 保存的任何的数据的任何改变都能快速的响应到监听了该节点的应用程序

image-20220220235518978

六、服务器动态上下线监听案例

需求:某分布式系统中,主节点可以有多台,可以动态上下线,任意一台客户端都能实时感知到主节点服务器的上下线。

image-20220221000951697

新建Maven项目并导入依赖

<dependencies>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.13.2</version>
    </dependency>
    <dependency>
        <groupId>org.apache.logging.log4j</groupId>
        <artifactId>log4j-core</artifactId>
        <version>2.14.1</version>
    </dependency>
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>3.5.7</version>
    </dependency>
</dependencies>

服务端:

/**
 * @author Bandit
 * @create 2022/2/19 23:06
 * 无论是客户端还是服务端,对于zk来说都是客户端,只是操作不同而已
 */
public class DistributeServer {
   
    private final String connectString = "192.168.2.128:2181,192.168.2.128:2182,192.168.2.128:2183";
    private static int sessionTimeout = 60000;
    private ZooKeeper zkClient = null;
    private final String ParentPath = "/servers";

    //获取到zookeeper的客户端连接
    public void init() throws IOException {
   
        zkClient = new ZooKeeper(connectString,sessionTimeout,watchedEvent -> {
   

        });
    }

    //注册服务器到zk上
    public void registerServer(String hostname) throws KeeperException, InterruptedException {
   
        String created = zkClient.create(ParentPath+"/server", hostname.getBytes(StandardCharsets.UTF_8),
                ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);//模式为 -e -s,暂时的带序号的
        System.out.println(hostname+"is online"+created);
    }

    //业务功能
    public void business(String hostname) throws InterruptedException {
   
        System.out.println(hostname+"正在服务。。");
        Thread.sleep(Long.MAX_VALUE);
    }

    public static void main(String[] args) throws IOException, KeeperEx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值