Zookeeper系列(三十三)Zookeeper场景应用之分布式ID生成器

来源:互联网 发布:mac怎么看硬盘文件 编辑:程序博客网 时间:2024/06/05 09:00

可以理解成一个分布式的ID生成器

1.命名服务

命名服务可以理解为提供名字的服务

Zookeeper的命名服务,有两个应用方向:

   1.提供类似JNDI的功能:

             利用zookeeper中的树形分层结构,可以把系统中的各种服务的名称,地址以及目录信息存放在zookeeper中,需要的时候去zookeeper中去读取

   2.

            利用zookeeper中的顺序节点的特性,制作分布式的序列号生成器(ID生成器)

(在往数据库中插入数据,通常是要有一个ID号,在单机环境下,可以利用数据库的主键自动生成id号,但是这种在分布式环境下就无法使用了,可以使用UUID,但是UUID有一个缺点,就是没有什么规律很难理解。使用zookeeper的命名服务可以生成有顺序的容易理解的,支持分布式的编号)

2.架构图


3.算法流程



生成ID的方法

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.jike.nameservice;  
  2.   
  3. import java.util.concurrent.ExecutorService;  
  4. import java.util.concurrent.Executors;  
  5. import java.util.concurrent.TimeUnit;  
  6.   
  7. import org.I0Itec.zkclient.ZkClient;  
  8. import org.I0Itec.zkclient.exception.ZkNodeExistsException;  
  9. import org.I0Itec.zkclient.serialize.BytesPushThroughSerializer;  
  10.   
  11. public class IdMaker {  
  12.       
  13.       
  14.     private ZkClient client = null;  
  15.     private final String server;//记录服务器的地址  
  16.     private final String root;//记录父节点的路径  
  17.     private final String nodeName;//节点的名称  
  18.     private volatile boolean running = false;  
  19.     private ExecutorService cleanExector = null;  
  20.       
  21.     //删除节点的级别  
  22.     public enum RemoveMethod{  
  23.         NONE,IMMEDIATELY,DELAY  
  24.           
  25.     }  
  26.       
  27.     public IdMaker(String zkServer,String root,String nodeName){  
  28.           
  29.         this.root = root;  
  30.         this.server = zkServer;  
  31.         this.nodeName = nodeName;  
  32.           
  33.     }  
  34.       
  35.     public void start() throws Exception {  
  36.           
  37.         if (running)  
  38.             throw new Exception("server has stated...");  
  39.         running = true;  
  40.           
  41.         init();  
  42.           
  43.     }  
  44.       
  45.       
  46.     public void stop() throws Exception {  
  47.           
  48.         if (!running)  
  49.             throw new Exception("server has stopped...");  
  50.         running = false;  
  51.           
  52.         freeResource();  
  53.           
  54.     }  
  55.       
  56.     /** 
  57.      * 初始化服务资源 
  58.      */  
  59.     private void init(){  
  60.           
  61.         client = new ZkClient(server,5000,5000,new BytesPushThroughSerializer());  
  62.         cleanExector = Executors.newFixedThreadPool(10);  
  63.         try{  
  64.             client.createPersistent(root,true);  
  65.         }catch (ZkNodeExistsException e){  
  66.             //ignore;  
  67.         }  
  68.           
  69.     }  
  70.       
  71.     /** 
  72.      * 释放服务资源 
  73.      */  
  74.     private void freeResource(){  
  75.       
  76.         cleanExector.shutdown();  
  77.         try{  
  78.             cleanExector.awaitTermination(2, TimeUnit.SECONDS);  
  79.               
  80.         }catch(InterruptedException e){  
  81.             e.printStackTrace();  
  82.         }finally{  
  83.             cleanExector = null;  
  84.         }  
  85.       
  86.         if (client!=null){  
  87.             client.close();  
  88.             client=null;  
  89.               
  90.         }  
  91.     }  
  92.       
  93.     /** 
  94.      * 检测服务是否正在运行 
  95.      * @throws Exception 
  96.      */  
  97.     private void checkRunning() throws Exception {  
  98.         if (!running)  
  99.             throw new Exception("请先调用start");  
  100.           
  101.     }  
  102.       
  103.     private String ExtractId(String str){  
  104.         int index = str.lastIndexOf(nodeName);  
  105.         if (index >= 0){  
  106.             index+=nodeName.length();  
  107.             return index <= str.length()?str.substring(index):"";  
  108.         }  
  109.         return str;  
  110.           
  111.     }  
  112.       
  113.     /** 
  114.      * 产生ID 
  115.      * 核心函数 
  116.      * @param removeMethod 删除的方法 
  117.      * @return 
  118.      * @throws Exception 
  119.      */  
  120.     public String generateId(RemoveMethod removeMethod) throws Exception{  
  121.         checkRunning();  
  122.         final String fullNodePath = root.concat("/").concat(nodeName);  
  123.         //返回创建的节点的名称  
  124.         final String ourPath = client.createPersistentSequential(fullNodePath, null);  
  125.           
  126.           
  127.         /** 
  128.          * 在创建完节点后为了不 
  129.          */  
  130.         if (removeMethod.equals(RemoveMethod.IMMEDIATELY)){  
  131.             client.delete(ourPath);  
  132.         }else if (removeMethod.equals(RemoveMethod.DELAY)){  
  133.             cleanExector.execute(new Runnable() {  
  134.                   
  135.                 public void run() {  
  136.                     // TODO Auto-generated method stub  
  137.                     client.delete(ourPath);  
  138.                 }  
  139.             });  
  140.               
  141.         }  
  142.         //node-0000000000, node-0000000001,ExtractId提取ID  
  143.         return ExtractId(ourPath);  
  144.     }  
  145.   
  146. }  

