基于号段模式、百度UID实现的分布式ID生成器kylin-id

1、简介

1.1、开源项目

1.2、介绍

  1. 参考滴滴 tinyid: tinyid 是滴滴开发的 id 生成器 分布式id生成系统,简单易用、高性能、高可用的id生成系统
  2. 整合百度UidGenerator: UidGenerator 是 Java 实现的,基于 Snowflake 算法的唯一 ID 生成器
  3. 麒麟发号器支持号段模式、百度uid
  4. uid的workerId生成方式: a. 支持根据bizType生成,每次重启服务自增 b. 支持使用百度提供的方式生成workerId

2、使用说明

2.1、引入依赖


    com.wjk.kylin
     kylin-id-spring-boot-starter
     1.0.0
 

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 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;
}
展开阅读全文

页面更新:2024-03-13

标签:生成器   步长   分布式   麒麟   模式   算法   类型   结构   业务   时间

1 2 3 4 5

上滑加载更多 ↓
推荐阅读:
友情链接:
更多:

本站资料均由网友自行发布提供,仅用于学习交流。如有版权问题,请与我联系,QQ:4156828  

© CopyRight 2020-2024 All Rights Reserved. Powered By 71396.com 闽ICP备11008920号-4
闽公网安备35020302034903号

Top