1.分布式技术-Zookeeper概述
目录
1.2 工作机制
![](https://i-blog.csdnimg.cn/blog_migrate/447f96d4dc823139f4067b2e690c3422.png)
1.3特点
![](https://i-blog.csdnimg.cn/blog_migrate/1dfe0481f69e1856bd001a06a68b7386.png)
1.5统一命名服务
![](https://i-blog.csdnimg.cn/blog_migrate/03a65a3b5fceb6552f2100c1604e3343.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1b2c17a9881efd7b0329bd4f431f73a8.png)
1.6 服务器节点动态上下线
1.7 软负载均衡
2.配置zookeeper
解压
[root@localhost opt]# tar -zxvf apache-zookeeper-3.6.0-bin.tar.gz
1. 在/opt/zookeeper/这个目录上创建zkData和zkLog目录
[root@localhost zookeeper]# mkdir zkData
[root@localhost zookeeper]# mkdir zkLog
[root@localhost conf]# cp zoo_sample.cfg zoo.cfg
dataDir=/opt/zookeeper/zkData
dataLogDir=/opt/zookeeper/zkLog
2.1配置参数详解
3. Zookeeper内部原理
![](https://i-blog.csdnimg.cn/blog_migrate/c0f0eb9cbb0439fa8958f924ac9d82f3.png)
![](https://i-blog.csdnimg.cn/blog_migrate/bd6228ba4347d0e1d921d91ea97a7dde.png)
4. Zookeeper实战(开发重点)
在/opt/zookeeper/zkData创建myid文件
[root@localhost zkData]# vim myid
打开zoo.cfg文件,增加如下配置
#######################cluster##########################
server.1=192.168.204.141:2888:3888
server.2=192.168.204.142:2888:3888
server.3=192.168.204.143:2888:3888
4.节点的怎删改查
首先创建一个客户端
//zookeeper集群的ip
private String connStr="192.168.58.129:2181,192.168.58.130:2181,192.168.58.131:2181";
//session超时的时间
private int session=60000;
//zooker客户端对象
private ZooKeeper zkClient;
@Before
public void init() throws IOException {
zkClient = new ZooKeeper(connStr, session, new Watcher() {
@Override
public void process(WatchedEvent watchedEvent) {
System.out.println("得到监听反馈");
System.out.println(watchedEvent.getType());
}
});
//创建节点
@Test
public void createtest() throws InterruptedException, KeeperException {
//参数一是要创建的目录,参数二就是创建的内容,参数三居室权限,参数4就是类型
String s = zkClient.create("/xiaoyu/xiaoyu2", "xiaoyu666".getBytes(),
ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT);
System.out.println( "已创建节点="+s);
}
获取节点的值
//获取节点上的值
@Test
public void getjiedian() throws InterruptedException, KeeperException {
//第三个参数就是获取到文件时返回的
byte[] data = zkClient.getData("/xiaoyu", false, new Stat());
String data1 = new String(data);
System.out.println("获取到的节点值为:"+data1);
}
查看子节点 调用这个getChildren方法她会返回一个节点集合然后遍历他就完事了
//查看子节
@Test
public void getChildren() throws InterruptedException, KeeperException {
List<String> children = zkClient.getChildren("/usa/niuyue/huashengdun", false);
for (String child : children) {
System.out.print(child);
}
System.out.println(children);
}
监听子节点
在第二个参数那里改成true即可,一旦节点数据变化或者子节点有变化就会给出反馈
//监听节点变化
@Test
public void watchNode() throws InterruptedException, KeeperException, IOException {
//监听节点
List<String> children = zkClient.getChildren("/usa", true);
for (String child : children) {
System.out.println(child);
}
System.out.println(children);
//让线程等待下去
System.in.read();
zookeeper的分布式锁
![](https://i-blog.csdnimg.cn/blog_migrate/a8abd2810f862b84b33364cad3c210f8.png)
idea代码
1.首先我们在虚拟机里面配置了一下nginx来模拟并发的操作
2.然后进行线程模拟
3.配置锁
内部互斥锁会根据传入过来的商品id创建一个商品节点,然后在节点下面创建暂存有序的节点进行监控,从而达到锁
private String connectString="192.168.58.129:2181,192.168.58.130:2181,192.168.58.131:2181";
@RequestMapping("/product/reduce")
public Object reduce(int id)throws Exception{
// 重试策略 (1000毫秒试1次,最多试3次)
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
//1.创建curator工具对象
CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, retryPolicy);
client.start();
//2.根据工具对象创建“内部互斥锁 这里第二个参数就是路径
InterProcessMutex lock=new InterProcessMutex(client,"/product_"+id);
//加锁
try {
lock.acquire();
prodoctService.reduceStock(id);
} finally {
//释放锁
lock.release();
}
return "ok";
}
4.进行并发测试
可以看出来,五次请求成功了之后库存就清空了,所以就请求失败了
学习中遇到的小问题
1.内存不够用,随便开三台虚拟机就满了
解决:斥巨资买了根内存才解决了,现在速度咔咔猛
2.虚拟机进行远程连接的时候频繁断开
解决:去服务里把VMOMwar虚拟机的服务全部打开
3.maven依赖的问题
解决:复制错误信息去网上搜,依赖这个问题不太好排除
4.Nginx配置文件的问题
解决: 1、更改配置判断配置文件是否正确:
nginx -t -c /usr/local/nginx/conf/nginx.conf
或者
cd /usr/local/nginx/sbin/nginx -t
2、重启nginx:
kill -HUP 主进程号或进程号文件路径
或者使用
cd /usr/local/nginx/sbin/nginx -s reload