时间:2021-05-20
ZooKeeper 是一个典型的分布式数据一致性解决方案,分布式应用程序可以基于 ZooKeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。
Zookeeper 一个最常用的使用场景就是用于担任服务生产者和服务消费者的注册中心。 服务生产者将自己提供的服务注册到Zookeeper中心,服务的消费者在进行服务调用的时候先到Zookeeper中查找服务,获取到服务生产者的详细信息之后,再去调用服务生产者的内容与数据。如下图所示,在 Dubbo架构中 Zookeeper 就担任了注册中心这一角色。
maven依赖
<dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.6.0</version></dependency>程序其它依赖:
<!-- Logger(log4j2) --><dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.11.2</version></dependency><!-- Log4j 1.x API Bridge --><dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-1.2-api</artifactId> <version>2.11.2</version></dependency><!-- SLF4J Bridge --><dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.11.2</version></dependency><dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.6.0</version> <exclusions> <exclusion> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </exclusion> </exclusions></dependency>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。第三个参数是权限控制。 <br> * 第四个参数,CreateMode: * <li>PERSISTENT:持久化保存 * <li>PERSISTENT_SEQUENTIAL:持久化保存,并且路径附加一个自动增长的序号 * <li>EPHEMERAL:临时数据,客户端断开连接时自动删除数据(dubbo就是采用这种机制) * <li>EPHEMERAL_SEQUENTIAL:客户端断开连接时自动删除数据,并且路径会附加一个自动增长的序号 * <li>CONTAINER: * <li>PERSISTENT_WITH_TTL:客户端断开连接时自动删除数据,当节点在指定时间没有被修改且没有子目录时,数据会被删除 * <li>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<String> 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(); } }}以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
java仿Servlet生成验证码实例详解实现原理:使用BufferedImage对象的Graphics来进行绘制,然后输出成一张图片进行保存实现代码及详解:p
Servlet中操作文件详解及实例因为Servlet本来就是一个.Java文件,因此servlet中操作文件和普通java文件操作文件是一样的。读取文件主要代码
java对象拷贝详解及实例Java赋值是复制对象引用,如果我们想要得到一个对象的副本,使用赋值操作是无法达到目的的:@Testpublicvoidtestass
这篇文章主要介绍了Java中switch关键原理及用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下Sw
Java异常处理运行时异常(RuntimeException)详解及实例RuntimeExceptionRunntimeException的子类:ClassCa