最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Zookeeper?Curator使用介紹

 更新時間:2022年09月02日 15:47:14   作者:悠然予夏  
curator是Net?ix公司開源的?套Zookeeper客戶端框架,和ZKClient?樣,Curator解決了很多Zookeeper客戶端非常底層的細節(jié)開發(fā)?作,包括連接重連,反復(fù)注冊Watcher和NodeExistsException異常等,是最流行的Zookeeper客戶端之?

從編碼風格上來講,curator提供了基于Fluent的編程風格支持

1、添加依賴

在pom.xml文件中添加如下內(nèi)容:

<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>2.12.0</version>
</dependency>

2、創(chuàng)建會話

Curator的創(chuàng)建會話方式與原生的API和ZkClient的創(chuàng)建方式區(qū)別很?。Curator創(chuàng)建客戶端是通過CuratorFrameworkFactory工廠類來實現(xiàn)的。具體如下:

1. 使用CuratorFramework這個工廠類的兩個靜態(tài)方法來創(chuàng)建?個客戶端

public static CuratorFramework newClient(String connectString, RetryPolicy retryPolicy)
public static CuratorFramework newClient(String connectString, int sessionTimeoutMs, int connectionTimeoutMs, RetryPolicy retryPolicy)

其中參數(shù)RetryPolicy提供重試策略的接口,可以讓?戶實現(xiàn)?定義的重試策略,默認提供了以下實現(xiàn), 分別為ExponentialBacko?Retry(基于backo?的重連策略)、RetryNTimes(重連N次策略)、RetryForever(永遠重試策略)

2. 通過調(diào)用CuratorFramework中的start()方法來啟動會話

RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3); 
CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181",retryPolicy); client.start();
RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3); 
CuratorFramework client = CuratorFrameworkFactory.newClient("127.0.0.1:2181", 5000,1000,retryPolicy);
client.start();

其實進?步查看源代碼可以得知,其實這兩種方法內(nèi)部實現(xiàn)?樣,只是對外包裝成不同的方法。它們的底層都是通過第三個?法builder來實現(xiàn)的。

RetryPolicy retryPolicy	= new ExponentialBackoffRetry(1000,3);
private static CuratorFramework Client = CuratorFrameworkFactory.builder()
            .connectString("server1:2181,server2:2181,server3:2181")
            .sessionTimeoutMs(50000)
            .connectionTimeoutMs(30000)
            .retryPolicy(retryPolicy)
            .build();
client.start();

參數(shù):

connectString:zk的server地址,多個server之間使?英?逗號分隔開

connectionTimeoutMs: 連 接 超 時 時 間 , 如 上 是 30s, 默 認 是 15

ssessionTimeoutMs: 會 話 超 時 時 間 , 如 上 是 50s, 默 認 是 60s

retryPolicy:失敗重試策略

ExponentialBacko?Retry:構(gòu)造器含有三個參數(shù) ExponentialBacko?Retry(int baseSleepTimeMs, int maxRetries, int maxSleepMs)

baseSleepTimeMs:初始的sleep時間,用于計算之后的每次重試的sleep時間

計 算 公 式 : 當 前 sleep 時 間 =baseSleepTimeMs*Math.max(1, random.nextInt(1<<(retryCount+1)))

maxRetries:最大重試次數(shù)

maxSleepMs:最大sleep時間,如果上述的當前sleep計算出來比這個大,那么sleep用這個時間,默認的最大時間是Integer.MAX_VALUE毫秒。

其他,查看org.apache.curator.RetryPolicy接?的實現(xiàn)類

start():完成會話的創(chuàng)建

package com.lagou.curator;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
public class CreateSession {
    // 創(chuàng)建會話
    public static void main(String[] args) {
        // 不使用fluent編程風格
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
        CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient("8.142.8.105:2181", retryPolicy);
        curatorFramework.start();
        System.out.println("會話被建立了");
        // 使用fluent編程風格
        CuratorFramework client = CuratorFrameworkFactory.builder()
                .connectString("8.142.8.105:2181")
                .sessionTimeoutMs(50000)
                .connectionTimeoutMs(30000)
                .retryPolicy(retryPolicy)
                .namespace("base")  // 獨立的命名空間 /base
                .build();
        client.start();
        System.out.println("會話2被創(chuàng)建了");
    }
}

需要注意的是session2會話含有隔離命名空間,即客戶端對Zookeeper上數(shù)據(jù)節(jié)點的任何操作都是相對/base目錄進行的,這有利于實現(xiàn)不同的Zookeeper的業(yè)務(wù)之間的隔離

