美文网首页
ZooKeeper应用场景:统一命名服务

ZooKeeper应用场景:统一命名服务

作者: RacyFu | 来源:发表于2019-09-28 12:40 被阅读0次

ZooKeeper用于协调分布式系统,用于资源分配,提供分布式锁,管理配置文件等。

1、统一命名服务(对某一资源命名,使其可以通过名称对资源唯一定位)

节点具有唯一性,可以保证ZNoede在分布式系统唯一。

创建、注销、查看节点

import org.apache.zookeeper.CreateMode; 

 import org.apache.zookeeper.KeeperException; 

 import org.apache.zookeeper.ZooKeeper;  

import org.apache.zookeeper.ZooDefs.Ids;

public class Naming {        

private ZooKeeper zk = null; // ZooKeeper对象

 private String nameroot = "/NameService"; 

private String namerootvalue = "IsNameService";  

private String namevalue = "IsName";  

**      * @函数:命名服务构造函数      * @参数:zk的地址端口 描述:初始化zk实例,创建命名服务根路径      */  

public Naming(String url) {  

try { 

 if (zk != null && zk.getState().isAlive() == true) 

            zk.close();  

 zk = new ZooKeeper(url, 30000, null); // 重新建立连接

} catch (Exception e) {              e.printStackTrace();          }  

// 判断是否有/NameService,如果没有则创建该路径,用来作为所有的集中配置信息的根目录

try {  

 if (zk.exists(nameroot, false) == null) {  

 zk.create(nameroot, namerootvalue.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);  

 }          } catch (KeeperException e) {              // TODO Auto-generated catch block              e.printStackTrace();              System.out.println(e.getMessage());          } catch (InterruptedException e) {              // TODO Auto-generated catch block              e.printStackTrace();              System.out.println(e.getMessage());          }      }  

/**      * @函数: 注销zk实例      */      public void UnNaming() {          if (zk != null) {              try {                  zk.close();                  System.out.println("zookeeper close success!");              } catch (InterruptedException e) {                  // TODO Auto-generated catch block                  e.printStackTrace();                  System.out.println(e.getMessage());              }              zk = null;          }      }  

 /**      * @函数:注册一个全局名字      * @描述:待注册的名字字符串name,在zk中创建一个/NameService/name的znode路径      * @参数: 待注册的名字字符串name      * @返回值: 0 表示注册成功 -1 表示出错 1 表示该命名已被注册      */      @SuppressWarnings("finally")      public int Registered(String name) {          String path = nameroot + "/" + name;          int ret = 0;          try {              if (zk.exists(path, false) == null) {                  zk.create(path, namevalue.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);                  System.out.println(name + " registered success!");              } else {                  ret = 1;                  System.out.println(name + " is exists, can not regist again!");              }          } catch (KeeperException e) {              // TODO Auto-generated catch block              ret = -1;              e.printStackTrace();              System.out.println(e.getMessage());          } catch (InterruptedException e) {              // TODO Auto-generated catch block              ret = -1;              e.printStackTrace();              System.out.println(e.getMessage());          } finally {              return ret;          }      }  

/**      * @函数:注销一个全局名字      * @描述:待注销的名字字符串name,在zk中删除/NameService/name的znode路径      * @参数: 待注销的名字字符串name      * @返回值: 0 表示注销成功 -1 表示出错 1 表示该命名未注册,不存在命名服务系统中      */      @SuppressWarnings("finally")      public int Canceled(String name) {          String path = nameroot + "/" + name;          int ret = 0;          try {              if (zk.exists(path, false) != null) {                  zk.delete(path, -1);                  System.out.println(name + " canceled success!");              } else {                  ret = 1;                  System.out.println(name + " is not exists, can not canceled!");              }          } catch (KeeperException e) {              // TODO Auto-generated catch block              ret = -1;              e.printStackTrace();              System.out.println(e.getMessage());          } catch (InterruptedException e) {              // TODO Auto-generated catch block              ret = -1;              e.printStackTrace();              System.out.println(e.getMessage());          } finally {              return ret;          }      }  

 /**      * @函数:获取命名服务系统的所有命名      * @描述:      * @参数:      * @返回值:命名列表      */      public List<String> Readall() {          List<String> namelist = new ArrayList<String>();          try {              namelist = zk.getChildren(nameroot, false);          } catch (KeeperException e) {              // TODO Auto-generated catch block              e.printStackTrace();          } catch (InterruptedException e) {              // TODO Auto-generated catch block              e.printStackTrace();          }          return namelist;      }    }  

相关文章

网友评论

      本文标题:ZooKeeper应用场景:统一命名服务

      本文链接:https://www.haomeiwen.com/subject/rsaeyctx.html