zookeeper 使用api 进行节点增删改查及实现简易的配置中心

本文涉及的产品
MSE Nacos 企业版免费试用,1600元额度,限量50份
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: zookeeper 使用api 进行节点增删改查及实现简易的配置中心

本文为博主原创,未经允许不得转载:

目录:

  1. 对 zookeeper 节点进行增删改查既配置acl 权限等

  2.使用 zookeeper  实现一个简易的配置中心


  1. 对 zookeeper 节点进行增删改查既配置acl 权限等

  apache 提供了对 zookeeper 操作的 api 操作。即引入对应的 jar 包即可进行操作zookeeper。‘

  引入 apache zookeeper 的pom 配置。这里版本请保持与服务端版本一致,不然会有很多兼容性的问题

<dependency>
             <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.5.8</version>
        </dependency>

  将对 zookeeper 进行操作的 api 使用封装了一个测试类,包含:新增节点,修改节点,删除节点,查询节点,配置节点acl 权限等,可以在其中进行测试:

package com.example.demo.zookeeper;
import lombok.extern.slf4j.Slf4j;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.ACL;
import org.apache.zookeeper.data.Id;
import org.apache.zookeeper.data.Stat;
import org.apache.zookeeper.server.auth.DigestAuthenticationProvider;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
@Slf4j
public class ZookeeperClientTest {
    // ZooKeeper服务器列表,由英文逗号分开的host:port字符串组成, 每一个都代表一台ZooKeeper机器,
    // 也可以在connectString中设 置客户端连接上ZooKeeper 后的根目录,方法是在host:port字符串之后添加上这个根目录,实现隔离
    private static final String ZK_ADDRESS="112.125.26.68:2181";
    // 会话的超时时间,单位毫秒,在一个会话周期内,ZooKeeper客户端和服务器之间会通过心跳 检测机制来维持会话的有效性,‘
    // 一旦在sessionTimeout时间内没有进行有效 的心跳检测,会话就会失效。
    private static final int SESSION_TIMEOUT = 5000;
    private static ZooKeeper zooKeeper;
    private static final String ZK_NODE="/zk‐node";
    @Before
    public void init() throws IOException, InterruptedException {
        final CountDownLatch countDownLatch=new CountDownLatch(1);
        // watchedEvent 为 Watcher事件通知处理器,该参 数可以设置为null 以表明不需要设置默认的 Watcher处理器
        zooKeeper=new ZooKeeper(ZK_ADDRESS, SESSION_TIMEOUT,watchedEvent -> {
                if (watchedEvent.getState()== Watcher.Event.KeeperState.SyncConnected &&
                        watchedEvent.getType()== Watcher.Event.EventType.None){
                    countDownLatch.countDown();
                    log.info("连接成功!");
                }
        });
        log.info("连接中....");
        countDownLatch.await();
    }
    /**
     * 新增节点数据
     *
     * @throws KeeperException
     * @throws InterruptedException
     */
    @Test
    public void createTest() throws KeeperException, InterruptedException {
        String path = zooKeeper.create(ZK_NODE, "data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
        log.info("created path: {}",path);
    }
    /**
     * 修改节点并删除指定版本节点
     * @throws KeeperException
     * @throws InterruptedException
     */
    @Test
    public void setTest() throws KeeperException, InterruptedException {
         Stat stat = new Stat();
         byte[] data = zooKeeper.getData(ZK_NODE, false, stat);
         log.info("修改前: {}",new String(data));
         zooKeeper.setData(ZK_NODE, "changed!".getBytes(), stat.getVersion());
         // getData 可以查看节点的配置数据
         byte[] dataAfter = zooKeeper.getData(ZK_NODE, false, stat);
         log.info("修改后: {}",new String(dataAfter));
         // 删除指定版本的zookeeper节点
        zooKeeper.delete(ZK_NODE,stat.getVersion());
    }
    /**
     *  用 world 模式创建节点
     *
     * @throws KeeperException
     * @throws InterruptedException
     */
    @Test
    public void createWithAclTest1() throws KeeperException, InterruptedException {
        List<ACL> acLList = new ArrayList<ACL>();
        ACL e = new ACL();
        Id m_ = new Id();
        m_.setId("anyone");
        m_.setScheme("world");
        int perms = ZooDefs.Perms.ADMIN  |  ZooDefs.Perms.READ;
        e.setId(m_);
        e.setPerms(perms);
        acLList.add(e);
        String s = getZooKeeper().create("/zk-node-1", "gj".getBytes(), acLList, CreateMode.PERSISTENT);
        log.info("create path: {}",s);
    }
    public static ZooKeeper getZooKeeper() {
        return zooKeeper;
    }
    /**
     *
     * 用授权模式创建节点
     * @throws KeeperException
     * @throws InterruptedException
     */
    @Test
    public void createWithAclTest2() throws KeeperException, InterruptedException {
        // 对连接添加授权信息
        getZooKeeper().addAuthInfo("digest","u400:p400".getBytes());
        List<ACL> acLList = new ArrayList<ACL>();
        ACL e = new ACL();
        Id m_ = new Id();
        m_.setId("u400:p400");
        m_.setScheme("auth");
        int perms = ZooDefs.Perms.ADMIN  |  ZooDefs.Perms.READ;
        e.setId(m_);
        e.setPerms(perms);
        acLList.add(e);
        String s = getZooKeeper().create("/zk-node-2", "gj".getBytes(), acLList, CreateMode.PERSISTENT);
        log.info("create path: {}",s);
    }
    @Test
    public void createWithAclTest3() throws KeeperException, InterruptedException {
        // 对连接添加授权信息
        getZooKeeper().addAuthInfo("digest","u400:p400".getBytes());
        byte[] data = getZooKeeper().getData("/test", false, null);
        log.info("GET_DATA : {}",new String(data));
    }
}

 

