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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
任务调度 XXL-JOB 版免费试用,400 元额度,开发版规格
云原生网关 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实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
相关文章
|
26天前
|
XML JSON API
淘宝商品详情API的调用流程(python请求示例以及json数据示例返回参考)
JSON数据示例:需要提供一个结构化的示例,展示商品详情可能包含的字段,如商品标题、价格、库存、描述、图片链接、卖家信息等。考虑到稳定性,示例应基于淘宝开放平台的标准响应格式。
|
1月前
|
存储 供应链 监控
1688商品数据实战:API搜索接口开发与供应链分析应用
本文详细介绍了如何通过1688开放API实现商品数据的获取与应用,涵盖接入准备、签名流程、数据解析存储及商业化场景。开发者可完成智能选品、价格监控和供应商评级等功能,同时提供代码示例与问题解决方案,确保法律合规与数据安全。适合企业开发者快速构建供应链管理系统。
|
15天前
|
数据采集 搜索推荐 API
Python 原生爬虫教程:京东商品列表页面数据API
京东商品列表API是电商大数据分析的重要工具,支持开发者、商家和研究人员获取京东平台商品数据。通过关键词搜索、分类筛选、价格区间等条件,可返回多维度商品信息(如名称、价格、销量等),适用于市场调研与推荐系统开发。本文介绍其功能并提供Python请求示例。接口采用HTTP GET/POST方式,支持分页、排序等功能,满足多样化数据需求。
|
1月前
|
前端开发 Cloud Native Java
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
Java||Springboot读取本地目录的文件和文件结构,读取服务器文档目录数据供前端渲染的API实现
|
1月前
|
人工智能 自然语言处理 关系型数据库
不写一行代码,用MCP+魔搭API-Inference 搭建一个本地数据助手! 附所有工具和清单
还在为大模型开发的复杂技术栈、框架不兼容和工具调用问题头疼吗?MCP(Model Context Protocol servers)来拯救你了!它用统一的技术栈、兼容主流框架和简化工具调用的方式,让大模型开发变得简单高效。
484 1
|
1月前
|
JSON API 数据格式
Python 请求微店商品详情数据 API 接口
微店开放平台允许开发者通过API获取商品详情数据。使用Python请求微店商品详情API的主要步骤包括:1. 注册并申请API权限,获得app_key和app_secret;2. 确定API接口地址与请求参数,如商品ID;3. 生成签名确保请求安全合法;4. 使用requests库发送HTTP请求获取数据;5. 处理返回的JSON格式响应数据。开发时需严格遵循微店API文档要求。
|
15天前
|
数据采集 API 数据格式
Python 原生爬虫教程:京东商品详情页面数据API
本文介绍京东商品详情API在电商领域的应用价值及功能。该API通过商品ID获取详细信息,如基本信息、价格、库存、描述和用户评价等,支持HTTP请求(GET/POST),返回JSON或XML格式数据。对于商家优化策略、开发者构建应用(如比价网站)以及消费者快速了解商品均有重要意义。研究此API有助于推动电商业务创新与发展。
|
1月前
|
缓存 监控 API
微店商品详情API接口实战指南:从零实现商品数据自动化获取
本文介绍了微店商品详情API接口的应用,涵盖申请与鉴权、签名加密、数据解析等内容。通过Python实战演示了5步获取商品数据的流程,并提供了多平台同步、价格监控等典型应用场景。开发者可利用此接口实现自动化操作,提升电商运营效率,降低人工成本。文中还总结了频率限制、数据缓存等避坑指南,助力开发者高效使用API。
|
1月前
|
数据采集 消息中间件 API
微店API开发全攻略:解锁电商数据与业务自动化的核心能力
微店开放平台提供覆盖商品、订单、用户、营销、物流五大核心模块的API接口,支持企业快速构建电商中台系统。其API体系具备模块化设计、双重认证机制、高并发支持和数据隔离等特性。文档详细解析了商品管理、订单处理、营销工具等核心接口功能,并提供实战代码示例。同时,介绍了企业级整合方案设计,如订单全链路自动化和商品数据中台架构,以及性能优化与稳定性保障措施。最后,针对高频问题提供了排查指南,帮助开发者高效利用API实现电商数智化转型。适合中高级开发者阅读。
|
1月前
|
机器学习/深度学习 JSON 算法
淘宝拍立淘按图搜索API接口系列的应用与数据解析
淘宝拍立淘按图搜索API接口是阿里巴巴旗下淘宝平台提供的一项基于图像识别技术的创新服务。以下是对该接口系列的应用与数据解析的详细分析