首页 > 其他分享 >Zookeeper入门

Zookeeper入门

时间:2023-09-04 19:55:23浏览次数:37  
标签:zookeeper 入门 Zookeeper curator test2 org apache import

简介

ZooKeeper 是 Apache 软件基金会的一个软件项目,它为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。可以理解为zookeeper是文件系统+监听通知机制。ZooKeeper 的架构通过冗余服务实现高可用性。

Zookeeper 的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。

是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。

使用docker安装

docker pull zookeeper
docker run -d -p 2181:2181 --name zookeeper zookeeper

防火墙开启对端口2181的限制

客户端操作

下载地址

可以说 zookeeper 中的所有存储的数据都是由 znode 组成的,节点也称为 znode,并以 key/value 形式存储数据。整体结构类似于 linux 文件系统的模式以树形结构存储。其中根路径以 / 开头。

zkCli.cmd -server ip:2181
ls / #查看某个路径下目录列表
ls / -R #递归展示
create -s -e /name 'lisi' # -s代表顺序节点(/name会变成/name0000000000), -e代表临时节点(session关闭就会清除)
set /name0000000000 lisi2 #设置节点数据
get /name0000000000 #获取节点数据
stat /name0000000000 #查看节点状态信息
stat -w /name0000000000 #查看节点状态信息并监听数据变更
delete /name0000000000 #删除非空节点
deleteall /name0000000000 #删除任何节点,包括其子节点

java客户端操作

官方提供的客户端(原生API)

<dependency>
  <groupId>org.apache.zookeeper</groupId>
  <artifactId>zookeeper</artifactId>
  <version>3.5.5</version>
</dependency>
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.TimeUnit;

/**
 * 官方提供的API
 */
public class TestZookeeper {

    public static void main(String[] args) throws Exception {
        testGetAndSetData();
    }

    private static void testGetAndSetData() throws Exception {
        ZooKeeper zookeeper = createZookeeper();
        //-1表示不关心版本
        zookeeper.setData("/test2", "123".getBytes(), -1);
        byte[] data = zookeeper.getData("/test2", false, new Stat());
        System.out.println(new String(data));
        //设置监听
        zookeeper.getData("/test2", new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                System.out.println(event.getState());
                System.out.println(event.getType());
                System.out.println(event.getPath());
                //SyncConnected
                //NodeDataChanged
                //test2
            }
        },new Stat());
        TimeUnit.SECONDS.sleep(30);
    }

    private static void testCreateNode() throws Exception {
        ZooKeeper zookeeper = createZookeeper();
        zookeeper.create("/test2", "213".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
    }

    private static ZooKeeper createZookeeper() throws Exception {
        final CountDownLatch countDownLatch = new CountDownLatch(1);
        ZooKeeper zooKeeper = new ZooKeeper("ip:2181", 4000, new Watcher() {
            @Override
            public void process(WatchedEvent watchedEvent) {
                if (Event.KeeperState.SyncConnected == watchedEvent.getState()) {
                    //如果收到了服务端的响应事件,连接成功
                    countDownLatch.countDown();
                }
            }
        });
        countDownLatch.await();
        return zooKeeper;
    }

}

Curator客户端

在原生API之上封装了一层,使用更方便。

<dependency>
  <groupId>org.apache.curator</groupId>
  <artifactId>curator-framework</artifactId>
  <version>4.0.0</version>
</dependency>
<dependency>
  <groupId>org.apache.curator</groupId>
  <artifactId>curator-recipes</artifactId>
  <version>4.0.0</version>
</dependency>
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;

import java.util.concurrent.TimeUnit;

/**
 * 也是一个zookeeper客户端,在官方库的基础上又封装了一层,更加好用
 */
public class CuratorDemo {

    public static void main(String[] args) throws Exception {
//        testCreateNode();
        testSetAndGetData();
    }

    private static void testSetAndGetData() throws Exception {
        CuratorFramework curator = createCurator();
        curator.create().withMode(CreateMode.PERSISTENT).forPath("/test2", "222".getBytes());
        curator.setData().forPath("/test2", "123".getBytes());
        curator.getData()
                .usingWatcher(new Watcher() {
                    @Override
                    public void process(WatchedEvent event) {
                        System.out.println(event);
                    }
                })
                .forPath("/test2");
        TimeUnit.SECONDS.sleep(20);
        curator.close();
    }

    private static void testCreateNode() throws Exception {
        CuratorFramework curator = createCurator();
        //临时节点,连接关闭就删除
        curator.create().withMode(CreateMode.EPHEMERAL).forPath("/test2", "222".getBytes());
        TimeUnit.SECONDS.sleep(10);
        curator.close();
    }