3、創(chuàng)建節(jié)點

curator提供了?系列Fluent風格的接口,通過使用Fluent編程風格的接口,開發(fā)人員可以進行自由組合來完成各種類型節(jié)點的創(chuàng)建。

下面簡單介紹?下常用的幾個節(jié)點創(chuàng)建場景。

(1)創(chuàng)建?個初始內(nèi)容為空的節(jié)點

client.create().forPath(path);

Curator默認創(chuàng)建的是持久節(jié)點,內(nèi)容為空。

(2)創(chuàng)建?個包含內(nèi)容的節(jié)點

client.create().forPath(path,"我是內(nèi)容".getBytes());

Curator和ZkClient不同的是依舊采用Zookeeper原生API的?格,內(nèi)容使用byte[]作為方法參數(shù)。

(3)遞歸創(chuàng)建父節(jié)點,并選擇節(jié)點類型

client.create().creatingParentsIfNeeded().withMode(CreateMode.EPHEMERAL).forPath(path);

creatingParentsIfNeeded這個接口非常有用,在使用ZooKeeper 的過程中,開發(fā)人員經(jīng)常會碰到NoNodeException 異常,其中?個可能的原因就是試圖對?個不存在的父節(jié)點創(chuàng)建子節(jié)點。因此,開發(fā)人員不得不在每次創(chuàng)建節(jié)點之前,都判斷?下該父節(jié)點是否存在——這個處理通常比較麻煩。在使用Curator 之后,通過調(diào)用creatingParentsIfNeeded接口,Curator就能夠自動地遞歸創(chuàng)建所有需要的?節(jié)點。

下面通過一個實際例子來演示如何在代碼中使用這些API。

package com.lagou.curator;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
public class CreateNote_curator {
    // 創(chuàng)建會話
    public static void main(String[] args) throws Exception {
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
        // 使用fluent編程風格
        CuratorFramework client = CuratorFrameworkFactory.builder()
                .connectString("8.142.8.105:2181")
                .sessionTimeoutMs(50000)
                .connectionTimeoutMs(30000)
                .retryPolicy(retryPolicy)
                .namespace("base")  // 獨立的命名空間 /base
                .build();
        client.start();
        System.out.println("會話2被創(chuàng)建了");
        // 創(chuàng)建節(jié)點
        String path = "/lg-curator/c1";
        String s = client.create().creatingParentsIfNeeded()
                .withMode(CreateMode.PERSISTENT).forPath(path, "init".getBytes());
        System.out.println("節(jié)點遞歸創(chuàng)建成功,該節(jié)點路徑:" + s);
    }
}

4、刪除節(jié)點

刪除節(jié)點的方法也是基于Fluent方式來進行操作,不同類型的操作調(diào)用新增不同的方法調(diào)用即可。

(1)刪除一個子節(jié)點

client.delete().forPath(path);

(2)刪除節(jié)點并遞歸刪除其子節(jié)點

client.delete().deletingChildrenIfNeeded().forPath(path);

(3)指定版本進行刪除

client.delete().withVersion(1).forPath(path);

如果此版本已經(jīng)不存在,則刪除異常,異常信息如下。

org.apache.zookeeper.KeeperException$BadVersionException: KeeperErrorCode =BadVersion for

(4)強制保證刪除一個節(jié)點

client.delete().guaranteed().forPath(path);

只要客戶端會話有效,那么Curator會在后臺持續(xù)進行刪除操作,直到節(jié)點刪除成功。比如遇到?些網(wǎng)絡(luò)異常的情況,此guaranteed的強制刪除就會很有效果。

演示實例:

package com.lagou.curator;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
public class DeleteNote_curator {
    // 創(chuàng)建會話
    public static void main(String[] args) throws Exception {
        // 不使用fluent編程風格
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
        // 使用fluent編程風格
        CuratorFramework client = CuratorFrameworkFactory.builder()
                .connectString("8.142.8.105:2181")
                .sessionTimeoutMs(50000)
                .connectionTimeoutMs(30000)
                .retryPolicy(retryPolicy)
                .namespace("base")  // 獨立的命名空間 /base
                .build();
        client.start();
        System.out.println("會話2被創(chuàng)建了");
        // 刪除節(jié)點
        String path = "/lg-curator";
        client.delete().deletingChildrenIfNeeded().withVersion(-1).forPath(path);
        System.out.println("刪除成功,刪除的節(jié)點:" + path);
    }
}

