基于

zookeeper应用——简单统一命名服务实现

zookeeper的应用在

http://www.ibm.com/developerworks/cn/opensource/os-cn-zookeeper/index.html

上已经列举出来,本文根据自己业务需要,实现了公司的统一命名服务。

统一命名服务(Name Service

分布式应用中,通常需要有一套完整的命名规则,既能够产生唯一的名称又便于人识别和记住,通常情况下用树形的名称结构是一个理想的选择,树形的名称结构是一个有层次的目录结构,既对人友好又不会重复。说到这里你可能想到了 JNDI,没错 Zookeeper 的 Name Service 与 JNDI 能够完成的功能是差不多的,它们都是将有层次的目录结构关联到一定资源上,但是 Zookeeper 的 Name Service 更加是广泛意义上的关联,也许你并不需要将名称关联到特定资源上,你可能只需要一个不会重复名称,就像数据库中产生一个唯一的数字主键一样。

Name Service 已经是 Zookeeper 内置的功能,你只要调用 Zookeeper 的 API 就能实现。如调用 create 接口就可以很容易创建一个目录节点。

zk系统中创建的节点可以保证在分布式服务器上是全局唯一的。


命名服务提供注册、注销和查看命名等接口。

命名服务的关键逻辑

[java]  view plain  copy
  1. /** 
  2.  * 标题:统一命名服务 
  3.  * 作者: 
  4.  * 时间:2013-04-17 
  5.  * 描述:提供了Naming类,给分布式程序开发人员或其一个分布式全局唯一的命名。 
  6.  */  
  7. package com.my.nameservice;  
  8.   
  9. import java.util.ArrayList;  
  10. import java.util.List;  
[java]  view plain  copy
  1. import org.apache.zookeeper.CreateMode;  
  2. import org.apache.zookeeper.KeeperException;  
  3. import org.apache.zookeeper.ZooKeeper;  
  4. import org.apache.zookeeper.ZooDefs.Ids;  
  5.   
  6. public class Naming {  
  7.     private ZooKeeper zk = null// ZooKeeper对象  
  8.     private String nameroot = "/NameService";  
  9.     private String namerootvalue = "IsNameService";  
  10.     private String namevalue = "IsName";  
  11.   
  12.     /** 
  13.      * @函数:命名服务构造函数 
  14.      * @参数:zk的地址端口 描述:初始化zk实例,创建命名服务根路径 
  15.      */  
  16.     public Naming(String url) {  
  17.         try {  
  18.             // 初始化,如果当前有alive的zk连接则先关闭  
  19.             if (zk != null && zk.getState().isAlive() == true)  
  20.                 zk.close();  
  21.             zk = new ZooKeeper(url, 30000null); // 重新建立连接  
  22.             System.out.println("zookeeper connect success:url=" + url);  
  23.         } catch (Exception e) {  
  24.             e.printStackTrace();  
  25.         }  
  26.         // 判断是否有/NameService,如果没有,则创建该路径,用来作为所有的集中配置信息的根目录  
  27.         try {  
  28.             if (zk.exists(nameroot, false) == null) {  
  29.                 zk.create(nameroot, namerootvalue.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);  
  30.                 System.out.println(nameroot + " create success!");  
  31.             }  
  32.         } catch (KeeperException e) {  
  33.             // TODO Auto-generated catch block  
  34.             e.printStackTrace();  
  35.             System.out.println(e.getMessage());  
  36.         } catch (InterruptedException e) {  
  37.             // TODO Auto-generated catch block  
  38.             e.printStackTrace();  
  39.             System.out.println(e.getMessage());  
  40.         }  
  41.     }  
  42.   
  43.     /** 
  44.      * @函数: 注销zk实例 
  45.      */  
  46.     public void UnNaming() {  
  47.         if (zk != null) {  
  48.             try {  
  49.                 zk.close();  
  50.                 System.out.println("zookeeper close success!");  
  51.             } catch (InterruptedException e) {  
  52.                 // TODO Auto-generated catch block  
  53.                 e.printStackTrace();  
  54.                 System.out.println(e.getMessage());  
  55.             }  
  56.             zk = null;  
  57.         }  
  58.     }  
  59.   
  60.     /** 
  61.      * @函数:注册一个全局名字 
  62.      * @描述:待注册的名字字符串name,在zk中创建一个/NameService/name的znode路径 
  63.      * @参数: 待注册的名字字符串name 
  64.      * @返回值: 0 表示注册成功 -1 表示出错 1 表示该命名已被注册 
  65.      */  
  66.     @SuppressWarnings("finally")  
  67.     public int Registered(String name) {  
  68.         String path = nameroot + "/" + name;  
  69.         int ret = 0;  
  70.         try {  
  71.             if (zk.exists(path, false) == null) {  
  72.                 zk.create(path, namevalue.getBytes(), Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);  
  73.                 System.out.println(name + " registered success!");  
  74.             } else {  
  75.                 ret = 1;  
  76.                 System.out.println(name + " is exists, can not regist again!");  
  77.             }  
  78.         } catch (KeeperException e) {  
  79.             // TODO Auto-generated catch block  
  80.             ret = -1;  
  81.             e.printStackTrace();  
  82.             System.out.println(e.getMessage());  
  83.         } catch (InterruptedException e) {  
  84.             // TODO Auto-generated catch block  
  85.             ret = -1;  
  86.             e.printStackTrace();  
  87.             System.out.println(e.getMessage());  
  88.         } finally {  
  89.             return ret;  
  90.         }  
  91.     }  
  92.   
  93.     /** 
  94.      * @函数:注销一个全局名字 
  95.      * @描述:待注销的名字字符串name,在zk中删除/NameService/name的znode路径 
  96.      * @参数: 待注销的名字字符串name 
  97.      * @返回值: 0 表示注销成功 -1 表示出错 1 表示该命名未注册,不存在命名服务系统中 
  98.      */  
  99.     @SuppressWarnings("finally")  
  100.     public int Canceled(String name) {  
  101.         String path = nameroot + "/" + name;  
  102.         int ret = 0;  
  103.         try {  
  104.             if (zk.exists(path, false) != null) {  
  105.                 zk.delete(path, -1);  
  106.                 System.out.println(name + " canceled success!");  
  107.             } else {  
  108.                 ret = 1;  
  109.                 System.out.println(name + " is not exists, can not canceled!");  
  110.             }  
  111.         } catch (KeeperException e) {  
  112.             // TODO Auto-generated catch block  
  113.             ret = -1;  
  114.             e.printStackTrace();  
  115.             System.out.println(e.getMessage());  
  116.         } catch (InterruptedException e) {  
  117.             // TODO Auto-generated catch block  
  118.             ret = -1;  
  119.             e.printStackTrace();  
  120.             System.out.println(e.getMessage());  
  121.         } finally {  
  122.             return ret;  
  123.         }  
  124.     }  
  125.   
  126.     /** 
  127.      * @函数:获取命名服务系统的所有命名 
  128.      * @描述: 
  129.      * @参数: 
  130.      * @返回值:命名列表 
  131.      */  
  132.     public List<String> Readall() {  
  133.         List<String> namelist = new ArrayList<String>();  
  134.         try {  
  135.             namelist = zk.getChildren(nameroot, false);  
  136.         } catch (KeeperException e) {  
  137.             // TODO Auto-generated catch block  
  138.             e.printStackTrace();  
  139.         } catch (InterruptedException e) {  
  140.             // TODO Auto-generated catch block  
  141.             e.printStackTrace();  
  142.         }  
  143.         return namelist;  
  144.     }  
  145.   
  146. }  
 
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