3 注册中心的设计原理
3.1 调度系统使用Zookeeper做什么
ZooKeeper 是 Apache 软件基金会的一个软件项目,它是一个针对大型分布式系统的可靠协调系统,为大型分布式计算提供开源的分布式配置服务、同步服务和命名注册。调度系统使用Zookeeper进行分布式环境下作业配置信息注册,监听更新,使用Zookeeper实现分布式锁进行主节点选举,使用临时节点实现作业实例上下线等操作。
3.2 调度系统注册中心设计
在上篇文章中通过Java启动作业调度的Demo我们可以看到Zookeeper初始化过程有如下操作:
//1-创建zookeeper配置对象
ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration(serverList, namespace);
//2-通过Zookeeper配置对象创建注册中心对象
CoordinatorRegistryCenter zookeeperRegistryCenter = new ZookeeperRegistryCenter(zookeeperConfiguration);
//3-初始化注册中心
zookeeperRegistryCenter.init();
完成Zookeeper的初始化连接主要流程如下:
图3.1 注册流程
在调度系统中完成Zookeeper的初始化流程主要分为3步先创建一个用来封装Zookeeper配置信息的ZookeeperConfiguration类型 ,然后再根据配置信息创建Zookeeper注册中心对象,最后初始化注册中心。
接下来我们先整体看一下注册中心这一块的类型包含来哪些:
图3.2 注册中心包和类结构
注册中心接口层:最顶层的设计就是注册中心接口RegistryCenter 未来各种类型的注册中心都要继承或实现此接口,然后就是往下的用于协调分布式服务的注册中心的CoordinatorRegistryCenter接口,用于封装一些协调式分布式服务的注册中心共同行为。然后独立提供了一个用于注册中心选举候选人用的选举接口ElectionCandidate。
注册中心实现层:这里目前提供了用于协调式分布式服务典型的注册中心组件Zookeeper的封装,基于Zookeeper封装的注册中心类ZookeeperRegistryCenter。包含了配置实体类ZookeeperConfiguration,另外还提供了ZookeeperElectionService选举服务类。
异常类型:这里提供了一个自定义异常类型RegException来表示注册中心相关的异常,RegExceptionHandler注册中心异常处理类处理注册中心相关的异常信息。
3.3 Zookeeper配置详解
Zookeepeer客户端配置信息主要使用ZookeeperConfiguration类型封装主要配置信息如下:
属性名 | 属性类型 | 属性描述 |
---|---|---|
serverLists | String | 连接Zookeeper服务器的列表, 包括IP地址和端口号. 多个地址用逗号分隔. 如: host1:2181,host2:2181 |
namespace | String | 调度节点的命名空间 |
baseSleepTimeMilliseconds | int | 等待重试的间隔时间的初始值.单位毫秒. |
maxSleepTimeMilliseconds | int | 等待重试的间隔时间的最大值. 单位毫秒. |
maxRetries int | 最大重试次数. | |
sessionTimeoutMilliseconds | int | 会话超时时间. 单位毫秒. |
connectionTimeoutMilliseconds | int | 连接超时时间. 单位毫秒. |
digest | String | 连接Zookeeper的权限令牌. 缺省为不需要权限验证. |
3.4 ZookeeperRegistryCenter原理解析
ZookeeperRegistryCenter是实现了协调注册中心的实现类用于和Zookeeper分布式协调组件进行交互的建模,接下来我们先看下他的类继承关系:
图3.3 注册中心类结构
可以看到协调注册中心类型ZookeeperRegistryCenter是针对协调注册中心类型的实现。
再来看下主要的成员变量:
图3.4 ZookeeperRegistryCenter类成员变量
主要的成员变量我们来看下:
ZookeeperConfiguration类型的zkConfig变量,这个ZookeeperConfiguration类型用来封装了Zookeeper的相关配置信息,具体配置信息可以参考3.3章节中我们描述的配置信息表格。
Map<String, TreeCache>类型的caches对象,用来保存Zookeeper路径下节点数据的缓存对象,用来实现对Zookeeper节点的监听操作。
CuratorFramework类型的client,Curator是Netflix公司开发的强大的Zookeeper客户端工具,CuratorFramework框架是ZooKeeper Client更高的抽象API,这里可以了解下ZooKeeperRegistryCenter底层的实现原理,针对Zookeeper的操作主要是基于CuratorFramework来实现对Zookeeper的操作的,CuratorFramework具有哪些特征呢:更清晰的API: 简化了ZooKeeper原生的方法, 事件等, 提供流式fluent的接口,提供Recipes实现 : 选举,共享锁, 路径cache, 分布式队列,分布式优先队列等。
slf4j包下的Logger类型的log对象,主要用来标准化打印日志。
3.5 注册中心常用操作方法
注册中心设计中相关的父接口一共有两个类型:
RegistryCenter
CoordinatorRegistryCenter
在这里协调注册中心类型继承RegistryCenter注册中心类型,未来注册中心类型还可以扩展为其他注册中心类型,我们看一下设计中主要的提供的操作方法:
可以看到注册中心客户端对于注册中心的操作主要是连接,关闭方法和常见的增加,修改,删除,查询节点等类型的基本操作。后面我们主要使用作业节点操作类型JobNodeStorage类型来调用注册中心接口为我们开放的操作方法。
查看更多原文,技术咨询与支持,可以扫描微信公众号进行回复咨询
ElasticJob11, ElasticJob源码解析11, 注册中心1