5、獲取數(shù)據(jù)

獲取節(jié)點數(shù)據(jù)內(nèi)容API相當簡單,同時Curator提供了傳入一個Stat變量的方式來存儲服務(wù)器端返回的最新的節(jié)點狀態(tài)信息

// 普通查詢
client.getData().forPath(path);
// 包含狀態(tài)查詢
Stat stat = new Stat(); 
client.getData().storingStatIn(stat).forPath(path);

演示:

package com.lagou.curator;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.data.Stat;
public class GetNote_curator {
    // 創(chuàng)建會話
    public static void main(String[] args) throws Exception {
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
        // 使用fluent編程風格
        CuratorFramework client = CuratorFrameworkFactory.builder()
                .connectString("8.142.8.105:2181")
                .sessionTimeoutMs(50000)
                .connectionTimeoutMs(30000)
                .retryPolicy(retryPolicy)
                .namespace("base")  // 獨立的命名空間 /base
                .build();
        client.start();
        System.out.println("會話2被創(chuàng)建了");
        // 創(chuàng)建節(jié)點
        String path = "/lg-curator/c1";
        String s = client.create().creatingParentsIfNeeded()
                .withMode(CreateMode.PERSISTENT).forPath(path, "init".getBytes());
        System.out.println("節(jié)點遞歸創(chuàng)建成功,該節(jié)點路徑:" + s);
        // 獲取節(jié)點的數(shù)據(jù)內(nèi)容以及狀態(tài)信息
        // 數(shù)據(jù)內(nèi)容
        byte[] bytes = client.getData().forPath(path);
        System.out.println("獲取到的節(jié)點數(shù)據(jù)內(nèi)容:" + new String(bytes));
        // 狀態(tài)信息
        Stat stat = new Stat();
        client.getData().storingStatIn(stat).forPath(path);
        System.out.println("獲取節(jié)點的狀態(tài)信息:" + stat);
    }
}

6、更新數(shù)據(jù)

更新數(shù)據(jù),如果未傳入version參數(shù),那么更新當前最新版本,如果傳入version則更新指定version,如 果version已經(jīng)變更,則拋出異常。

// 普通更新
client.setData().forPath(path,"新內(nèi)容".getBytes());
// 指定版本更新
client.setData().withVersion(1).forPath(path);

版本不一致異常信息:

org.apache.zookeeper.KeeperException$BadVersionException: KeeperErrorCode = BadVersion for

案例演示:

package com.lagou.curator;
import org.apache.curator.RetryPolicy;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.data.Stat;
public class UpdateNote_curator {
    // 創(chuàng)建會話
    public static void main(String[] args) throws Exception {
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
        // 使用fluent編程風格
        CuratorFramework client = CuratorFrameworkFactory.builder()
                .connectString("8.142.8.105:2181")
                .sessionTimeoutMs(50000)
                .connectionTimeoutMs(30000)
                .retryPolicy(retryPolicy)
                .namespace("base")  // 獨立的命名空間 /base
                .build();
        client.start();
        System.out.println("會話2被創(chuàng)建了");
        String path = "/lg-curator/c1";
        // 獲取節(jié)點的數(shù)據(jù)內(nèi)容以及狀態(tài)信息
        // 數(shù)據(jù)內(nèi)容
        byte[] bytes = client.getData().forPath(path);
        System.out.println("獲取到的節(jié)點數(shù)據(jù)內(nèi)容:" + new String(bytes));
        // 狀態(tài)信息
        Stat stat = new Stat();
        client.getData().storingStatIn(stat).forPath(path);
        System.out.println("獲取節(jié)點的狀態(tài)信息:" + stat);
        // 更新節(jié)點內(nèi)容
        int version = client.setData().withVersion(stat.getVersion()).forPath(path, "修改內(nèi)容1".getBytes()).getVersion();
        System.out.println("當前的最新版本是"+version);
        byte[] byte2 = client.getData().forPath(path);
        System.out.println("修改后的節(jié)點數(shù)據(jù)內(nèi)容:" + new String(byte2));
    }
}

