开发者学堂课程【Dubbo + ZooKeeper 的服务发现最佳实践:Dubbo + ZooKeeper 的服务发现最佳实践】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/1012/detail/15069
2.大数据场景(Flink /Hbase /Hadoop)
(1)、主备节点
然后在大数据场景下面,像大数据的主要的一些组件,比如说 Flink ,Hbase ,Hadoop 这些,这些组件它都是默认 ZooKeeper 当做分布式写到的组件。默认集成在这里面的。在这里面其实它做的很多事情,就是 ZooKeeper 解决了很多问题。它其实最主要的其实就是利用 ZooKeeper。帮这些组件做了一个 ha 的一个方案。也就是说主备节点切换,例如当 Flink 的一个主要的主节点出现故障的时候,然后备节点能够自动顶上去,自动去服务,就整体的保证了整个大服务组件延续性。
(2)、原理
它的原理大概是这样的,看下面的图,比如说有两台 server 是大数据组建的两个server,它们两个之间要组成一个 ha 主备的模式,那第一步,就是当server启动的时候,它会去 ZooKeeper 里面尝试去写下一个约定好的一个路径下面的一个临时节点,由于 ZooKeeper 下面只允许一个路径写成功,谁写成功了就作为主节点 ito节点,并且 ZooKeeper 会把节点的状态通知到集群中,其它尝试想要写的节点,然后那些节点收到的状态之后,它会就是自动改成备用节点的状态。
当主节点宕机的时候, ZooKeeper 会将这个节点的状态通知下去,然后也就是说它宕机的时候,它临时节点就会消失,然后 ZooKeeper 将这个节点状态通知下去之后,其它的备节点就立刻往节点里面写数据。写成功就接替刚才的主节点,成为新的主节点,整理的大概流程大概是这样。
(3)、注意
有个点要注意一下,就是在网络不稳定的情况下就异常的情况下。主备节点的切换可能不是那么实时,那这时候可能会出现脑裂,也就是说可能会存在两个主节点的情况。那这时候解决办法就是客户端要去 ZooKeeper 去获取一些最新的主节点的时候,可以 sleep 一会儿,就是等状态一致的时候再去取最新的主节点的一个地址。这样,可能可能稍微可以降低一下这个概率,但是也不一定能完全避免。
3. 自研分布式系统(Schedulex/ 精卫)
然后第三个,就是自研的一些分布式系统,肯定也会遇到很多一些分布式协调的一些问题!这时候 ZooKeeper 来讲其实它就是一个万能的一个工具箱,在不同的场景下,基于 ZooKeeper 的一些特性,都能拿出一个解决方案。总结了一下,一般在写分布式系统的时候,会经常会遇到下面一些诉求。
(1)、master 模式选举
就是自己的一个业务群一要做 master 模式选举。自己的系统要选出一个 master 来执行一个任务。
不能多台机器同时执行。只能一台机器来执行,比如说内部的 Schedulex,它其实是个任务调度系统,它其实就是利用 ZooKeeper 来做到这个。
它一般有两种方式,一种是抢占主节点的方式。另外一种是最小节点方式。这两种具体怎么实现?抢占主节点的方式其实就是约定一个固定的路径。
每个 worker 去往里面去写数据,写数据的时候,都是写临时节点数据,写成功的话,那它就当作 master。Master 宕机之后,临时节点就会过期释放,然后ZooKeeper 又会通知到其它的一些 worker 节点,那其它 worker 再继续往推荐中心里面写数据,谁抢占到的谁就当做 master,这个跟刚才的大数据主备场景是很像的。
第二个,就是最小节点的方式,最小节点的方式就是利用的JK的临时有序节点特性时间。
临时有序就是 ZooKeeper 要往 full 下面写子节点的时候,如果写的是一个有序节点,它会自动在每个临时节点后面会加上一个位置加上一个序号,这个序号是单调递增的。
那可以看这张图,
如果要进行选组的时候,每台 server 里面做完去往木渎里面去写每个节点都有一个序号!自己程序,自己约定好需要最小的 master 就好了。
(2)、分布式锁
第二个,就是分布式锁,就是会经常在分数系统中需要用到一些分布式锁。主要有两种。
第一种是排他锁,只有一个事物能够获取锁,并且这个锁释放之后。能够等待其它要抢战锁的进程都能立马被通知到,并且进行一个抢战。根据它的原则,实现的方式可以这样做,如果可以在约定一个路径下面创建一个临时节点,谁创建成功就认为是谁抢占到了锁。同时,其它的一些其它的那些想要抢锁的都必须去监听这个路径。这个路径下面的节点删除的话,那就给被去通知下去。去做抢占的操作,其实就是往下面去写一个临时节点。这个和 master 抢占主节点的方式也是一样的。实现方式都是一样的。
第二个是共享锁,共享锁其实就是常说的读锁,就是允许有多个读线程的访问,那有显示的写的时候是不允许去读的。这个时候可以利用 JK 的临时有序节点继续实现,然后图所示,读的时候你往目录下面去写一个临时节点,并且带 R 字标识,这时候如果写成功了,如果比其它小的节点里面没 w 节点,那么就是抢单成功,什么意思?也就是说去读的时候,发现 full 上面都没有个 w 节点,也就是说有没有写,没有人在里面写,所以这个读节点其实可以抢占成功的,就可以继续去读。那如果要往里面写,只需要判断一下自己的下标是不是最小的,如果是最小那么就说明是第一个抢占到这个锁的。那这个就是一个共享锁的,一个实现方式。
(3)、分布式队列
还有一个分布式队列,这个其实就是更加形象,就是说利用也是 ZooKeeper 的一个临时有序节点。在自研的系统里面,还经常会遇到一个就是存储一些进来配置。这时候需要一个分布式配置中心。也是利用的 ZooKeeper 的一个注册订阅的模式,这里有个点,就是 ZooKeeper 其实是不太适合用于存储太大的一些数据的,一般一个节点不超过 1M,否则它们就很容易出现一些性能问题对。
在自己写一些分支系统里面,大概基本上就是主要是会遇到四种场景,然后ZooKeeper 基本都会有一些原子能力,利用它这些能力去实现这些工序。
三、微服务动手实践
接下来,会进行一个微服务的动手的实践,以 Dubbo 跟 ZooKeeper 这组黄金组合来演示。
1. Dubbo+ZooKeeper 原理
先看一下 Dubbo 会怎么利用 ZooKeeper 进行一个服务发现的?可以看一下下图中的左下角,就是可以看一下 Dubbo 在 ZooKeeper 里面的一个数据结构,
(1)、数据结构
可以看出它一共分了四层,第一层是 root 是一个叫 Dubbo 的路径。第二层是service 这层节点的路径名字存储的是 Dubbo 的一个服务名。第三层叫 type,主要是有两个节点,一个是 providers 是跟 consumers,顾名思义,就是 providers 跟 consumers 都会把自己的信息都写到对应的两个目录下面。
(2)、注册过程
那先看一下它的一个注册的过程,它的那个注册的过程 providers 会往 ZooKeeper的路径额外的下面去写个临时节点。它的那个路径里面就包含了一个地址,和 ip 端口。比如里面有服务名,IP,后面的还有它的一些参数。
(2)、订阅过程
那在订阅过程中,就是 consumers 会获取 providers 下面这个路径下所有的子节点,然后 ZooKeeper 会主动通知 consumers 这个路径下面所有子节点的一个信息。子节点对 consumers 来讲,这些节点其实就是地址列表!consumers 在去订阅的过程中,它也会往 Dubbo,也会往 ZooKeeper 里面去写一些自己的信息,在consumers 下面,但是这个目前就是订阅关系,可以在 ZooKeeper 上面找得到。
(3)、发起调用
它同时还有可以写一些自己的发起调用过程中的一些动态的一些,例如超时,从事次数类似于这种信息。当要发起调用的时候,ZooKeeper 就是通过 ZooKeeper 拿到那个 providers 的一个地址列表。这个列表里面它其实就是个 url 串。Ipc 框架就通过这个串里面的 IP 地址向 providers 去发起 tcb 的建连请求,然后通过它们自己的私有协议进行支链的一个通讯。
(4)、providers 下线
当额外的要进行下线的时候,如果说它的进程关闭,或者说主动下线,或者亚优雅下线之后!它与 ZooKeeper 长链接会断开。然后,这时候 ZooKeeper 的临时节点的心跳也会停掉,这时候就会通知到 consumers 这个地址已经下线了。consumers 它更新完本地的地址列表之后,它下调用就不会再选择了。
然后这里有注意,就是 Dubbo 里面会有一个推空保护,也就是说 consumers 的地址列表里面就只有一台机器的时候。或者仅有几台机器的时候,如果是地址列表更新过来一次性都把它清零了,那这时候如果开启了这个推空保护,consumers 它是不会理会这一次更新的一个请求的,它会继续用老的地址进行一个调用。
2.实践
然后我现在就是动手实践一下,就是利用 ZooKeeper 和 Dubbo 去写一个微服务的一个程序。
(1)、购买 ZooKeeper
然后首先,进 mse 控制台的主页,去购买一个 ZooKeeper。大家可以看到,下图是 mpc 控制台!
选新加坡环境,然后这个是已经存在的一个,现在重新购买一个。
选按量付费就好了。ZooKeeper 的专业版,它是兼容3.4到3.8版本的。选小的配置,然后选择公网带宽,通过公网进行连接,然后会免费给大家开通一个prometheus 功能。可以看到监控数据。基本上就很简单点击购买。
而且它现在就已经在开始在再创建了,然后先让它在这边创建,先看一下这个程序。