基于zookeeper集群下的命名服务

转载请说明出处:https://blog.****.net/LiaoHongHB/article/details/84983973

zookeeper的命名服务有两个应用方向,一个是提供类似JNDI的功能,利用zookeepeer的树型分层结构,可以把系统中各种服务的名称、地址以及目录信息存放在zookeeper,需要的时候去zookeeper中读取。

另一个,是利用zookeeper顺序节点的特性,制作分布式的ID生成器,写过数据库应用的朋友都知道,我们在往数据库表中插入记录时,通常需要为该记录创建唯一的ID,在单机环境中我们可以利用数据库的主键自增功能。但在分布式环境则无法使用,有一种方式可以使用UUID,但是它的缺陷是没有规律,很难理解。利用zookeeper顺序节点的特性,我们可以生成有顺序的,容易理解的,同时支持分布式环境的***。

1、新建zookeeper-nameservice

基于zookeeper集群下的命名服务

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、运行及运行结果:

基于zookeeper集群下的命名服务