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

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: 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自己已经同步完成。


相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
9天前
|
人工智能 关系型数据库 MySQL
数据魔力,一触即发 —— Dataphin数据服务API,百炼插件新星降临!
本文通过一个利用百炼大模型平台和Dataphin数据服务API构建一个客户360智能应用的案例,介绍如何使用Dataphin数据服务API在百炼平台创建一个自定义插件,用于智能应用的开发,提升企业智能化应用水平。
数据魔力,一触即发 —— Dataphin数据服务API,百炼插件新星降临!
|
6天前
|
XML 数据可视化 API
商品详情数据实战案例,API接口系列
淘宝商品详情数据在电商领域具有广泛的应用价值,而淘宝商品详情API接口则为开发者提供了获取这些数据的重要途径。通过合理利用这些接口和数据,可以提升业务效率、优化用户体验,为电商行业的发展注入新的活力。
|
10天前
|
SQL 缓存 API
在API接口数据获取过程中,如何确保数据的安全性和隐私性?
在API接口数据获取过程中,确保数据的安全性和隐私性至关重要。本文介绍了身份认证与授权、防止SQL注入和XSS攻击、加密传输、API版本控制、限流与熔断、压力测试与性能优化、备份与恢复以及法律和伦理考量等关键措施,帮助开发者和管理者有效保护API接口的数据安全和隐私性。
|
17天前
|
前端开发 JavaScript API
探索GraphQL:如何构建高效的数据API
【10月更文挑战第25天】在现代Web开发中,API的效率和灵活性至关重要。本文探讨了如何利用GraphQL构建高效的数据API。GraphQL通过声明式查询方式,允许客户端精确指定所需数据,减少数据传输量,提高API效率。文章介绍了设置GraphQL服务器、设计API Schema、实现解析函数及调整前后端交互的具体步骤,展示了GraphQL的优势和应用场景。
31 2
|
7天前
|
JSON API 数据安全/隐私保护
拍立淘按图搜索API接口返回数据的JSON格式示例
拍立淘按图搜索API接口允许用户通过上传图片来搜索相似的商品,该接口返回的通常是一个JSON格式的响应,其中包含了与上传图片相似的商品信息。以下是一个基于淘宝平台的拍立淘按图搜索API接口返回数据的JSON格式示例,同时提供对其关键字段的解释
|
17天前
|
JSON 前端开发 JavaScript
API接口商品详情接口数据解析
商品详情接口通常用于提供特定商品的详细信息,这些信息比商品列表接口中的信息更加详细和全面。以下是一个示例的JSON数据格式,用于表示一个商品详情API接口的响应。这个示例假定API返回一个包含商品详细信息的对象。
|
17天前
|
存储 监控 安全
API接口数据获取全流程用户指南
本文介绍了从明确需求到数据存储与管理的API接口数据获取全流程。首先,明确业务需求和选择合适的数据源;接着,准备API接口,包括审查文档、申请密钥和安全存储;然后,构建与发送请求,处理响应与数据;最后,进行数据存储与管理,并持续监控与优化,确保数据的安全与合规。通过这些步骤,用户可以高效地获取和管理数据,为数据分析和业务优化提供支持。
|
4天前
|
JSON API 数据格式
淘宝 / 天猫官方商品 / 订单订单 API 接口丨商品上传接口对接步骤
要对接淘宝/天猫官方商品或订单API,需先注册淘宝开放平台账号,创建应用获取App Key和App Secret。之后,详细阅读API文档,了解接口功能及权限要求,编写认证、构建请求、发送请求和处理响应的代码。最后,在沙箱环境中测试与调试,确保API调用的正确性和稳定性。
|
16天前
|
供应链 数据挖掘 API
电商API接口介绍——sku接口概述
商品SKU(Stock Keeping Unit)接口是电商API接口中的一种,专门用于获取商品的SKU信息。SKU是库存量单位,用于区分同一商品的不同规格、颜色、尺寸等属性。通过商品SKU接口,开发者可以获取商品的SKU列表、SKU属性、库存数量等详细信息。
|
17天前
|
JSON API 数据格式
店铺所有商品列表接口json数据格式示例(API接口)
当然,以下是一个示例的JSON数据格式,用于表示一个店铺所有商品列表的API接口响应

热门文章

最新文章