当前位置 : 主页 > 大数据 > 区块链 >

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

来源:互联网 收集:自由互联 发布时间:2021-06-22
前面的文章中 我用netty实现了一个简单的一对一的RPC 11个类实现简单java rpc 接下来的文章中 我 将使用zookeeper作为rpc调用的分布式注册中心 从而实现 多对多(多个调用者,多个提供者)

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

11个类实现简单java rpc

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

首先简单介绍下zookeeper

zookeeper是hadoop中一个重要组件,其主要是作为分布式协调服务
zookeeper采用节点树的数据模型,类似linux文件系统,/,/app1,/app2 比较简单

每个节点称做一个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框架的注册中心数据模型

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及其数量,并继续监听,从而悉知调用端和服务端的服务可用情况。

负载均衡

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

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

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

下篇博客将是对上述思路的具体代码实现,并整合进RPC框架
http://blog.csdn.net/we_phone...
欢迎持续关注我的博客及我的github:MeiZhuoRPC

网友评论