如何创建一个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示例,之间使用逗号分隔.比如

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官网中,有这样一句话:

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

这句话告诉我们在一个应用中,只需要一个ZK实例就足够了.CuratorFramework实例都是线程安全的,你应该在你的应用中共享同一个CuratorFramework实例.根据ZooKeeper的这个特点,可以选择使用单例模式创建一个ZK连接:

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();
    }
}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