zookeeper简单介绍

zookeeper

1.zookeeper 概述

简介

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。其由JAVA编写,支持JAVA 和C两种语言的客户端。

常见的应用场景

1.服务注册中心
2.分布式锁

2.zookeeper常用命令

常用的zookeeper节点命令:
help查看提供的命令列表
在这里插入图片描述

create

语法:

create [-s] [-e] [-c] [-t ttl] path [data] [acl]

创建节点:

zk的基本单元是基于类似文件系统的path唯一路径存放的数据结构节点:znode。

znode分为四种类型:持久节点、持久序号节点、临时节点、临时序号节点。

#默认创建的就是持久节点,创建的节点名称以path路径形式创建:create /hello

持久序号节点: create -s /hello-world

临时节点: create -e /hello-world-e

临时序号节点: create -e -s /hello-world-e-s

节点类型小结:

zookeeper的znode节点默认创建的是持久节点。

临时节点的特征是只要创建该临时节点的客户端连接关闭了或者session超时连接,那么服务端会自动将该客户端所创建的所有临时节点全部删除。

zookeeper还支持序号节点,创建节点的时候会根据节点的path作为前缀,序号进行递增。

ls

语法: ls [-s] [-w] [-R] path
path:节点路径
与linux的ls差不多,列出子节点。-s 同时显示节点对应的状态,-w 监控某个节点,-R 递归列出所有子节点

基本查询: ls /

递归查询 : ls / -R

节点监控 -w watch 只能监控子节点的创建、删除 一次性 : ls -w /hello

addWatch(了解命令)

监控节点

基本语法:addWatch [-m mode] path

set

create命令创建了znode节点,此时还没给节点赋值。你也可以理解为文件夹创建好了,里面内容还是空的,通过set命令可以赋值操作:

基本语法:set [-s] [-v version] path data

-s设置完值后同时查看节点状态

-v设置值的同时带上版本号

set /hello 123

get

查看节点数据

基础语法:get [-s] [-w] path

-w 监控当前节点的数据变化

-s 同时查看节点状态

开启节点数据监控: get -w /hello

delete

删除节点:只能删除没有子节点的节点

基础语法:delete [-v version] path

deleteall

递归删除,会将当前节点以及所有子节点都删除

基本语法:deleteall path

3.第三方ZKClient操作Zookeeper

zkClient 是在zookeeper客户端基础之上封装的,使用上更加友好。

主要变化如下:

  • 可以设置持久监听,或删除某个监听
  • 可以插入JAVA对象,自动进行序列化和反序列化
  • 简化了基本的增删改查操作。

创建一个maven项目,项目名称为:zk-connection-zkclient

添加maven依赖:

 <dependencies>
        <dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>
    </dependencies>

zkclient使用示例代码:

1 zkClient创建节点

 public static void main(String[] args) {
        //1.连接服务器
        ZkClient zkClient = new ZkClient("127.0.0.1:2181");
           if(zkClient.exists("/zkclient") == false){
            zkClient.createPersistent("/zkclient","hello zkclient 李四");
        }  
       //读取znode数据
        String data = zkClient.readData("/zkclient");
        System.out.println("data:" + data);
    } 

2 zkClient 存储对象数据

准备实体类:

package cn.itcast.zkclient;

import java.io.Serializable;

public class User implements Serializable {
    private  Long  id;
    private  String name;
    public Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                '}';
    }
}
   //1.连接服务器
        ZkClient zkClient = new ZkClient("127.0.0.1:2181");
// 2. 创建节点 赋值
if(zkClient.exists("/zkclient1") == false){
    User user = new User();
    user.setId(1L);
    user.setName("李四'");
    zkClient.createPersistent("/zkclient",user);
}
    //3. 读取znode数据
        User data = zkClient.readData("/zkclient1");

        System.out.println("data:" + data);


3 节点数据监听

对已经创建的节点,监听

编写代码:

package cn.itcast.zkclient;

import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;

import java.io.IOException;

public class ZkClientZookeeperWatch {

    public static void main(String[] args) throws IOException {
        //1.连接服务器
        ZkClient zkClient = new ZkClient("127.0.0.1:2181");

        //监听数据变化
        zkClient.subscribeDataChanges("/zkclientw", new IZkDataListener() {
            public void handleDataChange(String dataPath, Object data) throws Exception {
                System.out.println("目标节点路径::" + dataPath);
                System.out.println("目标节点数据 :" + data);
            }
            //  处理节点数据监听
            public void handleDataDeleted(String dataPath) throws Exception {
                System.out.println("handleDataDeleted-----");
                System.out.println("dataPath:" + dataPath);

            }
        });
        System.out.println("我正在监听--------------");
        System.in.read();
    }
}

4 子节点以及数据监听

package cn.itcast.zkclient;

import cn.itcast.zkserializer.StringValueSerializer;
import org.I0Itec.zkclient.IZkDataListener;
import org.I0Itec.zkclient.ZkClient;

import java.io.IOException;
import java.util.List;

public class ZkClientZookeeperChildrenWatch {

    public static void main(String[] args) throws IOException {
        //1.连接服务器
        ZkClient zkClient = new ZkClient("127.0.0.1:2181");
        zkClient.setZkSerializer(new StringValueSerializer());

        //监听子节点变化
        List<String> children = zkClient.subscribeChildChanges("/zk", (parentPath, currentChilds) ->{
            System.out.println("parentPath:" + parentPath);
            System.out.println("currentChilds:" + currentChilds);
        });

        //监听子节点数据变化
        for (String child : children) {

            zkClient.subscribeDataChanges("/zk/"+child, new IZkDataListener() {
                public void handleDataChange(String dataPath, Object data) throws Exception {
                    System.out.println("目标子节点路径::" + dataPath);
                    System.out.println("目标子节点更新数据 :" + data);
                }
                //  处理子节点数据监听
                public void handleDataDeleted(String dataPath) throws Exception {
                    System.out.println("handleDataDeleted-----");
                    System.out.println("dataPath:" + dataPath);

                }
            });

        }
        System.in.read();
        System.out.println("我正在监听--------------");
        zkClient.close();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值