Zookeeperクライアント(4)-キュレーター

以前にZookeeperおよびZkClinetのネイティブクライアントを紹介しました。ここでは、ネイティブAPIに基づいてカプセル化された、Zookeeper client-Curatorも紹介します。これは、オープンソースのzkクライアントでもあります。キュレーターを使用する前に、依存関係を導入する必要があります

<!--对zookeeper的底层api的一些封装-->
<dependency>
	<groupId>org.apache.curator</groupId>
	<artifactId>curator-framework</artifactId>
	<version>4.3.0</version>
</dependency>
<!--封装了一些高级特性,如:Cache事件监听、选举、分布式锁、分布式Barrier-->
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>4.3.0</version>
</dependency>


キュレータークライアントを使用してZookeeperに接続する場合、2つの接続方法があります。まず、キュレーターがパラメーターを渡す方法を見てみましょう。new ExponentialBackoffRetry(1000, 3)つまり、最初の接続は1秒であり、失敗後に3回再試行されます。接続を再試行する時間は毎回重ねられます

public class CuratorTest {
    public static final String CONNENT_ADDR = "192.168.80.130:2181";

    public static void main(String[] args) {
        CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient(CONNENT_ADDR, 
                5000, 5000, new ExponentialBackoffRetry(1000, 3));
        curatorFramework.start();
    }
}

キュレーターの接続方法は流暢なスタイルで、チェーンプログラミングのスタイルに属するjdk8のラムダ式と同じです。次のコードが、エンティティークラスを構築するために以前導入ビルダーパターンに非常に似ているかどうかを確認してください

public class CuratorTest {
    public static final String CONNENT_ADDR = "192.168.80.130:2181";

    public static void main(String[] args) {
        CuratorFramework curatorFramework = CuratorFrameworkFactory.builder()
                .connectString(CONNENT_ADDR)
                .connectionTimeoutMs(5000)  //连接超时时间
                .sessionTimeoutMs(5000)     //会话超时时间
                .retryPolicy(new ExponentialBackoffRetry(1000, 3))
                .build();

        curatorFramework.start();
    }
}



ノードを作成

以下に接続したら、ノードの作成を開始します。Curatorクライアントも、再帰的に作成する必要がある親ノードをサポートするZkClinetと同じです。追加する必要があるのは、.creatingParentsIfNeeded()
ここに画像の説明を挿入
ここに画像の説明を挿入




ノードを削除する

親ノードの再帰的な作成をサポートしているため、親ノードの再帰的な削除もサポートしてい.deletingChildrenIfNeeded()ます。追加するだけです。さらに、.guarantedd()削除する場合、次のように、削除の保証を追加してバージョン管理を使用できます。
ここに画像の説明を挿入




データノードの読み取り

次に、ノード内のデータ情報を読み取る方法を見てみましょう。これは、次のように実際には非常に簡単です。

Stat stat = new Stat();
byte[] bytes = curatorFramework.getData().storingStatIn(stat).forPath("/node1");
System.out.println(new String(bytes));
System.out.println(stat);

ここに画像の説明を挿入




データノードの変更

ここに画像の説明を挿入


ノードが存在するかどうかを確認し、子ノードを取得する

ここに画像の説明を挿入




非同期操作

さらに、キュレータークライアントは非同期操作もサポートしています。たとえば、ノードを非同期で作成できます。これを使用しinBackgroudてバックグラウンドプロセスを作成し、ノードを非同期で作成できます。

ExecutorService executorService = Executors.newFixedThreadPool(1);
CountDownLatch countDownLatch = new CountDownLatch(1);

    curatorFramework.create()
            .creatingParentsIfNeeded()
            .withMode(CreateMode.PERSISTENT)
            .inBackground(new BackgroundCallback() {
                @Override
                public void processResult(CuratorFramework curatorFramework, CuratorEvent curatorEvent) throws Exception {
                    System.out.println("resultCode:" + curatorEvent.getResultCode() + ", eventType:" + curatorEvent.getType());
                    countDownLatch.countDown();
                }
            }, executorService)
            .forPath("/node1");

countDownLatch.await();
executorService.shutdown();

ここでは、固定スレッド1のスレッドプールを使用して実行します。さらに、CountDownLatchを使用して、ノードが正常に作成され、プロジェクトで一般的に必要とされない情報を出力するようにします。これにより、テストプログラムが途中で終了するのを防ぎます。


または、上記は匿名の内部クラスに使用されます。ここでは、キュレーターの流暢なスタイルに近いラムダ式に変更することもできます。ラムダ式は実際には非常にシンプルであることがわかりました。匿名の内部クラスのメソッドパラメーターを>以前は、メソッドの処理内容を後置することができます->ここでは、外部変数との重複を避けるために、パラメーター名の後に番号2を追加して区別しています
ここに画像の説明を挿入




トランザクション操作

最後に、次のように、トランザクション操作もサポートしているため、キュレーターの方が強力であることにも言及する必要があります。

public class CuratorTest {
    public static final String CONNENT_ADDR = "192.168.80.130:2181";

    public static void main(String[] args) throws Exception {
        CuratorFramework curatorFramework = CuratorFrameworkFactory.newClient(CONNENT_ADDR, 5000,
                5000, new ExponentialBackoffRetry(1000, 3));
        curatorFramework.start();

        Collection<CuratorTransactionResult> curatorTransactionResults = curatorFramework.inTransaction()
                .create().forPath("/node1", "value1".getBytes()).and()
                .create().forPath("/node2", "value2".getBytes()).and()
                .setData().forPath("/node3", "value3".getBytes()).and().commit();

        //遍历输出结果
        for(CuratorTransactionResult result : curatorTransactionResults) {
            System.out.println("执行结果是:" + result.getForPath() + "->" + result.getType());
        }
    }
}

ここに画像の説明を挿入


私たちが使用しているバージョンがより高い場合、それは.inTransaction()もはや推奨されない可能性があり、それから使用することを選択することもできます.transaction()

ここに画像の説明を挿入

286の元の記事が公開されました Liked12 訪問者10,000以上

おすすめ

転載: blog.csdn.net/newbie0107/article/details/104913379