欢迎光临散文网 会员登陆 & 注册

袁庭新老师带你玩转Zookeeper实现分布式锁商品秒杀

2023-10-11 16:23 作者:袁庭新  | 我要投稿

对大名鼎鼎的Zookeeper分布式服务框架,想必很多小伙伴儿都听过,今天袁老师就将带领大家来学习Zookeeper相关的知识。首先,给大家介绍下ZooKeeper框架。ZooKeeper是一个分布式的(多台服务器干一件事)、开放源码的分布式应用程序协调服务,这是对Google Chubby开源项目的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。

美团、饿了么、淘宝和58同城等项目都是Zookeeper的现实生活版。举个例子,袁老师我开了家饭店,如何才能让大家都能吃到我的饭菜呢?只要入驻美团,大家就可以在美团APP中看到我的饭店进行下单了,这样就完成了一次交易。

今天袁老师会给各位小伙伴们分享一篇关于分布式框架Zookeeper的高级使用教程,通过Zookeeper来实现分布式锁的功能。

01 分布式锁介绍

我们在多线程中接触过锁的概念,其作用就是让当前的资源不会被其他线程访问。给大家举个例子:

  • 我的日记本,不可以被别人看到,所以要锁在保险柜中。

  • 当我打开锁,将日记本拿走后,别人才能使用这个保险柜。

在Zookeeper中使用传统的锁会引发的“羊群效应”:1000个人创建节点,只有一个人能成功,999人需要等待。

羊群是一种很散乱的组织,平时在一起也是盲目地左冲右撞,但一旦有一只头羊动起来,其他的羊也会不假思索地一哄而上,全然不顾旁边可能有的狼和不远处更好的草。所以”羊群效应“就是比喻人都有 一种从众心理,从众心理很容易导致盲从,而盲从往往会陷入骗局或遭到失败。袁老师通过下面这幅图来解析Zookeeper分布式锁的实现原理。

为了避免“羊群效应”的产生,Zookeeper采用了分布式锁来解决。

我们可以将分布式锁的实现概括为以下四个步骤:

1.所有请求进来后,在/lock下创建临时顺序节点,Zookeeper会帮你编号排序。

2.判断自己是不是/lock下最小的节点。

   - 是,获得锁(创建节点)

   - 否,对前面小我一级的节点进行监

3.获得锁请求,处理完业务逻辑,释放锁(删除节点),后一个节点得到通知。

4.重复上面的步骤二。

接下来我们就按照以上步骤进行代码实现吧。

02 搭建项目环境

1.初始化数据库

我们先创建一个数据库zk_db数据库实例,并使用默认的字符集utf8。

然后在zk_db数据库中创建商品表(t_product)和订单表(t_order)。

2.搭建工程

首先,请大家跟着袁老师来创建一个Maven类型的项目工程,项目名称设置为【zk_product】,然后在main⽬录下创建⼀个webapp⽂件夹,并自动生成webapp/WEB-INF/web.xml核心配置文件。项目的工程搭建核心步骤见下。

1.我们可以搭建SSM架构类型的项目,搭建完后项目的目录结构见下:

2.接着在项目的pom.xml配置文件中导入依赖:

3.然后在resources目录下创建mybatis目录,并在该目录下创建MyBatis的配置文件mybatis-config.xml。

4.在resources目录下创建jdbc.properties文件,并在该文件中添加数据库连接配置。

5.接着在resources目录下创建spring目录,并在该目录下创建Spring的配置文件spring.xml。

6.最后在web.xml文件中添加配置。

03 业务功能实现

1.在com.cy.product.pojo包下创建Order实体类。

2.在com.cy.product.pojo包下创建Product实体类。

3.在OrderMapper接口中添加生成订单的方法。

4.在ProductMapper接口中添加查询商品、减库存的方法。

5.在OrderService接口中添加reduceStock(int id)方法。

6.在OrderServiceImpl类中实现reduceStock(int id)方法。

7.在ProductAction类中配置访问的路径。

