- 解决了时间回拨的问题
- 无需手动指定workId, 微服务环境自适应
- 可配置化
- 依赖引入
<dependency>
<groupId>io.github.mocreates</groupId>
<artifactId>uid-generator</artifactId>
<version>${uid-generator.version}</version>
</dependency>
${uid-generator.version}说明
- 配置序列器
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.DefaultSequenceConfig
io.github.mocreates.config.SimpleSequenceConfig
前者需要手动指定 workerId、datacenterId,可以结合数据库来使用,后者是利用网卡信息进行自适应。
推荐使用默认配置类,网卡mac地址可人为伪造,加之虚拟化的发展,其唯一性已经无法保证,有概率重复。
| 字段名 |
释义 |
默认值 |
| twepoch |
可以被设置为最接近项目启用前的某个时间点(unix 时间戳) |
1665817757000L |
| workerIdBits |
机器位所占的bit位数 |
19L |
| datacenterIdBits |
数据标识位所占的bit位数 |
0L |
| sequenceBits |
毫秒内自增位数 |
3L |
| workerId |
机器位 |
|
| datacenterId |
数据位 |
0L |
| inetAddress |
网络相关信息 |
|
- 依赖引入
<dependency>
<groupId>io.github.mocreates</groupId>
<artifactId>uid-generator</artifactId>
<version>${uid-generator.version}</version>
</dependency>
${uid-generator.version}说明
- 创建表
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 |