美文网首页
SpringBoot整合zookeeper、curator,实现

SpringBoot整合zookeeper、curator,实现

作者: singleZhang2010 | 来源:发表于2020-12-09 10:12 被阅读0次

概述

在电商等高并发系统中,我们经常遇到在短时间内产生大量数据,比如抢购时,短时间下单数据激增;直播场景中,短时间产生大量聊天数据;以及伴随着这些请求的日志数据、操作的日志数据都是非常大...
在单体服务环境下,可以利用数据库的主键自增功能可以为数据提供唯一标识ID,但在分布式或者微服务环境下,在短时间内多个节点如何为数据生成唯一的ID?就需要分布式的ID生成系统。

分布式ID生成系统的特征

  • 全局唯一:不能出现重复ID
  • 高可用:ID生成系统是基础系统,被许多关键系统调用,一旦宕机,就会造成严重影响

所以要满足以上的特征,需要对分布式ID生成的机制有所要求

  • 实现机制的可靠性
  • 实现复杂度
    有些算法可以实现ID的唯一性和可读性,但是实现起来十分复杂,后续也难以改造
  • 可扩展性
  • ID的可读性
    有些ID只是为了唯一性,如UUID机制,它是不可读的,没有业务含义。不过,生成一个可读的带有业务含义的ID,将有助于业务人员和开发人员定位业务和问题所在
  • 性能
    分布式系统往往也需要面对高并发的情况,所以对实现的算法性能要求高

常见的分布式ID生成方案

  • Java的UUID
    这种方式比较简单,本地生成速度快,代码如下
String id = UUID.randomUUID().toString();

但是,使用UUID作为主键,存储会占据较大的空间,网络传输内容也多,不利于优化;存入数据库后,这么长的字符串作为主键,影响查询性能。

  • 独立的数据库,通过数据库自增长专门来生成ID
  • 数据库集群,设定好步长来生成ID
  • Redis生成ID
  • Twitter的SnowFlake算法
  • 美团 Leaf
  • 滴滴 Tinyid
  • MongoDb的ObjectId
  • ZooKeeper生成ID

本文介绍的是ZooKeeper生成ID,以上的其他方式可以另开一篇详细介绍。
ZooKeeper分布式ID生成,原理是利用ZooKeeper的顺序节点,生成全局唯一的ID

ZooKeeper分布式ID生成实现

接上一篇SpringBoot整合zookeeper、curator,实现分布式锁功能,把项目源码进行扩展

  1. ZookeeperClient类中增加makeId方法,用来生成ID
/**
     * 分布式ID生成
     * */
    public String makeId(String nodeName) {
        String str = createSeqNode(nodeName);
        if (null == str) {
            return null;
        }
        int index = str.lastIndexOf(nodeName);
        if (index >= 0) {
            index += nodeName.length();
            return index <= str.length() ? str.substring(index) : "";
        }
        return str;
    }

    /**
     * 创建顺序节点
     * */
    private String createSeqNode(String pathPrefix) {
        try {
            // 创建一个 ZNode 顺序节点
            String s = client.create()
                    .creatingParentsIfNeeded()
                    .withMode(CreateMode.EPHEMERAL_SEQUENTIAL)
                    //避免zookeeper的顺序节点暴增,需要删除创建的持久化顺序节点
                    // .withMode(CreateMode.EPHEMERAL_SEQUENTIAL)
                    .forPath(pathPrefix);
            return s;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }
  1. 在测试目录org.zhangsan.zookeeper包中,创建ZkIdMakerTest.java
package org.zhangsan.zookeeper;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.zhangsan.beans.ZookeeperClient;

/**
 * @ClassName ZkIdMakerTest
 * @Description //分布式ID生成测试
 * @Author singleZhang
 * @Email 405780096@qq.com
 * @Date 2020/12/8 0008 下午 5:18
 **/
@RunWith(SpringRunner.class)
@SpringBootTest
public class ZkIdMakerTest {
    @Autowired
    private ZookeeperClient zookeeperClient;

    @Test
    public void zookeeperIdMakerTest(){
        String nodeName = "/test/zkIdMaker/ID-";
        for (int i = 0; i < 10; i++) {
            String id = zookeeperClient.makeId(nodeName);
            System.out.println("第" + i + "个创建的id为:" + id);
        }
    }
}

3.运行zookeeper服务,运行程序,测试分布式ID生成,结果如下:


分布式ID

代码地址:
https://gitee.com/kaixinshow/springboot-note

相关文章

网友评论

      本文标题:SpringBoot整合zookeeper、curator,实现

      本文链接:https://www.haomeiwen.com/subject/yjrqgktx.html