8.启动项目工程。然后双击选项【Maven】-【zk_product】-【Lifecycle】-【package】启动项目工程。最后通过浏览器访问http://localhost:8001/product/reduce?id=1地址进行测试。

9.异常情况。项目启动后,如果访问上述地址时提示NoSuchMethodError的异常。出现这种情况,是因为spring-webmvc依赖的版本太高了,设置为5.3.0以下。

04 功能测试

接下来我们要搭建一个测试环境,大家可以跟着袁老师安装Nginx和JMeter。

1.Nginx配置

在CentOS系统中,我们哟啊提前安装好Nginx服务器,关于Nginx的安装在这里我就不再赘述了。

然后要进入Nginx安装目录,编辑nginx.conf配置文件。

最后在nginx.conf文件中添加如下的配置做负载均衡。

2.JMeter配置

访问JMeter官网地址见下链接:

根据不同操作系统选择对应的版本。

2.1 Windows系统安装JMeter

在windows系统下下,我们将下载的apache-meter-5.5.zip压缩包解压到指定目录下即可。然后新建一个JMETER_HOME环境变量,变量值填写解压后的目录。

接着我们要在用系统变量path中添加bin配置。

2.2 Mac OS系统安装JMeter

如果是在Mac OS系统下,我们下载成功后,需要在终端使用命令进入下载文件夹,通过命令解压压缩包。

接着配置JMeter的启动方式,在终端打开环境变量配置.bash_profile文件。

然后在.bash_profile文件中添加JMeter环境变量的配置。

保存后关闭文档,使用命令使文件生效。

我们在Mac终端直接输入以下命令,就可以直接打开JMeter页面。

界面设置为永久中文。找到JMeter安装目录下的bin目录,打开jmeter.properties文件。

请求的响应体乱码解决。找到JMeter安装目录下的bin目录,打开jmeter.properties文件。

3.使用JMeter

我们可以打开JMeter的选项【Test Plan】-【Add】-【Threads (Users)】-【Thread Group】,并做如下的配置。

在JMeter窗口中右键选项【Thread Group】并选择【Add】-【Sampler】-【HTTP Request】,做如下的配置。

最后右键选项【HTTP Request】并选择【Add】-【Listener】-【View Results Tree】选项,然后点击“播放”按钮执行请求发送。

4.项目测试

我们可以启动两次工程,端口号分别设置为8001和8002。在不同的端口号下启动同一个项目,相当于运行了两个项目。

使用JMeter工具模拟1秒内发出10个THHP请求。查看测试结果,10次请求全部成功。请求执行结束后,查看数据库,发现表中的stock字段的库存数量变为-5 (并发导致的数据结果错误)。

05 Zookeeper解决并发问题

基于Zookeeper原生态的客户端类实现分布式是非常麻烦的,我们可以使用Apahce Curator提供的一个Zookeeper客户端来实现。Curator官网:http://curator.apache.org。

我们先在项目的pom.xml文件中添加Curator依赖。

recipes是Curator族谱大全,里面包含Zookeeper和Framework。然后在控制层中加入分布式锁的逻辑代码。

接着将项目中的pom.xml文件中配置的端口分别设置为8001和8002,然后启动两次工程。

并再次使用JMeter工具,模拟1秒内发出10个THHP请求进行测试,从测试结果看出并发问题解决。

06 回顾总结

利用Zookeeper分布式锁实现商品秒杀的案例,袁老师就给大家分享完了。在今天的内容中,袁老师首先给大家介绍了分布式锁的概念以及分布式锁的实现原理,然后通过代码实现Zookeeper分布式锁商品秒杀。为了模拟出分布式环境下秒杀的问题,我们搭建了Nginx代理服务,并通过JMeter进行高并发请求压力测试,最后通过Curator工具来解决分布式存在的并发问题。

今天的内容,你学会了吗?关注「袁庭新」,干货天天都不断!


袁庭新老师带你玩转Zookeeper实现分布式锁商品秒杀的评论 (共 条)

分享到微博请遵守国家法律