# kylin-id
**Repository Path**: wangjkui/kylin-id
## Basic Information
- **Project Name**: kylin-id
- **Description**: 麒麟分布式id生成器,支持号段模式、雪花算法
- **Primary Language**: Java
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 1
- **Created**: 2022-07-09
- **Last Updated**: 2023-06-06
## Categories & Tags
**Categories**: Uncategorized
**Tags**: 分布式ID, 号段模式, 雪花算法, ID生成器, 百度Uid
## README
# kylin-id
#### 介绍
发号服务
#### 软件架构
软件架构说明
1. 参考滴滴[tinyid](https://gitee.com/didiopensource/tinyid.git)
2. 整合百度[uid](https://gitee.com/mirrors/UidGenerator.git)
3. 麒麟发号服务支持号段模式、百度uid
4. uid的workerId生成方式:
①支持根据bizType生成,每次重启服务自增.`com.wjk.kylin.id.core.worker.DefaultWorkerIdAssigner`
②支持使用百度提供的方式生成workerId.`com.wjk.kylin.id.example.worker.DisposableWorkerIdAssigner`
#### 使用说明
1. 引入pom
~~~
com.wjk.kylin
kylin-id-spring-boot-starter
1.0.0
~~~
2. 配置
~~~
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
~~~
3. 创建号段模式表
~~~
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;
~~~
4. 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;
~~~
5. 号段模式使用
~~~
@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 idList = IdUtil.nextId(bizType, batchSize);
for (Long id : idList) {
log.info("{}", id);
}
return 0L;
}
~~~
6. 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;
}
~~~
#### 参与贡献
1. Fork 本仓库
2. 新建 Feat_xxx 分支
3. 提交代码
4. 新建 Pull Request
#### 特技
1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md
2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com)
3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目
4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目
5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help)
6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)