# 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/)