- 解决了时间回拨的问题
- 无需手动指定workId, 微服务环境自适应
- 可配置化
- 依赖引入
${uid-generator.version}说明
<dependency> <groupId>io.github.mocreates</groupId> <artifactId>uid-generator</artifactId> <version>${uid-generator.version}</version> </dependency>
- 配置序列器
Sequence@Bean public Sequence sequence() { SequenceConfig sequenceConfig = new SimpleSequenceConfig(); return new Sequence(sequenceConfig); }
- 使用序列器生成ID
@Autowired private Sequence sequence; public long generateId() { return sequence.nextId(); }
io.github.mocreates.config.DefaultSequenceConfigio.github.mocreates.config.SimpleSequenceConfig
前者需要手动指定 workerId、datacenterId,可以结合数据库来使用,后者是利用网卡信息进行自适应。 推荐使用默认配置类,网卡mac地址可人为伪造,加之虚拟化的发展,其唯一性已经无法保证,有概率重复。
| 字段名 | 释义 | 默认值 |
|---|---|---|
| twepoch | 可以被设置为最接近项目启用前的某个时间点(unix 时间戳) | 1665817757000L |
| workerIdBits | 机器位所占的bit位数 | 19L |
| datacenterIdBits | 数据标识位所占的bit位数 | 0L |
| sequenceBits | 毫秒内自增位数 | 3L |
| workerId | 机器位 | |
| datacenterId | 数据位 | 0L |
| inetAddress | 网络相关信息 |
- 依赖引入
${uid-generator.version}说明
<dependency> <groupId>io.github.mocreates</groupId> <artifactId>uid-generator</artifactId> <version>${uid-generator.version}</version> </dependency>
- 创建表
CREATE TABLE `worker_node` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `node_info` varchar(512) NOT NULL, `gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, `gmt_modify` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='DB WorkerID Assigner for UID Generator';
- 配置 (利用主键自增来分配workerId, 解决分布式环境下手动指定workerId的痛点)
@Bean public Sequence sequence(WorkerNodeMapper workerNodeMapper) throws UnknownHostException { WorkerNode workerNode = new WorkerNode(); InetAddress localHost = InetAddress.getLocalHost(); workerNode.setNodeInfo(localHost.toString()); workerNodeMapper.insertSelective(workerNode); DefaultSequenceConfig defaultSequenceConfig = new DefaultSequenceConfig(); defaultSequenceConfig.setWorkerId(workerNode.getId()); return new Sequence(defaultSequenceConfig); }
- 使用序列器生成ID
@Autowired private Sequence sequence; public long generateId() { return sequence.nextId(); }
MacBook Pro (13-inch, M1, 2020) 8C 16G
private static final DefaultSequenceConfig SEQUENCE_CONFIG = new DefaultSequenceConfig();
static {
SEQUENCE_CONFIG.setSequenceBits(22);
SEQUENCE_CONFIG.setWorkerIdBits(0);
SEQUENCE_CONFIG.setDatacenterIdBits(0);
SEQUENCE_CONFIG.setTwepoch(System.currentTimeMillis());
SEQUENCE_CONFIG.setWorkerId(0L);
SEQUENCE_CONFIG.setDatacenterId(0L);
}
private static final Sequence SEQUENCE = new Sequence(SEQUENCE_CONFIG);@BenchmarkMode(Mode.Throughput)
@Threads(10)
@Warmup(iterations = 3, time = 10, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 10, time = 10, timeUnit = TimeUnit.SECONDS)
@State(value = Scope.Benchmark)
@Fork(1)
@OutputTimeUnit(TimeUnit.SECONDS)| Benchmark | Mode | Cnt | Score | Error | Units |
|---|---|---|---|---|---|
| SingleNodeSequenceTest.nextIdTest | thrpt | 10 | 27825573.565 ± 962298.054 | ops/s |
| uid-generator.version | jdk支持 |
|---|---|
| 3.0.1-RELEASE | >=21 |
| 2.0-RELEASE | >=8 |