`ImadcnIdentifierGenerator` 深度解析

ImadcnIdentifierGenerator 深度解析

这是一个基于Zookeeper的分布式ID生成器实现,结合了雪花算法(Snowflake)和压缩UUID生成能力。下面我将从多个维度详细分析这个实现类。

java 复制代码
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//

package com.baomidou.mybatisplus.core.incrementer;

import com.imadcn.framework.idworker.config.ApplicationConfiguration;
import com.imadcn.framework.idworker.config.ZookeeperConfiguration;
import com.imadcn.framework.idworker.generator.CompressUUIDGenerator;
import com.imadcn.framework.idworker.generator.SnowflakeGenerator;
import com.imadcn.framework.idworker.register.zookeeper.ZookeeperWorkerRegister;
import com.imadcn.framework.idworker.registry.zookeeper.ZookeeperRegistryCenter;
import java.io.Closeable;
import java.io.IOException;

public class ImadcnIdentifierGenerator implements IdentifierGenerator, Closeable {
    private final SnowflakeGenerator idGenerator;
    private final CompressUUIDGenerator uuidGenerator;

    public ImadcnIdentifierGenerator(String serverLists) {
        this(configuration(serverLists));
    }

    public ImadcnIdentifierGenerator(ZookeeperConfiguration zookeeperConfiguration) {
        this(zookeeperConfiguration, new ApplicationConfiguration());
    }

    public ImadcnIdentifierGenerator(ZookeeperConfiguration zookeeperConfiguration, ApplicationConfiguration applicationConfiguration) {
        this.uuidGenerator = new CompressUUIDGenerator();
        ZookeeperRegistryCenter center = new ZookeeperRegistryCenter(zookeeperConfiguration);
        ZookeeperWorkerRegister register = new ZookeeperWorkerRegister(center, applicationConfiguration);
        this.idGenerator = new SnowflakeGenerator(register);
        this.idGenerator.init();
    }

    private static ZookeeperConfiguration configuration(String serverLists) {
        ZookeeperConfiguration zookeeperConfiguration = new ZookeeperConfiguration();
        zookeeperConfiguration.setServerLists(serverLists);
        return zookeeperConfiguration;
    }

    public Number nextId(Object entity) {
        return this.idGenerator.nextId();
    }

    public String nextUUID(Object entity) {
        return this.uuidGenerator.nextStringId();
    }

    public void close() throws IOException {
        this.idGenerator.close();
    }
}

类继承与实现关系

复制代码
ImadcnIdentifierGenerator
├─ implements IdentifierGenerator (MyBatis-Plus接口)
├─ implements Closeable (资源关闭接口)

核心组件

1. ID生成器成员

java 复制代码
private final SnowflakeGenerator idGenerator;  // 雪花算法ID生成器
private final CompressUUIDGenerator uuidGenerator;  // 压缩UUID生成器

2. 构造方法链

提供了三种构造方式:

java 复制代码
// 1. 最简单构造(仅需Zookeeper服务器地址)
public ImadcnIdentifierGenerator(String serverLists)

// 2. 使用Zookeeper配置
public ImadcnIdentifierGenerator(ZookeeperConfiguration zookeeperConfiguration)

// 3. 完整配置(Zookeeper+应用配置)
public ImadcnIdentifierGenerator(ZookeeperConfiguration zookeeperConfiguration, 
                               ApplicationConfiguration applicationConfiguration)

核心方法实现

1. ID生成方法

java 复制代码
@Override
public Number nextId(Object entity) {
    return this.idGenerator.nextId(); // 使用雪花算法生成数字ID
}

@Override
public String nextUUID(Object entity) {
    return this.uuidGenerator.nextStringId(); // 生成压缩格式UUID
}

2. 资源清理

java 复制代码
@Override
public void close() throws IOException {
    this.idGenerator.close(); // 关闭雪花算法生成器
}

技术实现细节

雪花算法初始化流程

  1. 创建Zookeeper注册中心

  2. 创建Worker注册器

  3. 初始化雪花ID生成器

    java 复制代码
    ZookeeperRegistryCenter center = new ZookeeperRegistryCenter(zookeeperConfiguration);
    ZookeeperWorkerRegister register = new ZookeeperWorkerRegister(center, applicationConfiguration);
    this.idGenerator = new SnowflakeGenerator(register);
    this.idGenerator.init();

配置处理

java 复制代码
private static ZookeeperConfiguration configuration(String serverLists) {
    ZookeeperConfiguration config = new ZookeeperConfiguration();
    config.setServerLists(serverLists); // 设置Zookeeper集群地址
    return config;
}

设计亮点

  1. 分布式支持:通过Zookeeper协调Worker ID分配,避免集群环境下ID冲突
  2. 双ID策略:同时提供有序数字ID和高性能UUID生成能力
  3. 资源管理:实现Closeable接口确保正确释放Zookeeper连接
  4. 配置灵活:提供多种构造方法适应不同使用场景

典型使用场景

1. MyBatis-Plus集成

java 复制代码
@Bean
public IdentifierGenerator idGenerator() {
    return new ImadcnIdentifierGenerator("zk1:2181,zk2:2181");
}

2. 直接调用生成ID

java 复制代码
ImadcnIdentifierGenerator generator = new ImadcnIdentifierGenerator(config);

// 生成订单ID
Long orderId = generator.nextId(orderEntity).longValue();

// 生成业务流水号
String traceId = generator.nextUUID(null);

性能考量

  1. 雪花算法优势

    • 64位ID结构(时间戳+WorkerID+序列号)
    • 单机每秒可生成400万+ ID
    • 趋势递增,适合数据库索引
  2. 压缩UUID优化

    • 相比标准UUID更节省存储空间
    • 仍保持全局唯一性

扩展建议

  1. 故障转移:增加Zookeeper连接失败的备用方案
  2. 监控集成:添加ID生成速率等监控指标
  3. 自定义配置:支持更多雪花算法参数调整
  4. ID解析:添加从ID反解生成时间、WorkerID等信息的方法

与其他组件的对比

特性 ImadcnIdentifierGenerator 数据库序列 Redis自增 UUID
分布式支持
有序性
性能 极高 中等
依赖外部服务 Zookeeper 数据库 Redis
ID长度 64位数字 数字 数字 32位字符串

这个实现非常适合需要高吞吐量、分布式部署的场景,特别是在微服务架构中为各类业务实体生成唯一标识符。

相关推荐
与遨游于天地9 分钟前
NIO的三个组件解决三个问题
java·后端·nio
czlczl2002092535 分钟前
Guava Cache 原理与实战
java·后端·spring
yangminlei37 分钟前
Spring 事务探秘:核心机制与应用场景解析
java·spring boot
记得开心一点嘛2 小时前
Redis封装类
java·redis
lkbhua莱克瓦242 小时前
进阶-存储过程3-存储函数
java·数据库·sql·mysql·数据库优化·视图
计算机程序设计小李同学2 小时前
基于SSM框架的动画制作及分享网站设计
java·前端·后端·学习·ssm
鱼跃鹰飞2 小时前
JMM 三大特性(原子性 / 可见性 / 有序性)面试精简版
java·jvm·面试
该怎么办呢3 小时前
基于cesium的三维不动产登记系统的设计与实现(毕业设计)
java·毕业设计
J不A秃V头A3 小时前
多任务执行时,共享请求对象被并发修改
java
heartbeat..3 小时前
零基础学 SQL:DQL/DML/DDL/DCL 核心知识点汇总(附带连接云服务器数据库教程)
java·服务器·数据库·sql