分布式与微服务
https://www.funtl.com/zh/guide/Apache-Dubbo.html
Dubbo是RPC通信框架,而不是微服务架构解决方案。 zookeeper+Dubbo才能成为微服务架构解决方案。
分布式锁
分布式协调技术,主要用来解决分布式环境中,多个线程的同步控制,让他们有序的访问临界资源,防止造成脏数据的后果。
zookeeper就是一种分布式协调技术,本质上是利用**分布式锁**。
分布式锁对象是进程
可以利用redis或者zookeeper来实现分布式锁,但redis本质并不是拿来实现分布式锁的,仅仅是利用了他的单线程处理。
redis分布式锁
获得锁:某一个进程获得资源后,就会去redis里setnx(此服务,value),这就是加锁。
两大问题:非原子性操作和误删锁
原子性操作:setnx和expire两个命令必须同时执行,要么不要执行。redis2.6提供了set(key,value,expire),保证原子性
误删锁:
JVM1 ->set(商品1,1,30)
结果在30秒内,JVM1工作没有完成,reids因锁过期删除(商品1,1)
JVM2 ->set(商品1,1,30)
JV1工作结束 -> del(商品1,1),结果删除了jvm2的锁
解决方法
set(商品1,threadID,expire) 删除前判断是否是此线程的锁
守护线程:
JVM中同时有处理线程与守护线程
守护线程快到expire时间时,加入处理线程没有处理完成,他会向redis中增加expire时间,从而延时
zookeeper数据结构
每个节点最多只能存1MB数据
Znode 分为四种类型:
持久节点(PERSISTENT)
默认的节点类型。创建节点的客户端与 Zookeeper 断开连接后,该节点依旧存在。
持久节点顺序节点(PERSISTENT_SEQUENTIAL)
所谓顺序节点,就是在创建节点时,Zookeeper 根据创建的时间顺序给该节点名称进行编号
临时节点(EPHEMERAL)
和持久节点相反,当创建节点的客户端与 Zookeeper 断开连接后,临时节点会被删除:
临时顺序节点(EPHEMERAL_SEQUENTIAL)
顾名思义,临时顺序节点结合和临时节点和顺序节点的特点:在创建节点时,Zookeeper 根据创建的时间顺序给该节点名称进行编号;当创建节点的客户端与 Zookeeper 断开连接后,临时节点会被删除。Zookeeper的分布式锁就是利用了临时顺序节点,临时顺序节点里存放的是临界资源
Zookeeper事件通知
Zookeeper 客户端在请求读操作(exists,getData,getChildre
)的时候,可以选择是否设置 Watch
。设置watch则是启动服务通知。客户端(即一个调用服务的jvm进程)调用 getData
方法,