需求---->
某分布式系统当中,祝节点有多台,可以进行动态上下线,当有任何一台机器发生了动态的上下线,任何一台客户端都能感知得到。
思路---->
1、创建客户端与服务端
2、启动client 监听
3、启动server 注册
4、当server端 发生上下线
5、client都能感知的到
public class ZKServer{
public static void main(String[] args){
ZKServer zkServer = new ZKServer();
//1、连接zkServer
zkServer.getConnect();
//2、注册节点信息 服务器IP添加到zk中
zkServer.regist(args[0]);
//3、业务逻辑处理
zkServer.bulid(args[0])
}
private String connectString="ip1:2181,ip2:2181,ip3:2181";
private int sessionTimeout = 3000;
ZooKeeper zkCli = null;
//定义父jiedian
private String parentNode = "/servers";
//连接zkServer
public void getConnect() throws Exception{
zkCli = new ZooKeeper(connectString,sessionTimeout,new Watcher(){
@Override
public void process(WatchedEvent event){
}
});
}
//注册信息
public void regist(String hostname){
zkCli.create(parentNode + "/server", hostname.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL);
System.out.println(node);
}
//构造服务器
public void build(String hostname) throws InterruptException{
System.out.println(hostname+":服务器上线了");
Thread.sleep(Long.MAX_VALUE);
}
}
//客户端
public class ZkClient{
main{
//1、获取链接
ZkClient zkClient = new ZkClient();
zkClient.getConnetc();
//2、监听服务的节点信息
zkClient.getServers();
//3、业务逻辑(一直监听)
zkClient.getWatch();
}
private String connectString="ip1:2181,ip2:2181,ip3:2181";
private int sessionTimeout = 3000;
ZooKeeper zkCli;
public void getConnetc() throws KeeperException, InterruptException {
zkCli = new ZooKeeper(connectString,sessionTimeout,new Watcher(){
@Override
public void process(WatchedEvent event){
List<String> children ;
try{
//监听父节点
children = zkCli.getChildren("/servers", true);
//创建集合存储服务器列表
ArrayList<String> serverList = new ArrayList<String>();
//获取每个节点的数据
for(String c: children){
byte[] data = zkCli.getData("/servers"+c, true, null);
serverList.add(new String(data));
}
//打印服务器列表
System.out.println(serverList);
}catch(Excepetion e){
e.printStackTrace();
}
}
});
}
public void getServers(){
List<String> chidren = zkCli.getChildren("/servers", true);
//创建集合存储服务器列表
ArrayList<String> serverList = new ArrayList<String>();
//获取每个节点的数据
for(String c: children){
byte[] data = zkCli.getData("/servers"+c, true, null);
serverList.add(new String(data));
}
//打印服务器列表
System.out.println(serverList);
}
public void getWatch() throws InterruptException{
Thread.sleep(Long.MAX_VALUE);
}
}