目录
1.zookeeper典型使用场景
zookeeper分布式锁实现
路径下加分布式锁,加监听
锁的特性:1.独占性(zookeeper只能生成一个相同节点)
create /lock
get -w /lock
#...其他节点想创建lock节点会失败
delete /lock
基于临时节点和临时顺序节点加分布式锁
1.1 开发实战
使用springboot+mybatis测试上述案例
service减库存操作,采用两台JVM+ngnix前端操作测试,测试工具使用jmeter
controller层调用service减库存方法。
使用jmeter测试
http request增加一个监听
1.1.1 配置nginx
配置nginx,解压缩nginx压缩包,修改nginx.conf文件
启动nginx
出现负数
1.1.2 分布式锁
分布式锁使用
客户端初始化
重试策略
加锁与释放锁代码,初始化quotra客户端
加锁与解锁底层实现需要总结一下。(TODO)
结合下图公平锁实现来做
使用redis集群在master挂掉以后,slave选举成为master的过程中可能会丢失一部分数据。
而zookeeper在同步数据时候会把一半以上的机器同步完数据,这样即使leader节点挂掉也不会丢失数据,因为选举过程中新选出来的leader节点会把数据同步给其他节点,数据可靠性上还是zookeeper更好,性能上比redis差,因为要写一半以上的数据。
并发问题:1.读写并发不一致2.双写不一致问题。
共享锁实现图:写请求执行前必须保证其他的读请求和写请求都完成
源码:InterProcessReadWriteLock需要看一下写锁和读锁的实现,参照原理图
leader选举(Leader Election):启动三个java进程
1.1.3 注册中心
简单的两个服务之间调用可以使用扩容或者ngnix集群
多个服务之间注册调用使用zookeeper,使用临时顺序节点注册服务,并且设置监听,有服务节点变化会动态让其他节点感知。
zookeeper可以做注册中心,leader选举,分布式锁。
实现一个负载均衡算法调用test服务,多次访问可以通过负载均衡算法找到其中一台服务,某一台挂掉以后会通过超时机制剔除掉挂掉的服务。这个过程是zookeeper服务自己调用的过程。这个过程在springcloud中是通过ribbon通过心跳检测机制一定时间内请求