Dubbo + ZooKeeper 的服务发现最佳实践|学习笔记(二)

简介: 快速学习 Dubbo + ZooKeeper 的服务发现最佳实践

开发者学堂课程【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 将这个节点状态通知下去之后,其它的备节点就立刻往节点里面写数据。写成功就接替刚才的主节点,成为新的主节点,整理的大概流程大概是这样。

图片6.png

(3)、注意

有个点要注意一下,就是在网络不稳定的情况下就异常的情况下。主备节点的切换可能不是那么实时,那这时候可能会出现脑裂,也就是说可能会存在两个主节点的情况。那这时候解决办法就是客户端要去 ZooKeeper 去获取一些最新的主节点的时候,可以 sleep 一会儿,就是等状态一致的时候再去取最新的主节点的一个地址。这样,可能可能稍微可以降低一下这个概率,但是也不一定能完全避免。

3. 自研分布式系统(Schedulex/ 精卫)

然后第三个,就是自研的一些分布式系统,肯定也会遇到很多一些分布式协调的一些问题!这时候 ZooKeeper 来讲其实它就是一个万能的一个工具箱,在不同的场景下,基于 ZooKeeper 的一些特性,都能拿出一个解决方案。总结了一下,一般在写分布式系统的时候,会经常会遇到下面一些诉求。

(1)、master 模式选举

就是自己的一个业务群一要做 master 模式选举。自己的系统要选出一个 master 来执行一个任务。

不能多台机器同时执行。只能一台机器来执行,比如说内部的 Schedulex,它其实是个任务调度系统,它其实就是利用 ZooKeeper 来做到这个。

它一般有两种方式,一种是抢占主节点的方式。另外一种是最小节点方式。这两种具体怎么实现?抢占主节点的方式其实就是约定一个固定的路径。

每个 worker 去往里面去写数据,写数据的时候,都是写临时节点数据,写成功的话,那它就当作 master。Master 宕机之后,临时节点就会过期释放,然后ZooKeeper 又会通知到其它的一些 worker 节点,那其它 worker 再继续往推荐中心里面写数据,谁抢占到的谁就当做 master,这个跟刚才的大数据主备场景是很像的。

第二个,就是最小节点的方式,最小节点的方式就是利用的JK的临时有序节点特性时间

临时有序就是 ZooKeeper 要往 full 下面写节点的时候,如果写的是一个有序节点,它会自动在每个临时节点后面会加上一个位置加上一个序号,这个序号是单调递增的。

那可以看这张图,

图片7.png

如果要进行选组的时候,每台 server 里面做完去往木渎里面去写每个节点都有一个序号!自己程序,自己约定好需要最小的 master 就好了

(2)、分布式锁

第二个,就是分布式锁,就是会经常在分数系统中需要用到一些分布式锁。主要有两种

第一种是排他锁,只有一个事物能够获取,并且这个释放之后能够等待其它要抢战的进程都能立马被通知到,并且进行一个抢战。根据它的原则,实现的方式可以这样做,如果可以在约定一个路径下面创建一个临时节点,谁创建成功就认为是谁抢占到了锁。同时,其它的一些其它的那些想要抢锁的都必须去监听这个路径。这个路径下面的节点删除的话,那就给被去通知下去。去做抢占的操作,其实就是往下面去写一个临时节点。这个和 master 抢占主节点的方式也是一样的。实现方式都是一样的。

第二个是共享锁,共享锁其实就是常说的读锁,就是允许有多个读线程的访问,那有显示的写的时候是不允许去读的。这个时候可以利用 JK 的临时有序节点继续实现,然后图所示读的时候你往目录下面去写一个临时节点,并且带 R 字标识,这时候如果写成功了,如果比其它小的节点里面没 w 节点那么就是抢单成功,什么意思?也就是说去读的时候,发现 full 上面都没有个 w 节,也就是说有没有写没有人在里面写,所以这个节点其实可以抢成功的,就可以继续去读。那如果要往里面写,只需要判断一下自己的标是不是最小的如果是最小那么就说明是第一个抢占到这个锁的。那这个就是一个共享锁的,一个实现方式

图片8.png

(3)、分布式队列

