Zookeeper整合JAVA应用学习笔记

Zookeeper应用的开发主要通过java客户端API去连接和Zookeeper集群。

Zookeeper提供java客户端API:

  • Zookeeper官方的java客户端API
  • 第三方的java客户端API,比如Curator()

Zookeeper官方客户端API提供了基本操作:创建会话、创建节点、读取节点、更新数据、删除节点和检查节点是否存在等。

官方API的不足之处:(Zookeeper官方API功能比较简单,在实际开发过程中不推荐使用)

  1. Zookeeper的WatcherJ监测是一次性的,每次触发之后需要重新注册。会话超时之后没有实现重连机制。
  2. 异常处理繁琐,Zookeeper提供了很多异常,对于开发人员来说可能根本不知道如何处理这些抛出来的异常
  3. 仅提供简单的byte[]数组类型的接口,没有提供Java POJO级别的序列化数据处理接口
  4. 创建节点时如果抛出异常,需要自行检查节点是否存在
  5. 无法实现级联删除

Zookeeper原生客户端使用

引入zookeeper client依赖(与服务端保持一致,否则会有很多兼容性问题)



    org.apache.zookeeper
    zookeeper
    3.8.0

Zookeeper原生客户端主要使用org.apache.zookeeper.ZooKeeper这个类来使用ZooKeeper服务。

ZooKeeper常用构造器

Zookeeper(connectString,sessionTimeout,watcher)
  1. connectString:使用逗号分隔的列表,每个Zookeeper节点是一个host.port对,host是机器名或者IP地址,port是ZooKeeper节点对客户端提供服务的端口号。客户端会任意选取connectString中的一个节点建立连接。
  2. sessionTimeout:session timeout 时间
  3. watcher:接收来自Zookeeper集群的事件。

使用zookeeper原生API,连接zookeeper集群

public class ZkClientDemo {

    private static final  String  CONNECT_STR="localhost:2181";
    private final static  String CLUSTER_CONNECT_STR="192.168.65.156:2181,192.168.65.190:2181,192.168.65.200:2181";

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

        final CountDownLatch countDownLatch=new CountDownLatch(1);
        ZooKeeper zooKeeper = new ZooKeeper(CLUSTER_CONNECT_STR,
                4000, new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                if(Event.KeeperState.SyncConnected==event.getState() 
                        && event.getType()== Event.EventType.None){
                    //如果收到了服务端的响应事件,连接成功
                    countDownLatch.countDown();
                    System.out.println("连接建立");
                }
            }
        });
        System.out.printf("连接中");
        countDownLatch.await();
        //CONNECTED
        System.out.println(zooKeeper.getState());

        //创建持久节点
        zooKeeper.create("/user","fox".getBytes(),
                ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);

    }

}

Zookeeper主要方法

  1.  create(path,data,acl,createMode);创建一个给定路径的znode,并在znode保存data[]的数据,createMode指定znode的类型。
  2. delete(path,version):如果给定path上的znode的版本和给定的version匹配,删除znode。
  3. exists(path,watch):判断给定 path 上的 znode 是否存在,并在 znode 设置一个 watch。
  4. getData(path, watch):返回给定 path 上的 znode 数据,并在 znode 设置一个 watch。
  5. setData(path, data, version):如果给定 path 上的 znode 的版本和给定的 version 匹配,设置 znode 数据。
  6. getChildren(path, watch):返回给定 path 上的 znode 的孩子 znode 名字,并在 znode 设置一个 watch。
  7. sync(path):把客户端 session 连接节点和 leader 节点进行同步。

方法特点:

  1. 所有获取 znode 数据的 API 都可以设置一个 watch 用来监控 znode 的变化。
  2. 所有更新 znode 数据的 API 都有两个版本: 无条件更新版本和条件更新版本。如果 version 为 -1,更新为无条件更新。否则只有给定的 version 和 znode 当前的 version 一样,才会进行更新,这样的更新是条件更新。
  3. 所有的方法都有同步和异步两个版本。同步版本的方法发送请求给 ZooKeeper 并等待服务器的响 应。异步版本把请求放入客户端的请求队列,然后马上返回。异步版本通过 callback 来接受来 自服务端的响应。

同步创建节点:

@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);
}

异步创建节点:

@Test
public void createAsycTest() throws InterruptedException {
     zooKeeper.create(ZK_NODE, "data".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE,
             CreateMode.PERSISTENT,
             (rc, path, ctx, name) -> log.info("rc  {},path {},ctx {},name {}",rc,path,ctx,name),"context");
    TimeUnit.SECONDS.sleep(Integer.MAX_VALUE);
}

