了解Zookeeper的我们都知道,Zookeeper是一种分布式协调服务,在分布式应用中,主要用来实现分布式服务的注册与发现以及分布式锁,本文我们简单介绍一下Zookeeper是如何实现服务的注册与发现的。

使用Zookeeper实现服务注册与发现,主要应用的是Zookeeper的Znode数据模型和Watcher机制,因此咱们先从Zookeeper的数据模型说起。

1、Zookeeper数据模型

Zookeeper的数据模型,有点类似咱们数据结构中的树形结构,也有点类似我们操作系统的目录结构,数据模型结构图大致如下;

树由节点组成,Zookeeper的数据存储也是基于节点,数据模型中的每一个节点,Zookeeper称之为Znode。但是与树的节点不同的是,Zookeeper中Znode的引用方式是路径引用,即是通过类似于目录文件访问的形式引用节点数据。

如上图要在“汽车”节点下再创建一个“奥迪”节点,创建方式为:

create /汽车/奥迪
1
要获取“汽车”节点下的节点“宝马”的数据,获取方式为:

get /汽车/宝马
1
基于目录的结构让每一个Znode节点拥有了唯一的路径,就像我们Java中的命名空间一样,对不同的信息就做出了清晰的隔离。

一个Znode里面主要包含了如下的一些数据:

data : Znode存储的数据;
ACL:记录 Znode 的访问权限,即哪些人或哪些 IP 可以访问本节点;
stat:包含Znode的各种源数据,包括ZXID、版本号、时间戳、数据长度等;
child:子节点引用;
2、Zookeeper的Watch机制

我们可以将Watch理解成是一个和指定Znode所绑定的监听器,当这个Znode发生变化,也就是在这个Znode上进行了数据的写操作(create、delete、setData),这个监听器监听到这些写操作之后会异步向请求Watch的客户端发送通知。

具体交互流程大致如下:

客户端调用getData方法向服务器获取某个Znode节点的数据时,设置watch为true。服务端接到请求后,返回节点的数据,并在维护的WatchTable中插入被Watch的Znode路径以及Watcher(watch该Znode的客户端);

当被Watch的Znode被删除或者更新之后,Zookeeper服务器会查找Watch Table,找到在Znode上对应的所有Watcher,异步通知对应的客户端,并且删除Watch Table中对应的Key:Value;

3、Zookeeper服务注册与发现流程浅析
Zookeeper的服务注册与发现,主要应用的是Zookeeper的Znode数据模型和Watcher机制,主要分为如下几个步骤:

服务注册:服务提供者(Provider)启动时,会向Zookeeper服务端注册服务信息,即会在Zookeeper服务器上创建一个服务节点,并在节点上存储服务的相关数据(如服务提供者的ip地址、端口等),比如注册一个用户注册服务(user/register):

服务发现:服务消费者(Consumer)启动时,会根据本身依赖的服务信息,向Zookeeper服务端获取注册的服务信息并设置Watch,获取到注册的服务信息之后将服务提供者信息缓存在本地,调用服务时直接根据从Zookeeper注册中心获取到的服务注册信息调用服务,比如发现用户注册服务(user/register)并调用。

服务通知:当服务提供者因为某种原因宕机或不提供服务之后,Zookeeper服务注册中心的对应服务节点会被删除,因为服务消费者在获取服务信息的时候在对应节点上设置了Watch,因此节点删除之后会触发对应的Watcher,Zookeeper注册中心会异步向服务所关联的所有服务消费者发出节点删除的通知,服务消费者根据收到的通知更新缓存的服务列表。

4、小结
本文我们简单介绍了Zookeeper实现服务注册与发现的简单原理,利用 Znode 和 Watcher,可以实现分布式服务的注册和发现。最著名的应用就是阿里的分布式 RPC 框架 Dubbo,希望对大家有帮助。
————————————————
版权声明:本文为CSDN博主「RonTech」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/zyhlwzy/article/details/101847565

