海豚调度Dolphinscheduler源码分析(二)
项目结构
模块
- dolphinscheduler-ui 前端页面模块
- dolphinscheduler-server 核心模块。包括master/worker等功能
- dolphinscheduler-common 公共模块。公共方法或类
- dolphinscheduler-api Restful接口。前后端交互层,与master/worker交互等功能
- dolphinscheduler-dao 数据操作层。实体定义、数据存储
- dolphinscheduler-alert 预警模块。与预警相关的方法、功能
- dolphinscheduler-dist 与编译、分发相关的模块。没有具体逻辑功能
- dolphinscheduler-microbench 基准测试
- dolphinscheduler-remote
- dolphinscheduler-service 核心模块。zk客户端,包括日志等功能1.3版本中不再使用 GRPC 进行通信了
先来看dolphinscheduler-service 模块
zookeeper相关类源码分析:
1.zookeeperConfig类 -- zk的相关配置
相关代码入下:只粘贴了一些重要的
其中大部分都是常见配置,如serverList,sessionTimeout 等,其中有一个配置没有见过故单独贴出来。
这个是zookeeper的ACL权限认证方式,读者可以自行查看相关资料,这里先不展开过多介绍:
相关连接:https://www.sohu.com/a/336744170_120173656
相关链接:https://www.cnblogs.com/dalianpai/p/12748144.html
相关链接:https://www.cnblogs.com/zwcry/p/10414001.html
2.CuratorZookeeperClient 类 初始化连接zookeeper客户端类
首先介绍一个框架Curator,Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等等。Patrixck Hunt(Zookeeper)以一句“Guava is to Java that Curator to Zookeeper”给Curator予高度评价。
Curator有“馆长”,“管理者”之意。
Curator包含了几个包:
- curator-framework:对zookeeper的底层api的一些封装。
- curator-client:提供一些客户端的操作,例如重试策略等。
- curator-recipes:封装了一些高级特性,如:Cache事件监听、选举、分布式锁、分布式计数器、分布式Barrier等。
相关链接:http://www.throwable.club/2018/12/16/zookeeper-curator-usage/
3.ZookeeperOperator类 ——zookeeper数据节点操作类(创建节点,删除节点,获取节点等)
这个类主要是对CuratorZookeeperClient 类创建的zkClient 客户端进行一些zk 数据阶段操作。
Zookeeper的节点创建模式:
- PERSISTENT:持久化
- PERSISTENT_SEQUENTIAL:持久化并且带序列号
- EPHEMERAL:临时
- EPHEMERAL_SEQUENTIAL:临时并且带序列号
其中这个creatingParentContainersIfNeeded()接口非常有用,因为一般情况开发人员在创建一个子节点必须判断它的父节点是否存在,如果不存在直接创建会抛出NoNodeException,使用creatingParentContainersIfNeeded()之后Curator能够自动递归创建所有所需的父节点。
4.ZookeeperCachedOperator类 缓存类
这个类继承了 上面的ZookeeperOperator类,并加入监听节点的cache方法
Zookeeper原生支持通过注册Watcher来进行事件监听,但是开发者需要反复注册(Watcher只能单次注册单次使用)。Cache是Curator中对事件监听的包装,可以看作是对事件监听的本地缓存视图,能够自动为开发者处理反复注册监听。Curator提供了三种Watcher(Cache)来监听结点的变化。
1.Path Cache
2.Node Cache
3.Tree Cache
Tree Cache可以监控整个树上的所有节点,类似于PathCache和NodeCache的组合,主要涉及到下面四个类:
- TreeCache - Tree Cache实现类
- TreeCacheListener - 监听器类
- TreeCacheEvent - 触发的事件类
- ChildData - 节点数据
**注意:**TreeCache在初始化(调用start()
方法)的时候会回调TreeCacheListener
实例一个事TreeCacheEvent,而回调的TreeCacheEvent对象的Type为INITIALIZED,ChildData为null,此时event.getData().getPath()
很有可能导致空指针异常,这里应该主动处理并避免这种情况。
海豚调度 主要是使用Tree Cache缓存 主要代码入下:
5.AbstractZKClient类—— 抽象zk客户端 (抽象类)
这个是对master,worker的抽象
这个类继承了上面第4个类,并且是个抽象类,具体的实现有ZKMasterClient和ZookeeperMonitor类,具体的UML图入下
这个类有个分布式锁
提醒:
1.推荐使用ConnectionStateListener监控连接的状态,因为当连接LOST时你不再拥有锁
2.分布式的锁全局同步, 这意味着任何一个时间点不会有两个客户端都拥有相同的锁。
可重入共享锁—Shared Reentrant Lock
Shared意味着锁是全局可见的, 客户端都可以请求锁。 Reentrant和JDK的ReentrantLock类似,即可重入, 意味着同一个客户端在拥有锁的同时,可以多次获取,不会被阻塞。 它是由类InterProcessMutex
来实现。 它的构造函数为:
这个类用到锁的代码入下:
另外这个获取节点父路径的比较有意思:
另一个特殊的地方是,官方文档说是创建master和worker节点都为临时节点,但是下面创建父路径的代码确是持久节点,而且zookeeper中,节点也为持久节点,可能是后期代码迭代,将znode节点改为了永久节点,但不知道其用意,等待后面的学习。
__EOF__

本文链接:https://www.cnblogs.com/erlou96/p/16878446.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律