ZooKeeper客戶端Curator使用一 建立鏈接

如何建立一個ZK鏈接

工廠方法newClient()

public static void main(String[] args) {
    final String connectString = "127.0.0.1:2181";
    RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
    CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, retryPolicy);
    client.start();
    System.out.println("zk operation");
    client.close();
}

首先,對於ZooKeeper的鏈接就是建立一個CuratorFramework實例的過程.通常會把CuratorFramework實例的建立交給工廠類CuratorFrameworkFactory,使用工廠方法newClient()方法實例化. 
1. connectString參數是ZooKeeper服務的地址和端口號,對於集羣狀況下的多個ZooKeeper示例,之間使用逗號分隔.好比apache

String connectString = "127.0.0.1:2181,127.0.0.2:2181,127.0.0.3:2181";
  •  
  1. retryPolicy參數是指在鏈接ZK服務過程當中從新鏈接測策略.在它的實現類ExponentialBackoffRetry(int baseSleepTimeMs, int maxRetries)中,baseSleepTimeMs參數表明兩次鏈接的等待時間,maxRetries參數表示最大的嘗試鏈接次數
  2. CuratorFramework示例建立完成,表明ZooKeeper已經鏈接成功,調用start()方法打開鏈接,在使用完畢後調用close()方法關閉鏈接
  3. newClient()方法還存在一個重載方法,上面的代碼中使用的是newClient(String connectString, RetryPolicy retryPolicy),除該方法外,它還能夠指定會話(session)的過時時間以及鏈接的超時時間.
public static void main(String[] args) {
    final String connectString = "127.0.0.1:2181";
    RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
    CuratorFramework client = CuratorFrameworkFactory.newClient(connectString, 3000, 1000, retryPolicy);
    client.start();
    System.out.println("zk operation");
    client.close();
}

Builder()方法

相比於使用newClient()方法建立鏈接外,還能夠使用builder()方法來控制更多的參數,代碼以下:安全

public static void main(String[] args) throws Exception {
    RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
    CuratorFramework client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181")
            .retryPolicy(retryPolicy).sessionTimeoutMs(1000 * 6).connectionTimeoutMs(1000 * 6).build();
    client.start();
    System.out.println("zk operation");
    client.close();
}

單例模式建立一個ZK鏈接

在ZooKeeper官網中,有這樣一句話:session

You only need one CuratorFramework object for each ZooKeeper cluster you are connectingui

這句話告訴咱們在一個應用中,只須要一個ZK實例就足夠了.CuratorFramework實例都是線程安全的,你應該在你的應用中共享同一個CuratorFramework實例.根據ZooKeeper的這個特色,能夠選擇使用單例模式建立一個ZK鏈接:spa

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 ClientSingleton {
    private static CuratorFramework client = null;

    private ClientSingleton() {
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
        client = CuratorFrameworkFactory.builder().connectString("127.0.0.1:2181").retryPolicy(retryPolicy)
                .sessionTimeoutMs(1000 * 6).connectionTimeoutMs(1000 * 6).build();
    }

    public static synchronized CuratorFramework newClient() {
        if (client == null) {
            new ClientSingleton();
        }
        return client;
    }

    public static void start() {
        client.start();
    }

    public static void close() {
        client.close();
    }
}
相關文章
相關標籤/搜索