Zookeeper服务注册与发现原理浅析的更多相关文章

  1. nacos服务注册与发现原理解析

    前言:nacos 玩过微服务的想必不会陌生,它是阿里对于springcloud孵化出来的产品,用来完成服务之间的注册发现和配置中心,其核心作用我就不废话了 大致流程:每个服务都会有一个nacos cl ...

  2. Zookeeper 服务注册和发现

    Zookeeper 分布式服务框架是 Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务.状态同步服务.集群管理.分布式应用配置项的管理 ...

  3. SpringCloud学习笔记(四):Eureka服务注册与发现、构建步骤、集群配置、Eureka与Zookeeper的比较

    简介 Netflix在设计Eureka时遵守的就是AP原则 拓展: 在分布式数据库中的CAP原理 CAP原则又称CAP定理,指的是在一个分布式系统中,Consistency(一致性). Availab ...

  4. 🏆【Alibaba中间件技术系列】「Nacos技术专题」服务注册与发现相关的原理分析

    背景介绍 前几篇文章介绍了Nacos配置中心服务的能力机制,接下来,我们来介绍Nacos另一个非常重要的特性就是服务注册与发现,说到服务的注册与发现相信大家应该都不陌生,在微服务盛行的今天,服务是非常 ...

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

    安装与差异 Zookeeper安装请参考我上篇文章 http://www.cnblogs.com/woxpp/p/7700368.html 基于Nginx的服务提供和消费 基于zookeeper的服务 ...

  6. springcloud之服务注册与发现(zookeeper注册中心)-Finchley.SR2版

    新年第一篇博文,接着和大家分享springcloud相关内容:本次主要内容是使用cloud结合zookeeper作为注册中心来搭建服务调用,前面几篇文章有涉及到另外的eureka作为注册中心,有兴趣的 ...

  7. 【转帖】基于Zookeeper的服务注册与发现

    http://www.techweb.com.cn/network/hardware/2015-12-25/2246973.shtml 背景 大多数系统都是从一个单一系统开始起步的,随着公司业务的快速 ...

  8. 基于ZooKeeper实现简单的服务注册于发现

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/Shaun_luotao/article/ ...

  9. Spring cloud实现服务注册及发现

    服务注册与发现对于微服务系统来说非常重要.有了服务发现与注册,你就不需要整天改服务调用的配置文件了,你只需要使用服务的标识符,就可以访问到服务. 本文属于<7天学会spring cloud系列& ...

随机推荐

  1. Redis高级主题

    Redis高级主题   持久化 Redis 支持持久化, 其持久化数据有两种方式. 两种可以同时使用. 如果同时使用, Reids 在重启时将使用 AOF 方式来还原数据. RDB 按照一定策略定时同 ...

  2. python常用关键字

    转载: python关键字以及含义,用法 查看所有python关键字: import keyword print(keyword.kwlist) ['False', 'None', 'True', ' ...

  3. VS2008编译boost1.53

    1. 准备工作:下载boost_1_53_0.zip(bzip2-1.0.6.tar.gz/icu4c-4_4_2-Win32-msvc9.zip/Python-2.5.2.tar.bz2/zlib- ...

  4. react正常显示html代码、dangerousSetInnerHTML 笔记

    const html =`<h1>今天天色很好</h1>` <div dangerouslySetInnerHTML={{__html:html}}></di ...

  5. hashmap C++实现

    hashmap.h #ifndef _HASHMAP_H_ #define _HASHMAP_H_ template<class Key, class Value> class HashN ...

  6. # Tallest Cows(差分)

    Tallest Cows(差分) n头牛,给出最高牛的位置和身高,其他牛身高未知,给出m对相对关系,表示可以相互看见当且仅当他们中间的牛都比他们矮.求每头牛身高最大值是多少. 差分数组的性质:前缀和为 ...

  7. C语言经典100例(1-50)

    [程序1] 题目:有1.2.3.4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 分析:可填在百位.十位.个位的数字都是1.2.3.4.组成所有的排列后再去掉不满足条件的排列. main ...

  8. mysql索引失效的情况

    1.WHERE字句的查询条件里有不等于号(如:WHERE column!=...),MYSQL将无法使用索引: 2.WHERE字句的查询条件里使用了函数的列(如:WHERE DAY(column)=. ...

  9. Codeforces 1201E2. Knightmare (hard)

    传送门 看到棋盘先黑白染色冷静一下 然后分析发现,如果初始时两只马在同色的格子,那么一定是后手吃先手 反之一定是先手吃后手 所以分类讨论一下,如果初始在同色的格子,并且后手到达终点的步数更少,那么后手 ...

  10. Codeforces 1201D. Treasure Hunting

    传送门 看一眼感觉就是 $dp$,但是似乎状态太多了 考虑推推性质 首先每到一行都要把所有宝藏都走到,那么一定会走到最左边的和最右边的宝藏 注意到一旦走完所有宝藏时肯定是在最左边或者最右边的宝藏位置 ...