热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Java操作Zookeeper原理及过程详解

这篇文章主要介绍了Java操作Zookeeper原理及过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

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

Zookeeper 一个最常用的使用场景就是用于担任服务生产者和服务消费者的注册中心。 服务生产者将自己提供的服务注册到Zookeeper中心,服务的消费者在进行服务调用的时候先到Zookeeper中查找服务,获取到服务生产者的详细信息之后,再去调用服务生产者的内容与数据。如下图所示,在 Dubbo架构中 Zookeeper 就担任了注册中心这一角色。

maven依赖


  org.apache.zookeeper
  zookeeper
  3.6.0

程序其它依赖:



  org.apache.logging.log4j
  log4j-core
  2.11.2



  org.apache.logging.log4j
  log4j-1.2-api
  2.11.2



  org.apache.logging.log4j
  log4j-slf4j-impl
  2.11.2



  org.apache.zookeeper
  zookeeper
  3.6.0
  
    
      org.slf4j
      slf4j-log4j12
    
  

API操作代码:

package com.zhi.test;

import java.util.List;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
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 org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestInstance;
import org.junit.jupiter.api.TestInstance.Lifecycle;
import org.junit.jupiter.api.TestMethodOrder;

/**
 * Zookeeper操作测试
 * 
 * @author 张远志
 * @since 2020年5月3日14:31:28
 *
 */
