`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位字符串

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

相关推荐
头发还在的女程序员13 小时前
医院陪诊管理系统怎么选择?——2026 年选型避坑与架构参考
java·开发语言·陪诊系统·陪诊app·医院陪诊陪护
CodeStats14 小时前
【Spring事务】Spring事务注解 @Transactional 完整体系:从 MySQL 隔离级别到 MyBatis 原理详解
java·spring·mybatis·事务·transactional
我命由我1234514 小时前
Android 开发问题:为 PDFView 设置一个带有黑色边框的背景 drawable,但边框没有生效
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
都叫我大帅哥16 小时前
从Python到Java:为什么企业级Agent最终会选择Java?
java·ai编程
wanderist.17 小时前
Lambda表达式在算法竞赛中的应用
java·开发语言·算法
腻害兔18 小时前
【若依项目-产品经理视角】RuoYi-Vue-Pro 源码拆解:IM 即时通讯模块,一个被低估的「全功能聊天系统」
java·前端·vue.js·产品经理·ai编程
心念枕惊18 小时前
.NET CORE 授权进阶-角色、策略与动态权限实现
java·前端·.netcore
景同学20 小时前
把 AI 用到线上运维:可行、有效,前提是喂足信息——一次 Full GC 排障实录
java·人工智能·后端
C++、Java和Python的菜鸟20 小时前
第7章 后端Web实战(Tlias系统)
java
憧憬成为java架构高手的小白21 小时前
黑马八股--spring框架学习
java·学习·spring