1、简介
1.1、开源项目
- kylin-id:麒麟分布式id生成器,支持号段模式、雪花算法
- 并未发布jar到中央仓库,需要自己本地构建
1.2、介绍
- 参考滴滴【tinyid】
- 整合百度【UID】
- 麒麟发号器支持号段模式、百度uid
- uid的workerId生成方式:
a. 支持根据bizType生成,每次重启服务自增
b. 支持使用百度提供的方式生成workerId
2、使用说明
2.1、引入依赖
<dependency>
<groupId>com.wjk.kylin</groupId>
<artifactId>kylin-id-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
2.2、application.yml
kylin:
id:
server: localhost:9988
read-timeout: 60
write-timeout: 60
connect-timeout: 60
kid:
enable: true
token: 110
load-id-threshold: 0.7
uid:
enable: true
biz-type: kylin_id_example
epoch-str: 2022-09-10
time-bits: 31
worker-bits: 22
seq-bits: 10
cached-uid-generator:
boost-power: 3
padding-factor: 50
2.3、表结构
2.3.1、号段模式表结构
CREATE TABLE `kylin_id_info` (
`id` bigint(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`biz_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '业务类型,唯一',
`max_id` bigint(0) UNSIGNED NOT NULL DEFAULT 0 COMMENT '当前最大id',
`step` int(0) UNSIGNED NOT NULL DEFAULT 0 COMMENT '步长,值越大,服务端缓存就会越多',
`delta` int(0) UNSIGNED NOT NULL DEFAULT 1 COMMENT '每次id增量,增长量',
`version` bigint(0) UNSIGNED NOT NULL DEFAULT 1 COMMENT '版本号',
`create_time` datetime(0) NOT NULL DEFAULT '2022-01-01 00:00:00' COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uniq_biz_type`(`biz_type`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'id信息表' ROW_FORMAT = Dynamic;
CREATE TABLE `kylin_id_token` (
`id` bigint(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增id',
`token` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT 'token,用于安全校验用,建议用不同的token来验证区分',
`biz_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '此token可访问的业务类型标识',
`remark` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '备注',
`create_time` datetime(0) NOT NULL DEFAULT '2022-01-01 00:00:00' COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uniq_token_biz_type`(`token`, `biz_type`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'token信息表' ROW_FORMAT = Dynamic;
2.3.2、uid表结构
uid表结构根据选择模式创建表就可以
CREATE TABLE `worker_node` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT 'auto increment id',
`host_name` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'host name',
`port` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL COMMENT 'port',
`type` int NOT NULL COMMENT 'node type: ACTUAL or CONTAINER',
`launch_date` date NOT NULL COMMENT 'launch date',
`modified` datetime NOT NULL COMMENT 'modified time',
`created` datetime NOT NULL COMMENT 'created time',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='DB WorkerID Assigner for UID Generator';
CREATE TABLE `kylin_uid_info` (
`id` bigint(0) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '自增主键',
`biz_type` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '业务类型,唯一',
`worker_id` bigint(0) UNSIGNED NOT NULL DEFAULT 0 COMMENT '工作id',
`version` bigint(0) UNSIGNED NOT NULL DEFAULT 1 COMMENT '版本号',
`create_time` datetime(0) NOT NULL DEFAULT '2022-01-01 00:00:00' COMMENT '创建时间',
PRIMARY KEY (`id`) USING BTREE,
UNIQUE INDEX `uniq_biz_type`(`biz_type`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci COMMENT = 'id信息表' ROW_FORMAT = Dynamic;
2.4、使用
2.4.1、启动kylin-id-server
2.4.2、号段模式
@GetMapping("/nextId")
public Long getId(@RequestParam("bizType") String bizType) {
return IdUtil.nextId(bizType);
}
@GetMapping("/nextIdBatchSize")
public Long getIdBatchSize(@RequestParam("bizType") String bizType, @RequestParam("batchSize") Integer batchSize) {
List<Long> idList = IdUtil.nextId(bizType, batchSize);
for (Long id : idList) {
log.info("{}", id);
}
return 0L;
}
2.4.3、UID模式
@Autowired
@Qualifier("cachedUidGenerator")
private UidGenerator uidGenerator;
@GetMapping("/uid")
public Long getUId(@RequestParam("batchSize") Integer batchSize) {
for (int i = 0; i < batchSize; i++) {
log.info("{}", uidGenerator.getUID());
}
return 0L;
}