本篇博客介绍客户端,客户端是开发人员使用Zookeeper最主要的途径,包括Zookeeper的客户端和第三方提供的客户端。
Zookeeper的客户端
对Zookeeper的客户端只做简单的介绍,主要是在linux系统上如何通过客户端的命令查看服务器上的节点结构及节点中的数据。在Zookeeper的安装的bin目录下可以看做有一个zkCli.sh,这就是在linux上Zookeeper客户端的启动命令。
首先需要连接,进入到bin目录,连接的格式如下:./zkCli.sh –timeout –r –server ip:port
-timeout:表示当前会话的超时时间,zookeper依靠与客户端的心跳来判断会话是否有效,单位是毫秒
-r:代表只读模式,zookeeper的只读模式指一个服务器与集群中过半机器失去连接以后,这个服务器就不在处理客户端的请求,但我们仍然希望该服务器可以提供读服务。
-server:指定服务器ip地址和端口号
使用时最简单的只需要输入ip和port,如下:
连接成功后输入h,可查看可用命令列表:
这些命令的使用可自己查询,资料很多。以上是在linux中直接通过命令操作客户端。Zookeeper本身还提供了Java的API来操作Zookeeper,这是在编程中使用的。
开源的第三方Zookeeper客户端
开发中对Zookeeper的使用主要还是在代码中进行操作,比较常用的是zkClient和Curator,做测试时使用的是zkClient。zkClient是在Zookeeper原生的API接口上进行了包装,是一个更加容易使用的Zookeeper客户端。
首先说明一下,在使用zkClient进行创建节点的测试时出现的乱码的情况,而且节点中的数据并不是中文,即使是英文字母也会出现乱码,原因是这样的windows系统默认编码格式为GBK,linux默认为UTF-8,Zookeeper是安装在linux系统上的,所以会出现乱码,解决方法如下:
首先看一下通过zkClient创建节点的测试代码
public class CreateNode {
public static void main(String[] args) {
ZkClientzc = new ZkClient("192.168.169.30:2181",10000,10000,newSerializableSerializer());
System.out.println("conneted ok!");
//创建节点test,内容为test
String path = zc.create("/test","test", CreateMode.PERSISTENT);
System.out.println("created path:"+path);
}
}
上面代码中创建了节点test,其中的数据值为test,在Zookeeper的服务器上查看会出现乱码。
原因:创建zkClient时,第三个参数new SerializableSerializer(),没有解决编码问题
解决方法:
1、自己定义序列化类,使用UTF-8编码,需要实现ZkSerializer接口,代码如下
public class MyZkSerializer implementsZkSerializer
{
public Object deserialize(byte[] bytes) throws ZkMarshallingError
{
return new String(bytes, Charsets.UTF_8);
}
public byte[] serialize(Object obj) throws ZkMarshallingError
{
return String.valueOf(obj).getBytes(Charsets.UTF_8);
}
}
2、创建zkClient时第三个参数使用自己定义的序列化类即可。
其他的zkClient的增删改查节点及节点内数据的方法可以参考zkClient的API即可。
Zookeeper查看节点除了可以使用自身的提供的命令,还有很多第三方的可视化工具,自己在git上找到了一个,地址是:https://github.com/DeemOpen/zkui,有详细的项目启动说明。