基于zookeeper集群下的命名服务
转载请说明出处:https://blog.****.net/LiaoHongHB/article/details/84983973
zookeeper的命名服务有两个应用方向,一个是提供类似JNDI的功能,利用zookeepeer的树型分层结构,可以把系统中各种服务的名称、地址以及目录信息存放在zookeeper,需要的时候去zookeeper中读取。
另一个,是利用zookeeper顺序节点的特性,制作分布式的ID生成器,写过数据库应用的朋友都知道,我们在往数据库表中插入记录时,通常需要为该记录创建唯一的ID,在单机环境中我们可以利用数据库的主键自增功能。但在分布式环境则无法使用,有一种方式可以使用UUID,但是它的缺陷是没有规律,很难理解。利用zookeeper顺序节点的特性,我们可以生成有顺序的,容易理解的,同时支持分布式环境的***。
1、新建zookeeper-nameservice
ZookeeperNameService.class:
public class ZookeeperNameService {
private Logger logger = LoggerFactory.getLogger(getClass());
private ZkClient zkClient = null;
private int SESSIONTIMEOUT = 25000;
private int CONNECTIONTIMEOUT = 25000;
public ZookeeperNameService() {
}
public ZookeeperNameService(String ipAddress) {
this.zkClient = new ZkClient(ipAddress, SESSIONTIMEOUT, CONNECTIONTIMEOUT, new SerializableSerializer());
}
public void start() {
logger.info("ZookeeperNameService 服务启动,准备初始化...");
init();
}
public void init() {
logger.info("ZookeeperNameService 开始初始化...");
}
/**
* 节点命名服务
*/
public void nameService() {
boolean exists = zkClient.exists("/nameService");
if (!exists) {
zkClient.createPersistent("/nameService");
}
String path = "/nameService/" + "name-";
for (int i = 0; i < 5; i++) {
String ephemeralSequential = zkClient.createEphemeralSequential(path, null);
logger.info("创建{}节点", ephemeralSequential);
}
}
public static void main(String[] args) {
ZookeeperNameService nameService = new ZookeeperNameService("192.168.202.128:2181");
nameService.start();
nameService.nameService();
}
}
2、运行及运行结果: