ZooKeeper【客户端的API操作、写数据流程】

简介: ZooKeeper【客户端的API操作、写数据流程】

前置工作

创建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.18.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.5.7</version>
        </dependency>
    </dependencies>

配置log4j

log4j.rootLogger=INFO, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c]- %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c]- %m%n

API 操作实例

初始化方法

 @Before
    public void init() throws IOException {
        zkClient = new ZooKeeper(connectString, sessionTimeOut, new Watcher() {
            //process方法可以为空 在这里设置的监听并不是监听一次就关闭而是一直监听            
            @Override
            public void process(WatchedEvent watchedEvent) {
                System.out.println("----------init------------");
                List<String> children = null;
                try {
                    children = zkClient.getChildren("/sanguo", true);
                } catch (KeeperException | InterruptedException e) {
                    e.printStackTrace();
                }
                for (String child : children) {
                    System.out.println(child);
                }
            }
        });
    }

创建节点

create方法的参数:

  1. path:要创建的节点路径
  2. data:节点的数据
  3. acl:一个List<ACL>类型的权限集合
  4. createMode:创建的节点类型
@Test
    public void create() throws InterruptedException, KeeperException {
        //创建节点并返回节点路径/sanguo/wuguo
        String Znode = zkClient.create("/sanguo/wuguo", "liubei".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        System.out.println("Znode : "+Znode);
    }

获取子节点并监听

       只要在init方法中新建了Watcher类并实现了process方法,就会一直监听而不是监听一次就自动关闭。

 @Test
    public void getChildren() throws InterruptedException, KeeperException {
        System.out.println("--------------------");
        /**设置watcher为true之后就会自动执行init方法中watcher的重写的process方法
        * 如果process方法为空,则这里只会监听一次就关闭监听
        **/
        List<String> children = zkClient.getChildren("/sanguo", true);
        /**这个for循环只会被执行一次 真正的监听在初始化ZooKeeper对象中重写Wather的process方法里
        *一旦监听的节点有变化,就会从process方法输出监听到的变化结果
        **/    
        for (String child : children) {
            System.out.println(child);
        }
        //延时程序 作用就是让客户端一直开启 以方便返回监听到的变化结果
        Thread.sleep(Long.MAX_VALUE);
    }

        我们发现,我们监听的是"/sanguo"但是当我们在它的孙目录"/sanguo/shuguo"下创建一个新节点时监听就不会生效,这是因为它只能监听子节点。

判断节点是否存在

@Test
    public void exits() throws InterruptedException, KeeperException {
        //返回节点状态 参数1是节点 参数2是是否开启监听
        Stat stat = zkClient.exists("/sanguo", false);
        System.out.println(stat==null?"not exist":"exit");
    }

写操作流程

       我们之前的操作都是在向zookeeper集群写数据,因为我们可以把zookeeper集群看做一个分布式小型文件系统,它存储着大量的Znode数据,只要一台服务器修改了Znode信息,我们集群中的每个节点都可以立即更新。

写数据流程通常只有两种情况:

  1. 直接发送写入请求给Leader
  2. 直接发送写入请求给Flower

1. 直接发送给Leader

  1. 客户端向Leader发送写数据请求
  2. 写入数据会首先写入领导者节点,领导者将数据同步到所有副本节点,当超过半数节点完成数据同步并回复成功消息后,写操作就算完成了,并通知客户端写入成功。(加入我们的zookeeper集群有三台节点,那么只要两台(Leader+任意一台Flower)同步完成就算写入成功)

3.之后剩余未同步的节点也会马上将数据同步,并告诉Leader自己同步完成。

2. 直接发送请求给Flower

  1. 客户端发送写入请求给Flower
  2. Flower没有写入的权限,于是将请求转发给Leader
  3. Leader收到请求,自己先写入一份,再将数据同步到所有副本节点,同样当超过半数的节点写入完成后,写操作就算完成了。
  4. 这时候Leader不会去告诉客户端写入完成,而是由向它转发请求的Flower原路返回给客户端。
  5. 同样之后剩余未同步的节点也会立即将客户端写入的数据同步,并告诉Leader自己已经同步完成。


相关文章
|
12月前
|
JSON 缓存 算法
如何通过API获取1688商品类目数据:技术实现指南
1688开放平台提供alibaba.category.get接口,支持获取全量商品类目树。RESTful架构,返回JSON数据,含类目ID、名称、层级等信息。需注册账号、创建应用并授权。请求需签名认证,QPS限10次,建议缓存更新周期≥24小时。
1057 2
|
12月前
|
JSON 安全 API
亚马逊商品列表API秘籍!轻松获取商品列表数据
亚马逊商品列表API(SP-API)提供标准化接口,支持通过关键词、分类、价格等条件搜索商品,获取ASIN、价格、销量等信息。采用OAuth 2.0认证与AWS签名,保障安全。数据以JSON格式传输,便于开发者批量获取与分析。
|
12月前
|
JSON 监控 API
小红书笔记评论API:一键获取分层评论与用户互动数据
小红书笔记评论API可获取指定笔记的评论详情,包括内容、点赞数、评论者信息等,支持分页与身份认证,返回JSON格式数据,适用于舆情监控、用户行为分析等场景。
1540 1
|
12月前
|
数据采集 JSON API
微店API使用指南:高效获取商品列表数据
本文介绍如何使用Python爬虫调用微店item_search接口,根据关键词搜索商品并获取商品列表数据,涵盖请求方式、JSON数据解析、分页参数设置及筛选排序功能,适用于电商数据分析与竞品研究。
|
12月前
|
JSON API 数据格式
淘宝拍立淘按图搜索API系列,json数据返回
淘宝拍立淘按图搜索API系列通过图像识别技术实现商品搜索功能,调用后返回的JSON数据包含商品标题、图片链接、价格、销量、相似度评分等核心字段,支持分页和详细商品信息展示。以下是该API接口返回的JSON数据示例及详细解析:
|
12月前
|
JSON 算法 API
Python采集淘宝商品评论API接口及JSON数据返回全程指南
Python采集淘宝商品评论API接口及JSON数据返回全程指南
|
12月前
|
自然语言处理 监控 API
速卖通商品详情API秘籍!轻松获取SKU属性数据
速卖通商品详情API(aliexpress.item.get)支持通过编程获取商品标题、价格、SKU、库存、销量、物流模板、评价及店铺信息,适用于价格监控、选品分析等场景。接口支持多语言返回,采用AppKey+AppSecret+Token认证,需签名验证,确保安全调用。
|
12月前
|
XML JSON API
苏宁商品详情API秘籍!轻松获取商品详情数据
苏宁商品详情API基于RESTful架构,支持JSON/XML格式,通过AppKey、AppSecret与签名三重认证,结合OAuth 2.0实现安全调用。开发者可获取商品名称、价格、销量、库存、促销等实时数据,适用于电商分析与商业智能。接口强制使用HTTPS协议,支持POST/GET请求,统一采用UTF-8编码,确保数据传输安全可靠。
|
12月前
|
安全 API
亚马逊商品详情 API 秘籍!轻松获取 SKU 属性数据
亚马逊商品详情API是官方接口,通过ASIN获取商品标题、价格、库存、评价等50余项数据,支持多站点查询。包含Product Advertising API与MWS两类,分别用于商品信息获取和卖家店铺管理,采用AWS4-HMAC-SHA256认证,保障请求安全。
|
12月前
|
XML 数据采集 API
用Lxml高效解析XML格式数据:以天气API为例
免费Python教程:实战解析中国天气网XML数据,详解Lxml库高效解析技巧、XPath用法、流式处理大文件及IP封禁应对策略,助你构建稳定数据采集系统。
508 0

热门文章

最新文章