基于号段模式百度UID实现的分布式ID生成器kylinid
1、简介1.1、开源项目kylin-id: 麒麟分布式id生成器,支持号段模式、雪花算法并未发布jar到中央仓库,需要自己本地构建 1.2、介绍参考滴滴 tinyid: tinyid 是滴滴开发的 id 生成器 分布式id生成系统,简单易用、高性能、高可用的id生成系统
整合百度UidGenerator: UidGenerator 是 Java 实现的,基于 Snowflake 算法的唯一 ID 生成器
麒麟发号器支持号段模式、百度uid uid的workerId生成方式: a. 支持根据bizType生成,每次重启服务自增 b. 支持使用百度提供的方式生成workerId 2、使用说明2.1、引入依赖 com.wjk.kylin kylin-id-spring-boot-starter 1.0.0 2.2、application.ymlkylin: 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-server2.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 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; }