Zookeeper应用场景
1. 配置中心
我们将配置信息存在zk中的一个节点中,同时给该节点注册一个数据节点变更的watcher监听,一旦节点发送变更,所有的订阅该节点的客户端都可以获取数据变更通知。使用zk可以解决机器规模大,配置变更频繁,本地文件和内存方式配置维护成本较高的问题。
2. 负载均衡
 建立server节点,并建立监听器监视server子节点的状态,在每个服务器启动时,在servers节点下建立具体服务器地址的子节点,并在对应的子节点下存入存入服务器的相关信息,我们在zk服务器上可以获取当前集群中的服务器列表及相关信息,可以自定义一个负载均衡算法,在每个请求过来时从zk服务器中获取当前集群服务器列表,根据算法选择其中一个服务器处理请求
3. 命名服务
命名服务是分布式系统中的基本功能之一,被命名的实体通常是集群中的机器,提供的服务地址或者远程对象,这些都可以称作名字,常见的是一些服务框架如RPC和EMI中的服务地址列表,通过使用名称服务客户端可以获取资源的实体,服务地址和提供者信息。命名服务就是通过一个资源引用的方式来实现对资源的定位和使用,在分布式环境中,上层应用仅仅需要全局唯一名称,就像数据库中的主键。  ① 在zk中通过顺序创建节点就可以实现,所有客户端会根据自己的任务类型来创建一个顺序节点 ② 节点创建完毕后,create()接口会返回一个完整的节点名,例如:job-00000002;拼接type类型和完整节点名作为全局的唯一ID
4. DNS服务
(1)域名配置 在分布式系统中,每一个应用都需要分配一个域名,日常开发中,往往使用本地HOST绑定域名解析,开发阶段可以随时修改域名和IP的映射,大大提升开发的调试效率,如果应用的机器规模达到一定程度后,需要频繁更新域名是,需要在规模的集群中变更,无法保证实时性,可以在zk上创建一个节点进行域名配置。  (2)域名解析 应用解析时,首先从zk域名节点中获取域名映射的IP和端口 (3)域名变更 每个应用都会在对应的域名节点注册一个数据变更的watcher监听,一旦监听的域名节点数据变更,zk会向所有订阅的客户端发送域3名变更通知
5. 集群管理
(1)机器上下线  (2)机器监控 在机器运行过程中,Agent会定时将主机的运行状态信息写入到/machines/hostn主机节点,监控中心通过订阅这些节点的数据变化来获取主机的运行信息
6. 分布式锁
(1)数据库实现分布式锁实现思路  (2)代码实现 ① 数据库锁表创建,锁表中字段设置唯一约束  ② 定义锁,实现lock接口,tryLock方法尝试获取锁,从锁表中查询指定的锁记录,如果查询到记录说明已经上锁,不能再上锁  ③ 在lock方法获取锁之前先调用tryLock方法尝试获取锁,如果未加锁则向锁表中插入一条锁记录来获取锁,这里通过循环,如果上锁我们一直等待锁的释放  ④ 释放锁即将数据库中的对应的锁表记录删除 
7. redis实现分布式锁
redis分布式锁的实现基于setnx,设置成功,返回1,失败返回0,释放锁可以通过del指令实现 由于设置锁后在执行中间过程时程序抛出异常,导致del命令没有调用,锁没有释放,这样会陷入死锁,所以我们拿到锁后可以给锁加上过期时间,这样过期会自动释放锁 同时setnx和expire,如果进程挂掉,expire不能执行也会死锁,需要保证这两个命令是原子操作  espire设置过期时间,ttl进行查看剩余时间  (1)lock获取锁方法 定义锁,实现lock接口,tryLock方法设置锁  (2)释放锁 
8. redisson实现分布式锁
为了解决redis单点问题,我们会部署redis集群,在Sentinel集群中,主节点突然挂掉,同时主节点中有锁没及时同步到从节点,就会导致用一把锁被两个客户端同时持有,Redis推出了Redlock算法解决这个问题
(1)导入依赖redisson  (2)获取锁并释放锁 此处的key为redis的key,释放可以调用unlock方法 
9. zookeeper实现分布式锁
(1)原理及实现思路图  (2)代码实现  ① 连接zk,创建lock根节点  ② 内部类添加监听  ③ 上锁,创建临时节点并进行判断  ④ 释放锁 
10. 分布式队列
 ① 在队列节点下创建临时节点,如/queue/info/192.168.1.1-0000001 ② 调用getChildren接口获取/queue_info节点下所有子节点,获取队列中所有元素 ③ 比较自己节点是否是序号最小的节点,不是,则等待其他节点出队列,在序号最小的几点注册watcher ④ 获取watcher通知后,重复以上操作 具体流程图如下: 
|