修改节点数据

@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());
     byte[] dataAfter = zooKeeper.getData(ZK_NODE, false, stat);
    log.info("修改后: {}",new String(dataAfter));
}

都2022年了,难道你还认为算法是“面试造火箭,工作拧螺丝”吗?

其实不管怎么说,算法仍然是最适合企业筛选程序员的面试方式之一,在字节跳动、华为等公司带动下,无论是求职者还是面试官,都逐渐认识到算法面试其实是相对高效、准确且公平的筛选机制。

优秀的小伙伴都知道,学好算法与数据结构,不单单是为了应付技术面试的需要,更重要是提升自身编程水平。一个出色的程序员不一定要精通算法,但如果连基本的算法都掌握不了,他肯定成不了优秀的程序员。有个程序员小哥哥说:搬砖 + 算法 = 稳定快速的搬砖,真相了,高质量的代码,才能让项目运行如飞!

话不多说,直接开打!

梳理知识体系

没有一个学习体系,学东西总是效率很低,只知其表,不知其里,这就是大多数程序员的现状。因此,这个时候就应该要一份知识体系图来帮助梳理自己的知识,当然,以下相关的资料可以关注+点赞小编,文末获取下载方式!

Zookeeper整合JAVA应用学习笔记_第1张图片

算法笔记必读系列

目录内容:

  • 学习算法和刷题的思路指南

  • 学习数据结构和算法读什么书

  • 动态规划解题套路框架

  • 动态规划答疑篇

  • 回溯算法解题套路框架

  • 二分查找解题套路框架

  • 滑动窗口解题套路框架

  • 双指针技巧总结

  • BFS算法套路框架

  • Linux的进程、线程、文件描述符是什么

  • Git/SQL/正则表达式的在线练习平台

Zookeeper整合JAVA应用学习笔记_第2张图片

第一章动态规划

目录内容:

  • 动态规划设计:最长递增子序列

  • 经典动态规划:0-1 背包问题

  • 经典动态规划:完全背包问题

  • 经典动态规划:子集背包问题

  • 经典动态规划:编辑距离

  • 经典动态规划:高楼扔鸡蛋

  • 经典动态规划:高楼扔鸡蛋(进阶)

  • 经典动态规划:最长公共子序列

  • 动态规划之子序列问题解题模板

  • 动态规划之博弈问题

  • 动态规划之正则表达

  • 动态规划之四键键盘

  • 动态规划之KMP字符匹配算法

  • 贪心算法之区间调度问题

  • 团灭 LeetCode 股票买卖问题

  • 团灭 LeetCode 打家劫舍问题

Zookeeper整合JAVA应用学习笔记_第3张图片

第二章算法思维系列

目录内容:

  • 回溯算法团灭子集、排列、组合问题

  • 回溯算法最佳实践:解数独

  • 回溯算法最佳实践:括号生成

  • 滑动窗口技巧

  • twoSum问题的核心思想

  • 常用的位操作

  • 拆解复杂问题:实现计算器

  • 烧饼排序

  • 前缀和技巧

  • 字符串乘法

  • FloodFill算法详解及应用

  • 区间调度之区间合并问题

  • 区间调度之区间交集问题

  • 信封嵌套问题

  • 几个反直觉的概率问题

  • 洗牌算法

  • 递归详解

Zookeeper整合JAVA应用学习笔记_第4张图片

第三章高频面试系列

目录内容:

  • 如何高效寻找素数

  • 如何高效进行模幂运算

  • 如何运用二分查找算法

  • 如何高效解决接雨水问题

  • 如何去除有序数组的重复元素

  • 如何寻找最长回文子串

  • 如何运用贪心思想玩跳跃游戏

  • 如何k个一组反转链表

  • 如何判定括号合法性

  • 如何寻找缺失的元素

  • 如何同时寻找缺失和重复的元素

  • 如何判断回文链表

  • 如何在无限序列中随机抽取元素

  • 如何调度考生的座位

  • Union-Find算法详解

  • Union-Find算法应用

  • 一行代码就能解决的算法题

  • 二分查找高效判定子序列

Zookeeper整合JAVA应用学习笔记_第5张图片

数据结构与排序篇

目录大纲:

Zookeeper整合JAVA应用学习笔记_第6张图片

最后

以上文章里写到的所有文档资料,均免费分享,有需要的关注+点赞小编,支持一下,然后关注下方公众号自行下载。

 

你可能感兴趣的:(Java,编程,程序员,zookeeper,java,分布式)