还有一个分布式队列,这个其实就是更加形象,就是说利用也是 ZooKeeper 的一个临时有序节点。在自研的系统里面,还经常会遇到一个就是存储一些进来配置。这时候需要一个分布式配置中心。也是利用的 ZooKeeper 的一个注册订阅的模式,这里有个点,就是 ZooKeeper 其实是不太适合用于存储太大的一些数据的,一般一个节点不超过 1M,否则它们就很容易出现一些性能问题对。

图片9.png

在自己写一些分支系统里面,大概基本上就是主要是会遇到四种场景,然后ZooKeeper 基本都会有一些原子能力,利用它这些能力去实现这些工序


三、微服务动手实践

接下来,会进行一个微服务的动手的实践以 Dubbo ZooKeeper 这组黄金组合来演示。

1. Dubbo+ZooKeeper 原理

先看一下 Dubbo 会怎么利用 ZooKeeper 进行一个服务发现的?可以看一下下图中的左下角,就是可以看一下 Dubbo 在 ZooKeeper 里面的一个数据结构,

图片10.png

(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 控制台!

图片11.png

选新加坡环境,然后这个是已经存在的一个,现在重新购买一个。

图片12.png

选按量付费就好了。ZooKeeper 的专业版,它是兼容3.4到3.8版本的。选小的配置,然后选择公网带宽,通过公网进行连接,然后会免费给大家开通一个prometheus 功能可以看到监控数据。基本上就很简单点击购买。

图片13.png

而且它现在就已经在开始在再创建了,然后先让它在这边创建,先看一下这个程序。

图片14.png


相关文章
|
SQL 安全 NoSQL
DMS产品常见问题之DMS提示校验失败如何解决
DMS(数据管理服务,Data Management Service)是阿里云提供的一种数据库管理和维护工具,它支持数据的查询、编辑、分析及安全管控;本汇总集中了DMS产品在实际使用中用户常遇到的问题及其相应的解答,目的是为使用者提供快速参考,帮助他们有效地解决在数据管理过程中所面临的挑战。
|
监控 Java 调度
Spring中的任务调度:探索@Scheduled和@Schedules注解的威力
Spring中的任务调度:探索@Scheduled和@Schedules注解的威力
610 0
|
存储 算法 前端开发
【软件设计师-从小白到大牛】上午题基础篇:第五章 结构化开发方法
在结构化分析中,用数据流图描述 数据在系统中如何被传送或变换,以及如何对数据流进行变换的功能或子功能,用于对功能建模。 数据字典有以下4类条目:数据流、数据项、数据存储和基本加工。
512 0
|
NoSQL MongoDB
MongoDB compact 命令详解
为什么需要 compact 一图胜千言 remove 与 drop 的区别 MongoDB 里删除一个集合里所有文档,有两种方式 db.collection.remove({}, {multi: true}),逐个文档从 btree 里删除,最后所有文档被删除,但文件物理空间不会被回收 db.
|
Java 数据库连接 API
springBoot:后端解决跨域&Mybatis-Plus&SwaggerUI&代码生成器 (四)
本文介绍了后端解决跨域问题的方法及Mybatis-Plus的配置与使用。首先通过创建`CorsConfig`类并设置相关参数来实现跨域请求处理。接着,详细描述了如何引入Mybatis-Plus插件,包括配置`MybatisPlusConfig`类、定义Mapper接口以及Service层。此外,还展示了如何配置分页查询功能,并引入SwaggerUI进行API文档生成。最后,提供了代码生成器的配置示例,帮助快速生成项目所需的基础代码。
717 1
|
SQL 数据库
MyBatisPlus之逻辑删除、MyBatisPlus解决并发问题的乐观锁机制
MyBatisPlus之逻辑删除、MyBatisPlus解决并发问题的乐观锁机制
477 2
|
存储 算法 安全
程序员必知:分布式一致性Raft与JRaft
程序员必知:分布式一致性Raft与JRaft
292 0
|
NoSQL 安全 MongoDB
精准数据清理:掌握 MongoDB 删除集合的方法与最佳实践
精准数据清理:掌握 MongoDB 删除集合的方法与最佳实践
737 0
|
Python Windows
为什么在Windows系统直接点击.py文件总是“一闪而过”?
为什么在Windows系统直接点击.py文件总是“一闪而过”?
1079 0
|
JSON JavaScript 定位技术
Vue中使用echarts@4.x中国地图及AMap相关API的使用
Vue中使用echarts@4.x中国地图及AMap相关API的使用
711 0
Vue中使用echarts@4.x中国地图及AMap相关API的使用