  2.使用 zookeeper  实现一个简易的配置中心

    通过 watcher  监听节点配置的改动,并加载 zookeeper 指定节点的配置


package com.example.demo.zookeeper;
import lombok.extern.slf4j.Slf4j;
import org.apache.zookeeper.*;
import org.apache.zookeeper.server.util.ConfigUtils;
import java.io.IOException;
import java.util.Scanner;
import java.util.concurrent.CountDownLatch;
/**
 * zookeeper 做配置中心
 * 
*/
@Slf4j
public class ZookeeperConfigCenter {
    private final  static  String connectString = "112.125.26.68:2181,112.125.26.68:2182,112.125.26.68:2183,112.125.26.68:2184";
    private static int SESSION_TIMEOUT=5* 1000;
    private static CountDownLatch countDownLatch=new CountDownLatch(1);
    private  static ZooKeeper zookeeper =null;
    private static  Watcher watcher = new Watcher() {
        @Override
        public void process(WatchedEvent event) {
            if (event.getType() == Event.EventType.None
                    && event.getState() == Event.KeeperState.SyncConnected){
                countDownLatch.countDown();
                log.info(" 连接建立");
                // start to watch config
                try {
                    log.info(" 开始监听:{}",ZooDefs.CONFIG_NODE);
                    zookeeper.getConfig(true,null);
                } catch (KeeperException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }else if( event.getPath()!=null  &&  event.getPath().equals(ZooDefs.CONFIG_NODE)){
                try {
                    byte[] config = zookeeper.getConfig(this, null);
                    String clientConfigStr = ConfigUtils.getClientConfigStr(new String(config));
                    log.info(" 配置发生变更: {}",clientConfigStr);
                    zookeeper.updateServerList(clientConfigStr.split(" ")[1]);
                } catch (KeeperException e) {
                    e.printStackTrace();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    };
    public static void main(String[] args) throws IOException, InterruptedException, KeeperException {
        zookeeper =   new ZooKeeper(connectString, SESSION_TIMEOUT, watcher);
        countDownLatch.await();
        Scanner scanner =new Scanner(System.in);
        while (true){
            byte[] data = zookeeper.getData("/zookeeper/config", true, null);
            scanner.next();
            log.info("DATA: {}",new String(data));
        }
    }
}

 


标签: zookeeper

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
打赏
0
2
2
0
77
分享
相关文章
从混乱到清晰:API开发追踪工具实用技巧与工具配置完整拆解
API开发追踪工具是提升团队协作效率、实现接口全流程管理的关键。它整合任务看板、文档同步、版本控制与多角色协作,助力前后端及第三方高效对接。本文详解其核心功能、选型建议与落地实践,助你打造透明、规范的API协作体系。
微服务引擎 MSE 及云原生 API 网关 2025 年 6 月产品动态
微服务引擎 MSE 及云原生 API 网关 2025 年 6 月产品动态
阿里云微服务引擎 MSE 及 API 网关 2025 年 6 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要。
微服务引擎 MSE 及云原生 API 网关 2025 年 3 月产品动态
微服务引擎 MSE 及云原生 API 网关 2025 年 3 月产品动态
微服务引擎 MSE 及云原生 API 网关 2025 年 2 月产品动态
微服务引擎 MSE 及云原生 API 网关 2025 年 2 月产品动态
阿里云微服务引擎 MSE 及 API 网关 2025 年 5 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
|
3月前
|
API
微服务引擎 MSE 及 API 网关 2025 年 4 月产品动态
微服务引擎 MSE 及 API 网关 2025 年 4 月产品动态
324 43
阿里云微服务引擎 MSE 及 API 网关 2025 年 4 月产品动态
阿里云微服务引擎 MSE 面向业界主流开源微服务项目, 提供注册配置中心和分布式协调(原生支持 Nacos/ZooKeeper/Eureka )、云原生网关(原生支持Higress/Nginx/Envoy,遵循Ingress标准)、微服务治理(原生支持 Spring Cloud/Dubbo/Sentinel,遵循 OpenSergo 服务治理规范)能力。API 网关 (API Gateway),提供 APl 托管服务,覆盖设计、开发、测试、发布、售卖、运维监测、安全管控、下线等 API 生命周期阶段。帮助您快速构建以 API 为核心的系统架构.满足新技术引入、系统集成、业务中台等诸多场景需要
阿里云微服务引擎 MSE 及 API 网关 2025 年 4 月产品动态
1688 商品列表 API 深度拆解:从参数配置到数据获取
1688 是重要的批发采购平台,其商品列表 API 接口为开发者、商家和数据分析人员提供批量获取商品基础信息(如名称、价格、销量等)的能力。该接口支持市场调研、竞品分析等场景,助力商业决策与效率提升。接口基于 HTTPS 协议,采用 GET 或 POST 请求方式,需提供通用参数(如 app_key、timestamp 等)和业务参数(如 category_id、page_no 等)。响应数据以 JSON 格式返回,包含商品详情及分页信息。
146 13
AI助理
登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问

你好,我是AI助理

可以解答问题、推荐解决方案等