zookeeper实现分布式锁
仓库地址: README.md · J_look/ssm+zookeeper - Gitee.com
- 锁:我们在多线程中接触过,作用就是让当前的资源不会被其他线程访问!
我的日记本,不可以被别人看到。所以要锁在保险柜中
当我打开锁,将日记本拿走了,别人才能使用这个保险柜 - 在zookeeper中使用传统的锁引发的 “羊群效应” :1000个人创建节点,只有一个人能成功,999
人需要等待! - 羊群是一种很散乱的组织,平时在一起也是盲目地左冲右撞,但一旦有一只头羊动起来,其他的羊
也会不假思索地一哄而上,全然不顾旁边可能有的狼和不远处更好的草。羊群效应就是比喻人都有
一种从众心理,从众心理很容易导致盲从,而盲从往往会陷入骗局或遭到失败。
实现分布式锁大致流程
整体思路
-
所有请求进来,在/lock下创建 临时顺序节点 ,放心,zookeeper会帮你编号排序
-
判断自己是不是/lock下最小的节点
-
是,获得锁(创建节点)
-
否,对前面小我一级的节点进行监听
-
获得锁请求,处理完业务逻辑,释放锁(删除节点),后一个节点得到通知(比你年轻的死了,你
成为最嫩的了)
-
重复步骤2
安装nginx
安装nginx运行所需的库
//一键安装上面四个依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
下载nginx
在那个目录下执行这个命令 就会下载到哪个目录下
//下载tar包 wget http://nginx.org/download/nginx-1.13.7.tar.gz
解压
注意哦 解压出来的文件 我们还需要安装哦
下面所有的命令 都是在nginx-1.13.7文件夹里面进行哦
tar -zxvf nginx-1.13.7.tar.gz
-
查看解压出来的文件
ll ./nginx-1.13.7
安装
创建一个文件夹,也就是nginx需要 安装到的位置
mkdir /usr/local/nginx
执行命令 考虑到后续安装ssl证书 添加两个模块
./configure --with-http_stub_status_module --with-http_ssl_module
执行make install命令
make install
- 我们可以来到nginx安装到的目录下查看
- 你们没有我这么多目录 conf 配置 sbin 启动nginx
博主技术有限
,还没有深入去学习nginx的 大致这样介绍吧-
启动nginx服务
我这个是在/ 目录底下执行的 你们可以根据 自己所在的目录去执行
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
访问nginx
nginx的默认端口是80
配置nginx
我们所做的配置大概就是
- 当有请求去访问我们服务器,
- 然后负载到我们处理请求的服务器 我这里是两台
- 为了方便 处理请求的这两台服务器 是在我Windows上
打开配置文件
# 打开配置文件 vim /usr/local/nginx/conf/nginx.conf
红框的位置 查看本机ip
upstream look{ server 192.168.204.1:8001; //192.168.204.1是我本机的ip地址,8001是tomcat的端口号 server 192.168.204.1:8002; //8002是另外一个工程的tomcat端口号 } server { listen 80; server_name localhost; #charset koi8-r; #access_log logs/host.access.log main; location / { proxy_pass http://look; root html; index index.html index.htm; }
工程的搭建
搭建ssm框架 有时间推出springboot的版本
- 创建一个maven项目(普通maven项目即可)
创建数据库:
-- 商品表 create table product( id int primary key auto_increment, -- 商品编号 product_name varchar(20) not null, -- 商品名称 stock int not null, -- 库存 version int not null -- 版本 ) insert into product (product_name,stock,version) values('锦鲤-清空购物车-大奖',5,0)
-- 订单表 create table `order`( id varchar(100) primary key, -- 订单编号 pid int not null, --