可以直接安装也可以docker安装
create /my_server/server1 "192.168.0.1"
:my_server是集群,server1是机器名字,值为机器的ip地址;get /my_server/server1
:返回server1的ip地址;create -e /my_server/server1 "192.168.0.1"
短暂创建;set * *
修改值;delete /my_server/server1
:删除节点利用观察者模式,zk客户端在服务端注册,如果节点数据有变化,就通知所有客户端的场景。
导入ZooKeeper客户端的maven依赖
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.7</version>
</dependency>
使用api
package com.chengdugay.service;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.zookeeper.*;
import org.apache.zookeeper.data.Stat;
import org.junit.Before;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.List;
@Slf4j
@SpringBootTest
public class ZKTest {
/**
* 地址
*/
private static final String ZK_SERVER_ADDRESS = "*.*.*.*:2181";
/**
* 客户端
*/
ZooKeeper zooKeeper;
/**
* 初始化
*
* @throws IOException
*/
@Before
public void init() throws IOException {
zooKeeper = new ZooKeeper(ZK_SERVER_ADDRESS, 2000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
}
});
}
@Test
public void demo() throws InterruptedException, KeeperException {
// 创建,返回key值
String s = zooKeeper.create("/server4", "192.168.1.4".getBytes(StandardCharsets.UTF_8), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
// 获取子节点变化
List<String> children = zooKeeper.getChildren("/", true);
log.info(JSON.toJSONString(children));
// 获取节点的值
byte[] data = zooKeeper.getData("/server1", false, zooKeeper.exists("/server1", false));
log.info(new String(data));
}
}
创建一个分布式服务的签名create /servers "servers"
// 获取向zk注册
zooKeeper.create("/servers/"+hostname, hostname, ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
// 其他业务逻辑
// 监听zk的变化
zooKeeper = new ZooKeeper(ZK_SERVER_ADDRESS, 2000, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
// 监听有服务有哪些机器的key
List<String> children = zooKeeper.getChildren("/servers", true);
// 获取节点的值
for (String child : children) {
byte[] data = zooKeeper.getData("/"+child, false, null);
log.info(new String(data));
}
// 业务逻辑
}
});
原理:利用“临时顺序节点”的功能,约定只有最小序号的节点才能操作业务。
实现:执行业务逻辑前先去zk注册“临时顺序节点”,然后获取最新的注册列表,如果就是自己刚才注册的,说明自己拿了锁,执行业务逻辑;如果没有,说明自己在排队,就需要监听,看自己什么时候能拿到锁,监听的事件就是“排在我前面的那个请求完成了他的业务逻辑”。
curator是一个分布锁的框架。