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 使用api 进行节点增删改查及实现简易的配置中心的更多相关文章
- zkCli的使用 常用的节点增删改查命令用法
zkCli的使用 常用的节点增删改查命令用法 1. 建立会话 命令格式:zkCli.sh -timeout 0 -r -server ip:port ./zkCli.sh -server -time ...
- Android(java)学习笔记193:利用谷歌API对数据库增删改查(推荐使用)
接下来我们通过项目案例来介绍:这个利用谷歌API对数据库增删改查 1.首先项目图: 2.这里的布局文件activity_main.xml: <LinearLayout xmlns:android ...
- 前端使用AngularJS的$resource,后端ASP.NET Web API,实现增删改查
AngularJS中的$resource服务相比$http服务更适合与RESTful服务进行交互.本篇后端使用ASP.NET Web API, 前端使用$resource,实现增删改查. 本系列包括: ...
- 使用HttpClient对ASP.NET Web API服务实现增删改查
本篇体验使用HttpClient对ASP.NET Web API服务实现增删改查. 创建ASP.NET Web API项目 新建项目,选择"ASP.NET MVC 4 Web应用程序&quo ...
- Android(java)学习笔记136:利用谷歌API对数据库增删改查(推荐使用)
接下来我们通过项目案例来介绍:这个利用谷歌API对数据库增删改查 1. 首先项目图: 2. 这里的布局文件activity_main.xml: <LinearLayout xmlns:andro ...
- Zookeeper节点增删改查与集群搭建(笔记)
1.上传文件目录说明 上传的文件一般放在 /home/下 安装文件一般在 /usr/local/下 2. 安装zookeeper 2.1将zookeeper-3.4.11.tar.gz拷贝到/home ...
- java中XML操作:xml与string互转、读取XML文档节点及对XML节点增删改查
一.XML和String互转: 使用dom4j程式变得很简单 //字符串转XML String xmlStr = \"......\"; Document document = D ...
- DOM操作 JS事件 节点增删改查
--------------------------习惯是社会的巨大的飞轮和最可贵的维护者.——威·詹姆斯 day 49 [value属性操作] <!DOCTYPE html><ht ...
- Hibernate之API初识及增删改查实现
声明:关于hibernate的学习.非常大一部分东西都是概念性的. 大家最好手里都有一份学习资料,在我的博文中.我不会把书本上的概念一类的东西搬过来.那没有不论什么意义.关于hibernate的学习, ...
- JS DOM节点增删改查 属性设置
一.节点操作 增 createElement(name)创建元素 appendChild();将元素添加 删 获得要删除的元素 获得它的父元素 使用removeChild()方法删除 改 第一种方 ...
随机推荐
- MD5在文件安全中的应用与重要性
一.MD5简介 MD5(Message-Digest Algorithm 5)是一种广泛应用的密码散列函数,由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)于1992年提出.它主 ...
- 一文读懂遗传算法(附python)
几天前,我着手解决一个实际问题--大型超市销售问题.在使用了几个简单模型做了一些特征工程之后,我在排行榜上名列第 219 名. 虽然结果不错,但是我还是想做得更好.于是,我开始研究可以提高分数的优化方 ...
- 安装华企盾DSC防泄密软件:编辑文件不加密常见问题,运维工程师必看
1.先查看客户端日志主进程是否是加密进程.日志中是不是勾选智能半透明.加密类型是否有添加 2.用procmon监控保存的文件找出writefile的进程是否有添加,进程树是否有父进程,加密类型是否正确 ...
- DVWA Insecure CAPTCHA(不安全的验证码)全等级
Insecure CAPTCHA(不安全的验证码) 目录: Insecure CAPTCHA(不安全的验证码) 1. Low 2.Medium 3. High 4.Impossible 加载验证码需要 ...
- Spring Boot与Shiro和Mybatis整合
1:shiro是什么? Apache Shiro 是ASF旗下的一款开源软件 shrio是一款强大而灵活的安全框架 可为任何应用提供安全保障- 从命令行应用.移动应用到大型网络及企业应用 2:shir ...
- Java日期时间处理详解
Java中SimpleDateFormat.LocalDateTime和DateTimeFormatter的区别及使用 在Java的世界里,处理日期和时间是常见的任务.尤其在Java 8之前,Simp ...
- 微信小程序中业务域名的配置
需要配置业务域名,需要先将域名http转https 1,首先在该微信小程序的公众号平台中下载 业务域名的证书 2,将下载的证书放进nginx的根目录 3,在nginx中 (root为.txt的地址)
- gitee图床不能用了,心态崩了
起因 大概上周五晚上吧,想着可以正常下班了.也没啥事,正好可以逛逛自己的小破站,看看有没有小伙伴留言什么的. 然后发现小破站图片显示不出来了... 一开始也没在意,想着可能是Gitee又挂了,可能一会 ...
- 记录:websoket切换页面后重复执行问题
问题描述 因为项目需求,实时播放执行信息.而项目的websoket只在这个页面,会有切换情况.从websoket连接得到执行列表数据.断开重连后会传递新连接数据+旧连接数据.也就是说,如果第一次进入页 ...
- Python 绑定:从 Python 调用 C 或 C++
摘要:您是拥有想要从 Python 中使用的C或 C++ 库的 Python 开发人员吗?如果是这样,那么Python 绑定允许您调用函数并将数据从 Python 传递到C或C++,让您利用这两种语言 ...