一、引言
前兩篇寫了一些概念性的和在服務器上操作的信息,那么這一篇我們來學習如何用Spring來對Zookeeper做一個整合。首先需要先簡單介紹一些Curator這個客戶端。
Curator
Curator是Netflix公司開源的一套zookeeper客戶端框架,解決了很多Zookeeper客戶端非常底層的細節開發工作,包括基礎操作、連接與重連、反復注冊Watcher、分布式鎖等等。
二、干貨代碼搞起來~
POM
<!--引入Zookeeper依賴和curator客戶端【有夢想的肥宅】--> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-recipes</artifactId> <version>5.0.0</version> <exclusions> <exclusion> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>3.5.8</version> </dependency> <dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>5.1.0</version> </dependency>
Zookeeper客戶端工具類
我這里把初始化zk客戶端的代碼抽成了一個工具類來使用,減少重復代碼:
/** * Zookeeper客戶端工具類 * * @author zhanghao * @date 2021/8/18 */ public class ZookeeperClientUtil { /** * 獲取Curator客戶端 【有夢想的肥宅】 */ public static CuratorFramework getCuratorFramework() { //1、配置重試策略 5000:重試間隔 5:重試次數 ExponentialBackoffRetry policy = new ExponentialBackoffRetry(5 * 1000, 5); //2、構造Curator客戶端 CuratorFramework client = CuratorFrameworkFactory.builder().connectString("這里填寫自己zk的ip地址:2181") .connectionTimeoutMs(60 * 1000) .sessionTimeoutMs(60 * 1000) .retryPolicy(policy).build(); //3、啟動客戶端 client.start(); //4、輸出信息 System.out.println("zookeeper啟動成功,獲取到客戶端鏈接"); return client; } }
基礎操作測試類
當前類用於測試一些基礎的zk操作,都是自己手打測試過的,直接拿走~
/** * 基礎操作測試類 * * @author 有夢想的肥宅 * @date 2021/8/18 */ @RunWith(SpringJUnit4ClassRunner.class) @SpringBootTest(classes = CuratorBaseControlDemo.class) public class CuratorBaseControlDemo { //創建節點【有夢想的肥宅】 @Test public void testCreate() throws Exception { CuratorFramework curatorFramework = ZookeeperClientUtil.getCuratorFramework(); curatorFramework.create().withMode(CreateMode.PERSISTENT).forPath("/nodeForJava", "this is value!".getBytes()); System.out.println("=========【有夢想的肥宅】節點創建成功========"); } //獲取節點值【有夢想的肥宅】 @Test public void testGetData() throws Exception { CuratorFramework curatorFramework = ZookeeperClientUtil.getCuratorFramework(); byte[] bytes = curatorFramework.getData().forPath("/nodeForJava"); System.out.println("=========【有夢想的肥宅】獲取到的節點值:" + new String(bytes) + "========"); } //更新節點值【有夢想的肥宅】 @Test public void testSetData() throws Exception { CuratorFramework curatorFramework = ZookeeperClientUtil.getCuratorFramework(); curatorFramework.setData().forPath("/nodeForJava", "changed!".getBytes()); byte[] bytes = curatorFramework.getData().forPath("/nodeForJava"); System.out.println("=========【有夢想的肥宅】更新后節點的值:" + new String(bytes) + "========"); } //刪除節點【有夢想的肥宅】 //PS:guaranteed() 強制刪除 //PS:deletingChildrenIfNeeded() 刪除一個節點,並且遞歸刪除其所有的子節點 @Test public void testDelete() throws Exception { CuratorFramework curatorFramework = ZookeeperClientUtil.getCuratorFramework(); String pathWithParent = "/nodeForJava"; curatorFramework.delete().guaranteed().deletingChildrenIfNeeded().forPath(pathWithParent); System.out.println("=========【有夢想的肥宅】已成功刪除節點:" + pathWithParent + "========"); } }