SpringBoot通过Curator框架操作Zookeeper学习笔记

SpringBoot通过Curator框架操作Zookeeper学习笔记

  • Zookeeper概念简介
  • Zookeeper的适用场景
  • Zookeeper集群搭建注意事项
  • linux操作Zookeeper命令
  • SpringBoot整合Curator以及Zookeeper依赖
  • Curator框架对Zookeeper的基本操作

Zookeeper概念简介

(1),zookeeper是一个分布式协调服务,可以为用户的分布式应用程序提供协调服务
(2),zookeeper集群中只要有半数以上存活,就可以正常服务
(3),zookeeper底层提供的功能为:管理用户提交的数据,并为用户程序提供数据节点监听服务

Zookeeper的适用场景

1.主从协调;
2. 服务器节点动态上下线;
3. 统一配置管理;
4. 分布式共享锁;
5. 统一名称服务等等;

服务器动态上下线原理:
客户端:客户端启动时会获取zk父节点下的子节点列表,并且对父节点注册监听;
服务器:服务器启动时,会去zk注册临时节点;
当服务器上下线时,父节点监听器会监听到改变,从而更新服务列表。
分布式共享锁原理(分布式部署时访问共享资源):
服务端:服务端启动时会给父节点lock注册监听,当客户端发请求时,会向lock下注册临时有序的节点,可以获取父节点下的节点列表,通过排序后,可以判断当前节点是否是节点列表中最小(大)并且是否是新增的,如果是,就可以对资源进行操作,操作完成后,删除节点;删除节点后就会触发监听,然后获取父节点lock下的节点列表,如果操作类型是删除,获取节点列表中最小的节点,让该节点去访问资源。
客户端:发送请求时向lock下注册临时有序的节点

Zookeeper集群搭建注意事项

1.修改conf下的配置文件zoo_sample.cfg.将zoo_sample.cfg改为zoo.cfg;
2.修改数据存放节点dataDir;
3.添加主机名或ip:心跳端口:数据端口;
SpringBoot通过Curator框架操作Zookeeper学习笔记_第1张图片
4.创建存放数据的文件夹与dataDir中路径一致并建立myid文件,写入1,根据集群数量依次递增;

linux操作Zookeeper命令

1.启动zookeeper:zkServer.sh start每台都需要启动
2.查看zk状态:zkServer.sh status
3.进入zk命令行操作:zkCli.sh -service

SpringBoot整合Curator以及Zookeeper依赖

<!-- 引入zookeeper -->
<dependency>
	<groupId>org.apache.curator</groupId>
	<artifactId>curator-framework</artifactId>
	<version>4.0.0</version>
</dependency>
<dependency>
	<groupId>org.apache.zookeeper</groupId>
	<artifactId>zookeeper</artifactId>
	<version>3.4.5</version>(需要与集群中版本号一致)
</dependency>
<dependency>
	<groupId>org.apache.curator</groupId>
	<artifactId>curator-recipes</artifactId>
	<version>4.0.0</version>
</dependency>

Curator框架对Zookeeper的基本操作

//1,创建zookeeper连接
CuratorFramework client1 = CuratorFrameworkFactory.builder()
		.connectString("ip:port")//连接信息
		.sessionTimeoutMs(2000)//会话超时时间
		.retryPolicy(new ExponentialBackoffRetry(1000,5))//重试策略,间隔为一秒,重试不超过5次
		.namespace("app1")//命名空间
		.build();
//2,关闭zookeeper连接
CloseableUtils.closeQuietly(client1);
//3,查询节点下的子节点
List<String> strings = client1.getChildren().forPath("/");
//4,判断节点是否存在
client1.checkExists().forPath("/abc");
//5,创建节点添加数据
client1.create()
		.creatingParentsIfNeeded()
		.withMode(CreateMode.EPHEMERAL_SEQUENTIAL)//节点类型(EPHEMERAL_SEQUENTIAL:临时序列节点;PERSISTENT_SEQUENTIAL:持久序列节点)
		.withACL(ZooDefs.Ids.OPEN_ACL_UNSAFE)//节点权限
		.forPath("/abc","sadad".getBytes());//节点名称和数据
//6,查询节点数据
String str = new String(client1.getData().storingStatIn(new Stat()).forPath("/abc"));
//7,修改节点数据
client1.setData().forPath("/abc","qwertyui".getBytes());
//8,删除节点
client1.delete()
		.guaranteed()//保障机制,若未删除成功,会话有效期内一直尝试删除
		.deletingChildrenIfNeeded()
		.withVersion(-1)
		.forPath("/abc");
//9,watch,给节点注册一次监听,可以监听到节点的增删改
client1.getChildren().usingWatcher(new CuratorWatcher() {
	@Override
	public void process(WatchedEvent watchedEvent) throws Exception {
		System.out.println("节点变化。。。"+watchedEvent.getPath()+watchedEvent.getType());
	}
}).forPath("/abc");
//10,NodeCache,一次性给节点注册多个监听,可以监听到当前节点的增删改
NodeCache nodeCache = new NodeCache(client1,"/abc");
nodeCache.getListenable().addListener(new NodeCacheListener() {
	@Override
	public void nodeChanged() throws Exception {
		if (nodeCache.getCurrentData() == null){
			System.out.println("节点被删除。。。"+nodeCache.getPath()+"数据为:"+new String(nodeCache.getCurrentData().getData()));
		}
	}
});
//11,PathChildrenCache,监听父节点下的所有子节点(可监听多次)
PathChildrenCache pathChildrenCache = new PathChildrenCache(client1,"/",true);
pathChildrenCache.getListenable().addListener(new PathChildrenCacheListener() {
	@Override
	public void childEvent(CuratorFramework client2, PathChildrenCacheEvent event) throws Exception {
		if (event.getType().equals(PathChildrenCacheEvent.Type.CHILD_ADDED)){
			//CHILD_ADDED:类型为增加;INITIALIZED:类型为初始化;CHILD_REMOVED:类型为删除;CHILD_UPDATED:类型为修改
			System.out.println("节点增加了。。。路径为:"+event.getData().getPath()+"数据为"+new String(event.getData().getData()));
		}
	}
});

本文暂时没有对zookeeper进行锁以及事务的相关操作,有兴趣的小伙伴可以参考本文参考的链接或自行找资料学习。
参考: https://blog.csdn.net/smartbetter/article/details/53083816.

你可能感兴趣的:(SpringBoot通过Curator框架操作Zookeeper学习笔记)