00:00
好,接下来呢,我们来代码实现一下咱们的分母之所,那么这个代码实现呢,我们可以先去创建两个类出来,那么一个是ZK,呃,这个类。那我们再来去创建一个分布式所。这个类。那么咱称之为开啊,Distributed lock。啊,那么这个呢,是分布式所学的类啊,那么这话是我们的ZK客户端。那么有这些客户端呢,去负责获取链接,你去释放链接。那么前面呢,我们去玩咱们这个ZK test的时候呀,咱们在慢方法,慢方法里面去获取链接,那我们可以发现啊,这个获取链接呢,其实我们需要等一段时间。那么即使呢,我们有的时候把这个地方改成域名,是依然呢,可能需要一些时间。那么这个时间呢,它也会影响我们加锁的解锁的性能。哎,那我们是不是可以项目一启动的时候就去获取链接呢?那将来我加锁解锁的时候,咱就不用再去获取和释放链接了,那么既然的话呢,可以提高我们分布式锁的这个性能。
01:06
那我们可以在哪里来做呢?在我们的ZK肯定里面来做。那我们这个这K肯林呀,你就可以给它注入到啊死神容器里面去,那么怎么让它一启动的时候就去获取链接呢?哎,咱们可以利用这样的一个方法叫in啊方法,那在unit方法上面呢,我们可以来一个啊post啊是compac这个注解。那么啊,只要了解过死盆容器的同学啊,应该都对这个注解呢不陌生。那么这个抗性注解啊,它是什么东西呢?它呀代表呢,是在项目启动的时候啊,就给初始化死命容器,那么死配容器啊,同时呢,会去扫描咱们这个注解所在的这个类,然后并且调用这个类的无参构的方法。然后来给我们初始化Z使用对象。而post他的这个注解,所谓的方法呀,它会在无参方法执行之后,那么立马来以执行。
02:01
那这里可以保证啊,我们项目启动的时候,它就会执行这样的一个方法。那我就可以在这个方法里面来去获取那么链接,那么这样的话呢,啊,它项目啊,启动时启动启动时就可以获取链接了。好,那么这是它啊,那么这个释放链接怎么去释放呢?那么新组K链接啊,它属于一种属于一种长链接,那只要我的项目还在健康运行着啊,咱就不用去释放链接啊。那么什么时候才需要释放呢?当我项目停止的时候,那么死SPA容器呢?在销毁之前我们需要去释放连接,那么就可以去使用啊destroy啊这个方法来去释放连接,那么在destroy方法上面那加一个destroy啊。那么它的话呢,会在咱的死喷容器那么销毁之前,那么来去执行这个方法。那么SPA容器都销毁了,那这个对象还有没有呢?
03:01
也无法依,呃,依依,依赖于这个思维容器了啊,那么咱们呢,就可以去销毁这个链接了。那么在这个里面呢,来去释放啊ZK的啊,链接啊链接。那么这样的话呢,我们每一次加锁解锁的时候,咱就不用干这些事情了啊,既然的话呢,可以提高我们走开分锁的性能。好,那么然后咱就可以把咱们这个,呃,获取链接这个过程啊,给它拷贝过来呢,放在我们这个ZK。啊,这个阴的方法里面去扔进去。那么扔了之后呀,我们这个地方呢,应该少了一个画括号,然后是K可能会有异常啊。那么这个异常呢,咱可以去。啊,补获这个最大的这个异常,如果有异常的情况下,我们可以来一个,那么这个E啊,来一个E,那是print啊take啊这样的。那么然后呢,咱们这里呢,可以初始化一个走keep客户端,我们就去定义一个,呃,Keep客户端将来呢,去获取啊这个初始化对象。
04:08
那么在这个post底错方法里面,等于释放链接,我就可以把慢方法里面的释放链接这行代码呀,这几行代码呢,给它拷贝到底错里面去。那么有异常呢,我们也可以来一个嗯,Try catch啊处理一下。好,那么咱们这个获取链接和释放链接啊,全部都交给四分容器了,就完成了。那么然后呢,我们再来去看,那么这个客户端呢,其实最主要的我们要让他完成什么东西呢?完成锁的初始化。那你比如说之前呢,我们在使用red分的时候呀,哎,首先呢,我们来注入一个客户端。那么这下来的话呢,我们使用ZK肯定的啊,所ZK分母式所得式O啊,我们也希望去注意一个ZK肯定的对象啊,ZK肯定对象,那么来一个啊,U true where,哎,那么这一点呢,就很相似了啊。
05:02
然后呢,这个the't它可以获取一个锁对象,那然后呢,Lock方法就可以加锁,UN方法就可以进行解锁。那我们的这个ZK肯啊,也可以具备这样的一个功能。那我们呢,来去返回一个ZK,然后是ribute lock这样的一个对象啊,Get lock这样的一个方法,可以返回一个ZK抵垂beautifullo这么一个对象啊,那么然后呢,这个方法里面我可以去谬一个,就初始化一个分的对分布式所对象来谬一个ZK。Lock。那么你想你获取锁的时候,单肯定要去,要去指定一个锁的名称。那么咱的分布式锁呀,本质是对这个锁的名称的一个增强啊。如果你不让用户来定义这个锁的名称的话,不让使用者来定义锁的名称的话,就会导致什么情况呢?你如果在程序里面写锁的话,就会导致呢,咱所有的分布所争抢的是同一个啊,都同一个资源。
06:03
那我们所名称不一样,那资源就不一样。那么如果我需要抢同一个资源的话,我可以定义成一样的索命车,让使用者来定义。那这的话呢,咱们这个地方也是一样,应该允许用户来去自定义这个锁的名称,来一个锁还是lock name,那么在左keep里面呢,将来我们我们会以这个锁的名称再去创建一个呃,Z no的节点。那本质呢,是对window的基点创建权的一个增强。OK,那么然后呢,我们再来看将来呢,我们使用的时候呀,咱就可以怎么使用了呢,咱可以把这个方法呢,给它拷贝一下,让它放在啊这个上面去啊。那么然后咱这个方法呢,应该给它改成几了,改成八了啊改成八。那我们再把这个方法呢,给它还原回去,那么初始代码呀,应该只剩。啊,只剩这几行代码啊,把这个呢给它删掉啊,这个呢也给它删掉,那只剩这几行代码。
07:00
那我们可以在方法开始的时候,通过这个ZK图来去获取一个分母索对象,那我可以指定一个索名称,比如咱就叫lock啊,那最终返回的是一个block对象。那我将来呢,有了这个lock对象之后啊,哎,我还要有什么呢?有咱们的lock方法和unlock方法,那我可以让咱们这个ZK ZK lock,对lock这个类啊,可以实现这个GUUC里面的lock接口。那么咱这样的话就可以有里面的加锁解锁方法了哈。那么这样呢,我就可以在这个service里面啊来去啊调用lock锁的加锁方法,以及呢锁的啊解锁方法了,来一个unlock。哎,不就这么简单吗?因为大家使用方式呀,跟reding clean这个使用锁的方式呢,几乎是一模一样的。好,那我们再回到代码里面去啊,这个这些呢,我们就分成这样子啊。
08:01
好,那么我们还得要把这个lock name要传递给这个分布所对象啊。那怎么传递进去呢?我们可以呢,直接通过这里构造方法直接传递进去。那么将来在这个VK的底垂,别的lock里面我加锁和解锁。那么肯定要去创建节点和释放节点。那你创建节点和释放节点,你肯定就需要很多,就需要我们这个keep客户端对象啊,就需要这个对象。那这个对象,哎,我们呢,在这些里面通过磁备容器已经输上好了。那我们呢,就可以把这个ZK。啊,The客户端对象也传过去。直传过去。那我在这个VK lock里面呢,就需要有这样的一个构造方法啊,那我们来去添加一下这个构造方法。那么课堂法里面啊,至少呢,要有两个参数啊,一个是the k这的一个参数,那么还应该有什呢?Lock name,这个参数也应该给我传过来,将来我要根据这个ZK,根据lock name来创建Z的节点啊。
09:04
那我们还要接受一下这个lock lock name啊,这两个参数好,那么咱呢,来去定义一个啊,然后是spring lock name。好,那我这个地方呢,就可以来一个啊,This lock name。Lockname,然后等于呢,好,Lockname。啊,这样就可以了啊。那么还没完呢,对吧,那比如说我要去创建这样的一个lock name这样的一个节点。那我给他在哪个节点下创建这个节点呢?创建这个lock map这个节点呢?那首先还得要有个定节点。跟咱一般都一直给根节点。啊,那么你可以在这个杠这个根基点下面来一个创建,那我们这的话呢,咱就不在杠这个基点下面来创建这个lock name节点了啊,那我们打算呢,在这个杠locks这个地点下面来一个创建。那么这个根节点不要存在,如果根节点不存在的话,比如你这里直接去创建一个呢,创建一个locks,然后杠lock节点的话,它这里就会报错,它就会报错,那么这个比如说咱将来呢,我所有的这个锁呀,都创建在。
10:12
这样的一个根基点下面去,这根基点啊,我可以给它定义死啊,来一个的一个非类型的字段,那么然后是route啊,Pass等于来一个杠啊,Locks,将来所有的锁都放在这个节点下面去。然后呢,我在这个里面呢,嗯,在初始化咱们这个分布式所的时候呢,同时你要判断一下有没有这个根节点。如果没有这个根节点,我加速的时候就创建这个节点的话,创建这个子节点的话,它就会报错的,对啊啊是的话,它要有这个根节点,将来我才能去创建子节点啊。那我要去判断这个根基点是否存在。啊,来一个A判断,嗯,然后呢是the keep点上this,啊把这个route pass放进去,然后呢,咱不需要以监听这个位置啊,如果你等于那的情况下,就说明呢你不存在。
11:06
那你不存在,我就得创建了啊,来一个the k点上create,然后呢,咱们要创建这个根节点,然后这个内容啊,咱也不不需要什么内容,来个none就可以了,然后这个权限呢,我们可以来指定为呃,开放权限啊,任何人都可以去访问操作。那么这个节点类型啊,咱们创建一个持久化节点就可以了啊,那么这个根节点呢,我们可以让一直存在着。啊,将来我所有的锁都在这个节点下面啊,OK,那么你的这个子节点可以叫log,那也可以叫其他的。那么这个啊,根节点初始化呀,它有异常,我们可以来一个拆开啊处理一下。好,那么我们这样的话呢,咱们的整体结构呢,就已经出来了。将来使用我们这个分母所数就这样去使用就可以了啊。就这样去使用可以了,那我们接下来要去实现枷锁和解锁方法了。
12:01
那么加锁方法,其实咱之前就分析过,本质呢啊,就是一个创建啊,创建z no的z no的节点的这样的一个过程啊。哎,如果创建成功了。那就代表呢会伊所成功了。那么如果出现节点失败了呢?那我们可以进行重试,哎,我可以呢,在一直重试的这个位置,直到创建成功位置啊。OK,那么然后这个解锁呀,其实呢,我们就是一个就是一个删除,删除z node,那么节点的这样的一个过程,OK,那么咱们呢,来看这个代码总。
我来说两句