到此這篇關(guān)于Zookeeper Curator使用介紹的文章就介紹到這了,更多相關(guān)Zookeeper Curator內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 實體類或?qū)ο笮蛄谢瘯r,忽略為空屬性的操作

    實體類或?qū)ο笮蛄谢瘯r,忽略為空屬性的操作

    這篇文章主要介紹了實體類或?qū)ο笮蛄谢瘯r,忽略為空屬性的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • Java使用反射獲取字段屬性

    Java使用反射獲取字段屬性

    這篇文章主要為大家詳細介紹了Java如何利用反射實現(xiàn)獲取字段屬性值,文中的示例代碼講解詳細,具有很好的參考價值,希望對大家有所幫助
    2023-06-06
  • Java把多個對象的list的數(shù)據(jù)合并的方法示例

    Java把多個對象的list的數(shù)據(jù)合并的方法示例

    在Java中合并多個List可以使用遍歷、Stream API或Apache Commons Collections,通過遍歷各個List并將元素添加到新List實現(xiàn)合并,Java 8提供了Stream API,使用Stream.of()和flatMap()可以簡潔地合并List,文中給出了多種方法示例,需要的朋友可以參考下
    2024-09-09
  • java之swing表格實現(xiàn)方法

    java之swing表格實現(xiàn)方法

    這篇文章主要介紹了java之swing表格實現(xiàn)方法,以實例形式分析了swing構(gòu)建表格的方法,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-09-09
  • java?stream實現(xiàn)分組BigDecimal求和以及自定義分組求和

    java?stream實現(xiàn)分組BigDecimal求和以及自定義分組求和

    這篇文章主要給大家介紹了關(guān)于java?stream實現(xiàn)分組BigDecimal求和以及自定義分組求和的相關(guān)資料,Stream是Java8的一大亮點,是對容器對象功能的增強,它專注于對容器對象進行各種非常便利、高效的聚合操作或者大批量數(shù)據(jù)操作,需要的朋友可以參考下
    2023-12-12
  • IDEA創(chuàng)建Java?Web項目的超詳細圖文教學

    IDEA創(chuàng)建Java?Web項目的超詳細圖文教學

    IDEA是程序員們常用的java集成開發(fā)環(huán)境,也是被公認為最好用的java開發(fā)工具,下面這篇文章主要給大家介紹了關(guān)于IDEA創(chuàng)建Java?Web項目的相關(guān)資料,文中通過圖文介紹的非常詳細,需要的朋友可以參考下
    2022-12-12
  • Spring Boot + Vue 前后端分離項目如何踢掉已登錄用戶

    Spring Boot + Vue 前后端分離項目如何踢掉已登錄用戶

    這篇文章主要介紹了Spring Boot + Vue 前后端分離項目如何踢掉已登錄用戶,需要的朋友可以參考下
    2020-05-05
  • Spring Security LDAP實現(xiàn)身份驗證的項目實踐

    Spring Security LDAP實現(xiàn)身份驗證的項目實踐

    在本文中,我們涵蓋了“使用 Spring Boot 的 Spring Security LDAP 身份驗證示例”的所有理論和示例部分,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-08-08
  • 通過Java計算文件的MD5值實現(xiàn)方式

    通過Java計算文件的MD5值實現(xiàn)方式

    本文將詳細介紹如何使用Java語言來計算文件的MD5值,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-04-04
  • Java根據(jù)前端返回的字段名進行查詢數(shù)據(jù)的實現(xiàn)方法

    Java根據(jù)前端返回的字段名進行查詢數(shù)據(jù)的實現(xiàn)方法

    在Java后端開發(fā)中,我們經(jīng)常需要根據(jù)前端傳遞的參數(shù)(如字段名)來動態(tài)查詢數(shù)據(jù)庫中的數(shù)據(jù),這種需求通常出現(xiàn)在需要實現(xiàn)通用查詢功能或者復(fù)雜查詢接口的場景中,所以本文介紹了Java根據(jù)前端返回的字段名進行查詢數(shù)據(jù)的實現(xiàn)方法,需要的朋友可以參考下
    2024-12-12

最新評論

石棉县| 淮北市| 嘉峪关市| 霍城县| 错那县| 日土县| 永善县| 津市市| 公安县| 库伦旗| 航空| 丰原市| 霍城县| 达日县| 中山市| 乐山市| 武乡县| 惠东县| 武邑县| 濮阳县| 永泰县| 涞源县| 大邑县| 雅安市| 临桂县| 巴林右旗| 黔江区| 射洪县| 都昌县| 延津县| 尼勒克县| 桦南县| 伊春市| 屏山县| 太保市| 吐鲁番市| 阿鲁科尔沁旗| 寻乌县| 始兴县| 阳春市| 江西省|