Zookeeper简介
ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
Zookeeper安装及简单使用请参考博文:https://blog.csdn.net/angellee1988/article/details/100180800
Curator简介
Curator是Netflix公司开源的一套zookeeper客户端框架,解决了很多Zookeeper客户端非常底层的细节开发工作,包括连接重连、反复注册Watcher和NodeExistsException异常等等。Patrixck Hunt(Zookeeper)以一句“Guava is to Java that Curator to Zookeeper”给Curator予高度评价。
使用Curator框架实现分布式锁
Curator maven坐标:
<!-- 封装了一些高级特性,如:Cache事件监听、选举、分布式锁、分布式Barrier -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.0.0</version>
</dependency>
我们使用Springboot项目来实现。
maven依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath />
</parent>
<dependencies>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.0.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
新建CuratorConfig 配置类:
@Configuration
public class CuratorConfig {
@Value("${zookeeper.connectstr}")
private String connectStr;
@Bean
public CuratorFramework curatorFramework() {
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
CuratorFramework client = CuratorFrameworkFactory.newClient(connectStr, retryPolicy);
client.start();
return client;
}
}
新建配置文件application.properties:
server.port=8181
zookeeper.connectstr=127.0.0.1:2181
新建web测试接口:
@RestController
public class ProductController {
private Integer stock = 5;
@Autowired
private CuratorFramework client;
@PostMapping("deduct/stock/{productId}")
public Integer deductStock(@PathVariable("productId") String productId) throws Exception {
// zk分布式锁
InterProcessMutex lock = new InterProcessMutex(client, "/lock/"+productId);
if (lock.acquire(5, TimeUnit.SECONDS)) {
try {
System.out.println("减库存");
if (stock <= 0) {
throw new Exception("扣减失败");
}
stock--;
} finally {
lock.release();
}
}
return stock;
}
}
创建启动类:
@SpringBootApplication
public class DistributelockApplication {
public static void main(String[] args) {
SpringApplication.run(DistributelockApplication.class, args);
}
}
启动DistributelockApplication ,使用jmeter开启多线程访问 http://127.0.0.1:8181/deduct/stock/10000。 大家可自行去尝试!
总结
实现分布式锁使用Redis也可以实现。
zookeeper在分布式的系统中的使用场景还是蛮多的,如分布式配置中心(https://blog.csdn.net/angellee1988/article/details/102712246),有兴趣的可以继续去研究。
Curator框架还有其他现成的功能,有兴趣的可以去官网看看:http://curator.apache.org/index.html