@TestInstance(Lifecycle.PER_CLASS)
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class ZookeeperTest {
  private final Logger logger = LogManager.getLogger(this.getClass());
  private ZooKeeper zooKeeper;
  private final String path = "/test";

  @BeforeAll
  public void init() throws Exception {
    zooKeeper = new ZooKeeper("192.168.59.131:2181", 60000, new Watcher() {
      public void process(WatchedEvent event) {
        logger.info("事件类型:{},路径:{}", event.getType(), event.getPath());
      }
    });
  }

  /**
   * 添加数据,当路径已经存在时会报错,初始版本号为0。第三个参数是权限控制。 
* 第四个参数,CreateMode: *
  • PERSISTENT:持久化保存 *
  • PERSISTENT_SEQUENTIAL:持久化保存,并且路径附加一个自动增长的序号 *
  • EPHEMERAL:临时数据,客户端断开连接时自动删除数据(dubbo就是采用这种机制) *
  • EPHEMERAL_SEQUENTIAL:客户端断开连接时自动删除数据,并且路径会附加一个自动增长的序号 *
  • CONTAINER: *
  • PERSISTENT_WITH_TTL:客户端断开连接时自动删除数据,当节点在指定时间没有被修改且没有子目录时,数据会被删除 *
  • PERSISTENT_SEQUENTIAL_WITH_TTL:客户端断开连接时自动删除数据,路径会附加一个自动增长的序号,且当节点在指定时间没有被修改且没有子目录时,数据会被删除 */ @Order(1) @Test public void create() { try { String back = zooKeeper.create(path, "这是一个测试".getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT); logger.info("添加一条数据成功,实际路径:{}", back); } catch (Exception e) { logger.error("调用create出错", e); } } /** * 判断路径是否存在,不存在时返回null */ @Order(2) @Test public void exists() { try { Stat stat = zooKeeper.exists(path, false); logger.info("路径为{}的节点{}存在", path, stat == null ? "不" : ""); } catch (Exception e) { logger.error("调用exists出错", e); } } /** * 查询数据,路径不存在时会报错 */ @Order(3) @Test public void find() { try { byte[] bits = zooKeeper.getData(path, false, new Stat()); // 路径不存在时会报错 String data = new String(bits); logger.info("路径{}查询到数据:{}", path, data); } catch (Exception e) { logger.error("调用getData出错", e); } } /** * 获取子目录,结果为空时返回一个长度为0的ArrayList */ @Order(3) @Test public void children() { try { List list = zooKeeper.getChildren(path, false); logger.info("路径{}的子目录有:{}", path, String.join("、", list.toArray(new String[0]))); } catch (Exception e) { logger.error("调用getChildren出错", e); } } /** * 修改数据,路径不存在时会报错,版本号与存储中不一致时也报错 */ @Order(4) @Test public void udpate() { try { Stat stat = zooKeeper.exists(path, false); if (stat != null) { stat = zooKeeper.setData(path, "这是一个修改测试".getBytes(), stat.getVersion()); // 版本号为-1时不做版本校验 logger.info("数据修改成功,原版本号:{},新版本号:{}", stat.getAversion(), stat.getVersion()); } } catch (Exception e) { logger.error("调用setData出错", e); } } /** * 删除节点,路径不存在时报错,版本号不一致时也会报错 */ @Order(5) @Test public void delete() { try { zooKeeper.delete(path, -1); // -1表示不做版本校验 logger.info("根据path删除数据成功"); } catch (Exception e) { logger.error("调用delete出错", e); } } @AfterAll public void destory() throws Exception { if (zooKeeper != null) { zooKeeper.close(); } } }
  • 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。


    推荐阅读
    • 深入解析Spring Cloud Ribbon负载均衡机制
      本文详细介绍了Spring Cloud中的Ribbon组件如何实现服务调用的负载均衡。通过分析其工作原理、源码结构及配置方式,帮助读者理解Ribbon在分布式系统中的重要作用。 ... [详细]
    • HBase运维工具全解析
      本文深入探讨了HBase常用的运维工具,详细介绍了每种工具的功能、使用场景及操作示例。对于HBase的开发人员和运维工程师来说,这些工具是日常管理和故障排查的重要手段。 ... [详细]
    • 深入解析Spring Cloud微服务架构与分布式系统实战
      本文详细介绍了Spring Cloud在微服务架构和分布式系统中的应用,结合实际案例和最新技术,帮助读者全面掌握微服务的实现与优化。 ... [详细]
    • 本文将详细介绍如何在ThinkPHP6框架中实现多数据库的部署,包括读写分离的策略,以及如何通过负载均衡和MySQL同步技术优化数据库性能。 ... [详细]
    • window下kafka的安装以及测试
      目录一、安装JDK(需要安装依赖javaJDK)二、安装Kafka三、测试参考在Windows系统上安装消息队列kafka一、安装JDKÿ ... [详细]
    • Zookeeper面试常见问题解析
      本文详细介绍了Zookeeper中的ZAB协议、节点类型、ACL权限控制机制、角色分工、工作状态、Watch机制、常用客户端、分布式锁实现、默认通信框架以及消息广播和领导选举的流程。 ... [详细]
    • 一面问题:MySQLRedisKafka线程算法mysql知道哪些存储引擎,它们的区别mysql索引在什么情况下会失效mysql在项目中的优化场景&# ... [详细]
    • Hadoop入门与核心组件详解
      本文详细介绍了Hadoop的基础知识及其核心组件,包括HDFS、MapReduce和YARN。通过本文,读者可以全面了解Hadoop的生态系统及应用场景。 ... [详细]
    • 随着网络安全威胁的不断演变,电子邮件系统成为攻击者频繁利用的目标。本文详细探讨了电子邮件系统中的常见漏洞及其潜在风险,并提供了专业的防护建议。 ... [详细]
    • 在本周的白板演练中,Apache Flink 的 PMC 成员及数据工匠首席技术官 Stephan Ewen 深入探讨了如何利用保存点功能进行流处理中的数据重新处理、错误修复、系统升级和 A/B 测试。本文将详细解释保存点的工作原理及其应用场景。 ... [详细]
    • 本文探讨了如何在日常工作中通过优化效率和深入研究核心技术,将技术和知识转化为实际收益。文章结合个人经验,分享了提高工作效率、掌握高价值技能以及选择合适工作环境的方法,帮助读者更好地实现技术变现。 ... [详细]
    • 深入理解一致性哈希算法及其应用
      本文详细介绍了分布式系统中的一致性哈希算法,探讨其原理、优势及应用场景,帮助读者全面掌握这一关键技术。 ... [详细]
    • ZooKeeper集群脑裂问题及其解决方案
      本文深入探讨了ZooKeeper集群中可能出现的脑裂问题,分析其成因,并提供了多种有效的解决方案,确保集群在高可用性环境下的稳定运行。 ... [详细]
    • 全面解析运维监控:白盒与黑盒监控及四大黄金指标
      本文深入探讨了白盒和黑盒监控的概念,以及它们在系统监控中的应用。通过详细分析基础监控和业务监控的不同采集方法,结合四个黄金指标的解读,帮助读者更好地理解和实施有效的监控策略。 ... [详细]
    • 免费获取:全面更新的Linux集群视频教程及配套资源
      本资源包含最新的Linux集群视频教程、详细的教学资料、实用的学习课件、完整的源代码及多种软件开发工具。百度网盘链接:https://pan.baidu.com/s/1roYoSM0jHqa3PrCfaaaqUQ,提取码:41py。关注我们的公众号,获取更多更新的技术教程。 ... [详细]
    author-avatar
    热情的海浪公主
    这个家伙很懒,什么也没留下!
    PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
    Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有