篮球网站建设目标,个人开公众号有意义吗,公众号首图制作网站,丹东有做公司网站的吗一 curator的说明
1.1 curator的说明
curator是netflix公司开源的一个zk客户端。对Zookeeper提供的原生客户端进行封装#xff0c;简化了Zookeeper客户端的开发量。Curator解决了很多zookeeper客户端非常底层的细节开发工作#xff0c;包括连接重连、反复注册wathcer和Node…一 curator的说明
1.1 curator的说明
curator是netflix公司开源的一个zk客户端。对Zookeeper提供的原生客户端进行封装简化了Zookeeper客户端的开发量。Curator解决了很多zookeeper客户端非常底层的细节开发工作包括连接重连、反复注册wathcer和NodeExistsException异常等。
1.2 curator的特点
1.封装ZooKeeper client与ZooKeeper server之间的连接处理
2.提供了一套Fluent风格的操作API
3.提供ZooKeeper各种应用场景(recipe,比如分布式锁服务、集群领导选举、共享计数器、缓存机制、分布式队列等)的抽象封装这些实现都遵循了zk的最佳实践并考虑了各种极端情况。
1.3 curator的具体锁 二 curator的InterProcessMutex可重入锁
2.1 原理
reentrant和JDK的ReentrantLock类似 意味着同一个客户端在拥有锁的同时可以多次获取不会被阻塞。它是由类InterProcessMutex来实现。
2.2 常用API
// 常用构造方法 public InterProcessMutex(CuratorFramework client, String path) // 获取锁 public void acquire(); // 带超时时间的可重入锁 public boolean acquire(long time, TimeUnit unit); // 释放锁 public void release();
2.3 代码实现
2.3.1.pom文件sdk引入 dependencygroupIdorg.apache.curator/groupIdartifactIdcurator-framework/artifactIdversion5.3.0/versionexclusionsexclusiongroupIdorg.apache.zookeeper/groupIdartifactIdzookeeper/artifactId/exclusion/exclusions/dependencydependencygroupIdorg.apache.curator/groupIdartifactIdcurator-recipes/artifactIdversion5.3.0/versionexclusionsexclusiongroupIdorg.apache.zookeeper/groupIdartifactIdzookeeper/artifactId/exclusion/exclusions/dependency
2.3.2 初始化客户端
Configuration
public class CuratorConfig {Beanpublic CuratorFramework curatorFramework(){// 重试策略这里使用的是指数补偿重试策略重试3次初始重试间隔1000ms每次重试之后重试间隔递增。RetryPolicy retry new ExponentialBackoffRetry(30000, 3);// 初始化Curator客户端指定链接信息 及 重试策略CuratorFramework client CuratorFrameworkFactory.newClient(192.168.43.4:2181, retry);client.start(); // 开始链接如果不调用该方法很多方法无法工作return client;}
} 2.3.3 分布式锁代码 Autowiredprivate CuratorFramework curatorFramework;public void checkAndLocksByCurator() throws KeeperException, InterruptedException {InterProcessMutex mutex new InterProcessMutex(curatorFramework, /curator/lock);try {// 加锁mutex.acquire();// 先查询库存是否充足Stock stock this.stockMapper.selectById(1L);// 再减库存if (stock ! null stock.getCount() 0){stock.setCount(stock.getCount() - 1);this.stockMapper.updateById(stock);}this.testSub(mutex);// 释放锁mutex.release();} catch (Exception e) {e.printStackTrace();}}public void testSub(InterProcessMutex mutex) {try {mutex.acquire();System.out.println(测试可重入锁。。。。);mutex.release();} catch (Exception e) {e.printStackTrace();}}
2.3.4 controller引用 2.4 测试验证
1.启动服务 2.启动nginx 3.启动jemter 4.查看结果
1.初始化 2.并发访问后 3.查看服务日志