在分布式调度系统中可以使用zookeeper实现统一命名服务,以获得类似于UUID的全局唯一名称。

借助ZNODE顺序节点的特性,本文通过创建临时顺序节点来获得统一命名。使用zookeeper创建顺序节点时,成功创建的每个节点都会返回一个编号,使用该编号以及给定的名称即可生成具有特定含义的统一名称。实现逻辑如下:
1.所有客户端(本文以多线程模拟)都会创建同一个名称的顺序节点
2.节点创建完成后,会返回一个节点名(get_name_completion()中的value返回值)
3.客户端拿到返回值后,可以加上具有特定含义的字符串,即可拼成一个全局唯一的名称。

本文使用zookeeper的C语言客户端,下文代码依赖的头文件以及动态库的生成方式如下:
进入zookeeper 下的src/c/目录下

#./configure
# make & make install

默认头文件安装与 /usr/local/zookeeper/ 动态库位于/usr/local/lib
相关接口介绍如下,具体详见头文件:

//初始化一个zookeeper连接句柄
zhandle_t *zookeeper_init(const char *host, watcher_fn fn,int recv_timeout, const clientid_t *clientid, void *context, int flags);
其中 watcher_fn fn是一个全局监视回调函数//一个异步创建znode的接口,创建完成会调用completion回调函数
int zoo_acreate(zhandle_t *zh, const char *path, const char *value, int valuelen, const struct ACL_vector *acl, int flags,string_completion_t completion, const void *data);//close the zookeeper handle and free up any resources
int zookeeper_close(zhandle_t *zh);

统一命名服务代码实现:

//nameService.cpp
#include <iostream>
#include <string>
#include <pthread.h>
#include <string.h>
#include <sstream>
#include <zookeeper.h>using  namespace std;const int Clients = 3 ;
int connectd = 0 ;
//创建临时节点,并在完成之后,获得相应的名称
void *Named(void *);
//zookeeper会话的监视函数
void watcher(zhandle_t *zkh,int type, int state, const char *path,void *context);
//创建临时节点成功后的回调函数
void get_name_completion(int rc,const char *value, const void *data);int main()
{pthread_t threadID[Clients];int err;for(int i = 0 ; i < Clients ;++i){err = pthread_create(&threadID[i], NULL, Named, NULL);if(err != 0 )cout<<"create new thread failed ..." <<endl;}for(int i = 0 ; i < Clients ;++i){err = pthread_join(threadID[i],NULL);if(err)cout<<"thread join failed ..."<<endl;}return 0;
}void *Named(void *arg)
{unsigned long idx = pthread_self();string host = "localhost:2181";zhandle_t *zh;zh = zookeeper_init(host.c_str(),watcher,15000,NULL,NULL,0);if(NULL == zh){cout<<"Init zookeeper handle failed, host:"<<host<<endl;return NULL;}ostringstream oss;oss<<idx;cout<<"threadID:"<<idx<<endl;string znode = "/nameservice";//异步创建一个ZNODE,节点类型为 临时顺序节点(ZOO_EPHEMERAL | ZOO_SEQUENCE)//由于不涉及ACL控制方式,acl设为ZOO_OPEN_ACL_UNSAFE//同时通过strdup(oss.str().c_str())将节点内容传入get_name_completion回调函数以供调试zoo_acreate(zh,znode.c_str(), oss.str().c_str(), oss.str().length(), &ZOO_OPEN_ACL_UNSAFE,ZOO_EPHEMERAL | ZOO_SEQUENCE, get_name_completion, strdup(oss.str().c_str()));sleep(5);//等待get_name_competion回调完成zookeeper_close(zh);return NULL;
}void watcher(zhandle_t *zkh,int type, int state, const char *path,void *context)
{if( ZOO_SESSION_EVENT == type){if(state == ZOO_CONNECTED_STATE){connectd = 1;cout<<"Received a connectd event."<<endl;} else if( state == ZOO_CONNECTING_STATE){if(connectd == 1){cout<<"Disconnected."<<endl;}connectd = 0 ;} else if(state == ZOO_EXPIRED_SESSION_STATE){connectd == 0;zookeeper_close(zkh);}}
}void get_name_completion(int rc,const char *value, const void *data)
{if(rc == ZOK){//可以用具有特定含义的字符串和value值拼接成名称,此处只用返回值作为名称cout<<"threadID:"<<(const char*)data<<",get the name:"<<value <<endl;}free((void*)data); //strdup会调用malloc,必须手动释放这部分内存
}

基于zookeeper的统一命名服务及实现相关推荐

  1. 基于Zookeeper实现简易版服务的注册与发现机制

    一.功能要求 基于Zookeeper实现简易版服务的注册与发现机制 启动2个服务端 将服务端IP和端口信息注册到Zookeeper上 启动1个客户端 从Zookeeper中获取2个服务端节点信息 客户 ...

  2. 化繁为简|中信建投基于StarRocks构建统一查询服务平台

    近年来,在证券服务逐渐互联网化,以及券商牌照红利逐渐消退的行业背景下,中信建投不断加大对数字化的投入,尤其重视数据基础设施的建设,期望在客户服务.经营管理等多方面由经验依赖向数据驱动转变,从而提高服务 ...

  3. 来来来!统一命名服务、集群管理、分布式应用

    栈和队列部分(10) 设计一个有getMin功能的栈(士★☆☆☆) 由两个栈组成的队列(尉★★☆☆) 如何仅用递归函数和栈操作逆序一个栈(尉★★☆☆) 猫狗队列(士★☆☆☆) 用一个栈实现另一个栈的排 ...

  4. 基于zookeeper实现分布式配置中心(一)

    最近在学习zookeeper,发现zk真的是一个优秀的中间件.在分布式环境下,可以高效解决数据管理问题.在学习的过程中,要深入zk的工作原理,并根据其特性做一些简单的分布式环境下数据管理工具.本文首先 ...

  5. 基于Zookeeper实现简易的负载均衡

    基于Zookeeper实现简易的负载均衡 完整代码在这里基于Zookeeper实现简易的负载均衡 以下是讲解 一. 要求 1. 编程题一: 在基于Netty的自定义RPC的案例基础上,进行改造.基于Z ...

  6. Zookeeper与统一配置管理

    目录 统一配置管理简介 代码开发 注意:本文参考  什么是ZooKeeper? 基于zookeeper实现统一配置管理_菜 头的博客-CSDN博客_zookeeper统一配置管理 统一配置管理简介 比 ...

  7. Web Api 基于Zookeeper的服务注册与发现

    差异 基于Nginx的服务提供和消费 基于zookeeper的服务注册和发现 zk的负载均衡是可以调控,nginx只是能调权重,其他需要可控的都需要自己写插件:但是nginx的吞吐量比zk大很多,可以 ...

  8. 【JEECG Dubbo专题】Dubbo+Zookeeper+Spring整合应用篇-Dubbo基于Zookeeper实现分布式服务(二)

    Dubbo与Zookeeper.Spring整合使用 Dubbo采用全Spring配置方式,透明化接入应用,对应用没有任何API侵入,只需用Spring加载Dubbo的配置即可,Dubbo基于Spri ...

  9. RPC Demo(二) 基于 Zookeeper 的服务发现

    RPC Demo(二) 基于 Zookeeper 的服务发现 简介     基于上篇的:RPC Demo(一) Netty RPC Demo 实现     第二部分来实现使用Zookeeper作为服务 ...

  10. 基于ZooKeeper的分布式Session实现

    基于ZooKeeper的分布式Session实现 [转 http://blog.csdn.net/jacktan/article/details/6112806] 认识ZooKeeper ZooKee ...

最新文章

  1. java 之 运算符
  2. 中国通信企业投身罗马尼亚智慧城市建设
  3. 关于系统用户数,并发用户数,在线用户数,吞吐量
  4. codeforces 1030A-C语言解题报告
  5. Safengine Android so加密
  6. java kcp,重新认识KCP - osc_rreaoxa0的个人空间 - OSCHINA - 中文开源技术交流社区
  7. 爬取豆瓣电影储存到数据库MONGDB中以及反反爬虫
  8. 【概念理论】不存在的NOIP2016
  9. 19年6月英语六级第二套听力单词
  10. ELK安装( Elasticsearch、Logstash、Kibana)
  11. 文献管理工具EndNote X8 破解版,Windows版
  12. 74HC595 的使用
  13. 算法提高 盾神与条状项链
  14. 面对人生这道程序,该如何编码?
  15. 彩灯控制电路设计 -- 流水灯双花型(附Multisim)
  16. 定时任务管理系统(spring boot + quartz + angular)
  17. Django-bootstrap3插件搭建Django+Bootstrap网站
  18. 百万调音师—Audition 压缩效果器
  19. 计算机连网线怎么联网,电脑直接插网线上网
  20. 漏洞poc和漏洞利用_带HTML的PowershellHTML空白空间隐写术和二进制漏洞利用交付[PoC]

热门文章

  1. MBR和 GPT互转导致Windows无法开机,镜像备份找不到
  2. linux安装时mbr转gpt分区表,免重装系统 手把手教你MBR转GPT分区表
  3. js点击获取短信验证码
  4. html 警告图标,HTML+CSS入门 CSS实现核辐射警告标志
  5. movs 数据传送指令_1.数据传送指令中,错误的操作是()。 A.MOVSS[BX+DI],1000H B.......
  6. CentOS官网下载对应版本
  7. 大数据核心技术是什么?
  8. 如何制作网页棋牌游戏
  9. 120日均线金叉250日均线是大牛市来临的重要信号
  10. Word删除空白页方法,由分节符导致多出空白页删除方法