RPC框架原理及从零实现系列文章(三):zookeeper注册中心原理


声明:本文转载自https://my.oschina.net/u/3768288/blog/1609041,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

前面的文章中 我用netty实现了一个简单的一对一的RPC

11个类实现简单java rpc

接下来的文章中 我将使用zookeeper作为rpc调用的分布式注册中心  从而实现多对多(多个调用者,多个提供者)的rpc调用,负载均衡及相应的分布式协调功能

首先简单介绍下zookeeper

zookeeper是hadoop中一个重要组件,其主要是作为分布式协调服务

zookeeper采用节点树的数据模型,类似linux文件系统,/,/app1,/app2 比较简单

zookeeper数据模型

每个节点称做一个ZNode。每个ZNode都可以通过其路径唯一标识,同时每个节点还可以存储少量数据。

节点可分为常规节点,临时节点和顺序节点

还有两个比较重要的东西 session和watcher

session:

每个zk客户端与zk连接时会创建一个session,在设置的sessionTimeOut内,客户端会与zk进行心跳包的定时发送,从而感知每个客户端是否宕机,如果创建某个临时Znode的对应session销毁时,相应的临时节点也会被zk删除。

watcher:

监听机制,监听某个Znode 当该znode发生变化时,会回调该watcher,但是这个watcher是一次性的,下次需要监听时还得再注册一次。

 

当然 这几个只是zookeeper的各种特性之一,能实现注册中心的也不止zookeeper(例如redis),注册中心也只是zk的功能之一,还有互斥锁,乐观锁,命名服务等也是zk能实现的,本文只讲述rpc框架需要的3个重要内容

临时节点,session,watcher其余内容请读者自行查阅

 

这是dubbo框架的注册中心数据模型

 

dubbo zookeeper模型

zookeeper注册中心思路如下

(这是我的思路 可能没和dubbo框架一模一样)

服务名称作为次级znode,下层的znode为对应的类型,调用者还是提供者

对应的类型下面是他们的URL 即对应机器的IP地址 URL这个znode为临时节点

 

提供者服务启动后向zookeeper注册他有的services,并将自己的ip地址和端口作为路径,创建对应的URL临时节点

调用者调用相应服务时,找到对应的service节点,获得service所有的子节点,并且watch service节点,然后同样注册自己的znode节点

每个调用端需明确提供者和调用者的数量以及提供者相应的IP地址

之后调用端获得 service/providers的所有子节点 即获得所有的提供者的IP 使用对应负载均衡策略连接其中一个ip地址,进行rpc调度

当提供者或调用者出现宕机或者网络故障时,对应session的临时znode会被销毁,即哪个IP的机子宕机了,他对应的url节点在sessionTimeOut后,就会被销毁,此时由于service节点已发生了变化,所有可用调用者都会收到watcher的通知,此时重新获得所有的调用者提供者IP及其数量,并继续监听,从而悉知调用端和服务端的服务可用情况。

 

负载均衡

悉知各个服务的IP之后 就要选取一个服务IP进行访问,同时保证服务资源的充分利用 这就是负载均衡

常见负载均衡策略有(权重)轮询,随机,最小连接数,一致性hash等等

后续文章会分析并选取其中一种进行实现


以上为rpc框架使用zookeeper作为注册中心的思路 

下篇博客将是对上述思路的具体代码实现,并整合进RPC框架

欢迎持续关注我的博客及我的github:MeiZhuoRPC

本文发表于2018年01月18日 16:32
(c)注:本文转载自https://my.oschina.net/u/3768288/blog/1609041,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 1782 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1