    private static CuratorFramework createCurator() {
        CuratorFramework curatorFramework = CuratorFrameworkFactory.builder()
                .connectString("ip:2181")
                .sessionTimeoutMs(4000)
                .retryPolicy(new ExponentialBackoffRetry(1000, 3))
                .namespace("")
                .build();
        curatorFramework.start();
        return curatorFramework;
    }

}

参考

zookeeper教程:入门篇
Zookeeper框架Curator使用
Zookeeper入门实战(3)-Curator操作Zookeeper 原创

标签:zookeeper,入门,Zookeeper,curator,test2,org,apache,import
From: https://www.cnblogs.com/strongmore/p/17131239.html

相关文章

  • 快速入门
    快速入门NW.js基于Chromium 和 Node.js.NW.js利用Web技术结合Node.js及其模块进行桌面应用开发.获取NW.js您可以从官网获取最新版本的文件,或通过源代码构建.【注意】 :推荐选择SDK构建方式开发应用,这样就可以使用开发工具进行调试,参考[构建方式](Advanced/Buil......
  • 【ROS2机器人入门到实战】学会使用按键-GPIO输入
    3.学会使用按键-GPIO输入写在前面当前平台文章汇总地址:ROS2机器人从入门到实战获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取教程配套机器人开发平台:两驱版|四驱版为方便交流,搭建了机器人技术问答社区:地址fishros.org.cn你好,我是爱吃鱼香ROS的小鱼。上一节完成了LED灯的......
  • 【ROS2机器人入门到实战】嵌入式开发之从点灯开始
    第十三章嵌入式开发之从点灯开始写在前面当前平台文章汇总地址:ROS2机器人从入门到实战获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取教程配套机器人开发平台:两驱版|四驱版为方便交流,搭建了机器人技术问答社区:地址fishros.org.cn你好,我是小鱼。本章开始我们将一起走进机......
  • 【ROS2机器人入门到实战】使用开源库驱动IMU
    2.使用开源库驱动IMU写在前面当前平台文章汇总地址:ROS2机器人从入门到实战获取完整教程及配套资料代码,请关注公众号<鱼香ROS>获取教程配套机器人开发平台:两驱版|四驱版为方便交流,搭建了机器人技术问答社区:地址fishros.org.cn你好,我是爱吃鱼香ROS的小鱼。上一节我们安装好了MPU605......
  • 入门性文章要替新手多多考虑--csdn开发高手12期《利用Eclipse开发Hibernate应用程序》实
    注:本文使用Eclipse3.0.1(含中文包)测试,中英文请读者自行对应。  这篇文章总体写的不错,对于新手上路很有帮助。不过我在实践的时候也遇到了一些问题,在这里总结出来,希望大家少走弯路。1.Run的问题:“OK,Run一下”,作者仅提到这里,而对于新手,也许在这里就卡住了。怎么Run,Run什么啊?来,我......
  • MySQL入门系列1-数据定义语言(DDL)
    一、概念DDL:数据定义语言,用来定义数据库对象,包含数据库、数据表、数据表中的字段。二、数据库相关操作1.查询所有数据库showdatabases;2.查询当前所在的数据库selectdatabase();3.创建数据库createdatabaseifnotexists数据库名;4.删除数据库dropdatabase数据库名;5.切换......
  • G-LAB网工入门免费公开课~开课啦!
    带你一起走进网工的世界!G-LAB网工入门免费公开课即将开讲!无论是想学习中小型网络构建还是企业网中两台终端通信过程,这个公开课都是你不容错过的!公开课课程为期两天,9月12日&9月13日晚20:00分享主题:---网络技术的基本介绍---中小型网络构建思路及技术应用概述---企业网中两台终端通信过......
  • kubernetes(K8s)快速入门
    ......
  • Redis7 入门概述
    一、是什么RemoteDictionaryServer(远程字典服务)二、能干啥1、主流功能与应用1、分布式缓存2、内存存储和持久化(RDB+AOF)redis支持异步将内存中的数据写到硬盘上,同时不影响继续服务3、高可用架构搭配(单机主从哨兵集群)4、缓存穿透、击穿、雪崩5、分布式锁6、队列7、......
  • OpenGL入门——使用EBO绘制三角形
    上一节OpenGL入门——第一个三角形(1)-一只小瓶子-博客园(cnblogs.com)介绍了opengl怎么使用VAO和VBO绘制一个三角形这一节介绍一下使用EBO绘制 元素缓冲对象(ElementBufferObject,EBO),也叫索引缓冲对象(IndexBufferObject,IBO)。为什么会需要用到元素缓冲对象呢?因为上......