测试节点ID生成

[java] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. package com.jike.nameservice;  
  2.   
  3. import com.jike.nameservice.IdMaker.RemoveMethod;  
  4.   
  5. public class TestIdMaker {  
  6.   
  7.     public static void main(String[] args) throws Exception {  
  8.           
  9.         IdMaker idMaker = new IdMaker("192.168.1.105:2181",  
  10.                 "/NameService/IdGen""ID");  
  11.         idMaker.start();  
  12.   
  13.         try {  
  14.             for (int i = 0; i < 10; i++) {  
  15.                 String id = idMaker.generateId(RemoveMethod.DELAY);  
  16.                 System.out.println(id);  
  17.   
  18.             }  
  19.         } finally {  
  20.             idMaker.stop();  
  21.   
  22.         }  
  23.     }  
  24.   
  25. }  
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 自己申请的qq号账号忘了怎么办 苹果手机下完游戏找不到在哪怎么办 苹果四下游戏的密码忘了怎么办 qq斗地主老自动发消息怎么办 微信小程序斗地主被限制了怎么办 台式电脑玩斗地主总黑屏怎么办 玩斗地主屏幕出现一半玩不了怎么办 电脑qq文件破损或部分丢失怎么办 华为平板电脑开机密码忘记了怎么办 微信被太多人投诉被限制登录怎么办 微信账号被永久封号里面的钱怎么办 乱世王者领礼包时账号异常怎么办 qq填写资料见证号格式错误怎么办 如果把微信注销 王者的号怎么办 93元的吃鸡号忘了激活吗怎么办 王者荣耀实名注册不是自己的怎么办 苹果手机打开qq太慢了怎么办 剪辑视频打开了软件关闭不了怎么办 玩永恒纪元手游网络老掉线怎么办 绝地求生买的钥匙激活码忘了怎么办 魅族手机移动网络打不开网页怎么办 小米5s升级后下载不了软件怎么办 电脑可以登qq却开不了网页怎么办 手机微信图片没下载原图怎么办 qq号密码忘了密保忘了怎么办 扣扣更改密保手机失败怎么办 至尊宝安全模式密保手机更换怎么办 微信号手机号换了密码忘记了怎么办 被加盟网店托管骗了怎么办 善林金融倒闭投资者的钱怎么办? 微信支付密码忘了怎么办没绑卡 美团外卖没有骑手接单怎么办 发微信的"发送"没有了怎么办 华硕电脑下面的任务栏卡住了怎么办 微信登别人电脑上忘记退了怎么办 买手机买全新结果买到翻新机怎么办 苹果手机激活锁忘了id账号怎么办 淘宝很多产品都需要3c怎么办 小米mix装在兜里还能解锁怎么办 痰咳不出来憋的嘴唇紫了怎么办 京东闪电退款后不给退货怎么办