• springboot集成UidGenerator


    目录

    第一步:拉去开源项目,打成jar包

    第二步:新建项目、导包

    第三步:创建数据库表结构

    ​第四步:配置数据库信息以及mapper扫描

    第五步:启动类上加上 @MapperScan(“com.baidu.fsg”)

    第六步:编写生成工具类

    第七步:测试

    UidGenerator是百度开源的基于雪花算法的唯一id生成器(百度对雪花算法进行了改进)一种分布式id,对雪花算法的一种增强

    第一步:拉去开源项目,打成jar包

    GitHub - baidu/uid-generator: UniqueID generator

    拉去项目导入idea中、并进行打包操作

    第二步:新建项目、导包

    新建一个springboot项目、并导入从源码打的jar包

    mvn install:install-file -Dfile=D:\uid-generator-1.0.0-SNAPSHOT.jar -DgroupId=com.generator -DartifactId=uid-generator -Dversion=1.0.0-SNAPSHOT -Dpackaging=jar
    

    引入依赖

    1. <dependency>
    2. <groupId>commons-langgroupId>
    3. <artifactId>commons-langartifactId>
    4. <version>2.6version>
    5. dependency>

    第三步:创建数据库表结构

    1. DROP TABLE IF EXISTS WORKER_NODE;
    2. CREATE TABLE WORKER_NODE
    3. (
    4. ID BIGINT NOT NULL AUTO_INCREMENT COMMENT 'auto increment id',
    5. HOST_NAME VARCHAR(64) NOT NULL COMMENT 'host name',
    6. PORT VARCHAR(64) NOT NULL COMMENT 'port',
    7. TYPE INT NOT NULL COMMENT 'node type: ACTUAL or CONTAINER',
    8. LAUNCH_DATE DATE NOT NULL COMMENT 'launch date',
    9. MODIFIED TIMESTAMP NOT NULL COMMENT 'modified time',
    10. CREATED TIMESTAMP NOT NULL COMMENT 'created time',
    11. PRIMARY KEY(ID)
    12. )
    13. COMMENT='DB WorkerID Assigner for UID Generator',ENGINE = INNODB;

    在新建的springboot项目的resources下新建mapper文件夹放入WORKER_NODE.xml文件。注:这个文件是从源码项目中copy过来的项目位置在一下文件夹中

    第四步:配置数据库信息以及mapper扫描

    1. # 端口号
    2. server.port=9999
    3. # 数据库地址
    4. spring.datasource.url=jdbc:mysql://localhost:3306/study_test?serverTimezone=UTC
    5. # 用户名
    6. spring.datasource.username=root
    7. # 密码
    8. spring.datasource.password=0407
    9. spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
    10. # UidGenerator 以下是自定义的配置信息
    11. uid.epochStr=2020-05-08
    12. # 时间位, 默认:30
    13. uid.timeBits=41
    14. # 机器位, 默认:16
    15. uid.workerBits=10
    16. # 序列号, 默认:7
    17. uid.seqBits=12
    18. # 是否容忍时钟回拨, 默认:true
    19. uid.enableBackward=true
    20. # RingBuffer size扩容参数, 可提高UID生成的吞吐量, 默认:3
    21. uid.CachedUidGenerator.boostPower=3
    22. # 指定何时向RingBuffer中填充UID, 取值为百分比(0, 100), 默认为50
    23. uid.CachedUidGenerator.paddingFactor=50
    24. #mybatis-plus配置mapper扫描 重点
    25. mybatis.mapper-locations=classpath*:mapper/**/*Mapper.xml,classpath*:/mapper/WORKER_NODE.xml

    第五步:启动类上加上 @MapperScan(“com.baidu.fsg”)

    1. package com.lyf.poi.config;
    2. import com.baidu.fsg.uid.buffer.RejectedPutBufferHandler;
    3. import com.baidu.fsg.uid.buffer.RejectedTakeBufferHandler;
    4. import com.baidu.fsg.uid.buffer.RingBuffer;
    5. import com.baidu.fsg.uid.impl.CachedUidGenerator;
    6. import com.baidu.fsg.uid.impl.DefaultUidGenerator;
    7. import com.baidu.fsg.uid.worker.DisposableWorkerIdAssigner;
    8. import org.springframework.beans.factory.annotation.Value;
    9. import org.springframework.context.annotation.Bean;
    10. import org.springframework.context.annotation.Configuration;
    11. /**
    12. * @author liuyaofu
    13. * @create 2022-08-12-23:14
    14. * 两种生成策略注入Bean
    15. */
    16. @Configuration
    17. public class UidGeneratorConfiguration {
    18. /**
    19. * RingBuffer size扩容参数, 可提高UID生成的吞吐量. -->
    20. * 默认:3, 原bufferSize=8192, 扩容后bufferSize= 8192 << 3 = 65536
    21. * CachedUidGenerator 参数{@link UidGeneratorConfiguration#cachedUidGenerator()}
    22. */
    23. private int boostPower = 3;
    24. /**
    25. * 指定何时向RingBuffer中填充UID, 取值为百分比(0, 100), 默认为50 -->
    26. * 举例: bufferSize=1024, paddingFactor=50 -> threshold=1024 * 50 / 100 = 512.
    27. * 当环上可用UID数量 < 512时, 将自动对RingBuffer进行填充补全
    28. */
    29. private int paddingFactor = 50;
    30. /**
    31. * 另外一种RingBuffer填充时机, 在Schedule线程中, 周期性检查填充
    32. * 默认:不配置此项, 即不实用Schedule线程. 如需使用, 请指定Schedule线程时间间隔, 单位:秒
    33. */
    34. private Long scheduleInterval;
    35. /**
    36. * 拒绝策略: 当环已满, 无法继续填充时 -->
    37. * 默认无需指定, 将丢弃Put操作, 仅日志记录. 如有特殊需求, 请实现RejectedPutBufferHandler接口(支持Lambda表达式)
    38. */
    39. private RejectedPutBufferHandler rejectedPutBufferHandler;
    40. /**
    41. * 拒绝策略: 当环已空, 无法继续获取时 -->
    42. * 默认无需指定, 将记录日志, 并抛出UidGenerateException异常. 如有特殊需求, 请实现RejectedTakeBufferHandler接口(支持Lambda表达式)
    43. */
    44. private RejectedTakeBufferHandler rejectedTakeBufferHandler;
    45. /**
    46. * 暂时不知道
    47. */
    48. private RingBuffer ringBuffer;
    49. @Bean(name = "cachedUidGenerator")
    50. public CachedUidGenerator cachedUidGenerator(){
    51. CachedUidGenerator cachedUidGenerator = new CachedUidGenerator();
    52. cachedUidGenerator.setWorkerIdAssigner(disposableWorkerIdAssigner());
    53. return cachedUidGenerator;
    54. }
    55. @Bean(name = "disposableWorkerIdAssigner")
    56. public DisposableWorkerIdAssigner disposableWorkerIdAssigner(){
    57. return new DisposableWorkerIdAssigner();
    58. }
    59. /**
    60. * # 时间位, 默认:28
    61. */
    62. private int timeBits;
    63. /**
    64. * # 机器位, 默认:22
    65. */
    66. private int workerBits;
    67. /**
    68. * # 序列号, 默认:13
    69. */
    70. private int seqBits;
    71. /**
    72. * # 初始时间, 默认:"2016-05-20"
    73. */
    74. @Value("${uid.epochStr}")
    75. private String epochStr;
    76. @Bean(name = "defaultUidGenerator")
    77. public DefaultUidGenerator defaultUidGenerator(){
    78. DefaultUidGenerator defaultUidGenerator = new DefaultUidGenerator();
    79. defaultUidGenerator.setWorkerIdAssigner(disposableWorkerIdAssigner());
    80. return defaultUidGenerator;
    81. }
    82. }

    第六步:编写生成工具类

    1. package com.lyf.poi.util;
    2. import com.baidu.fsg.uid.impl.CachedUidGenerator;
    3. import org.springframework.stereotype.Component;
    4. import javax.annotation.Resource;
    5. /**
    6. * @author liuyaofu
    7. * @create 2022-08-12-23:15
    8. * id自增的一种方式
    9. */
    10. @Component
    11. public class IdGenerator {
    12. @Resource(name = "cachedUidGenerator")
    13. private CachedUidGenerator cachedUidGenerator;
    14. /**
    15. * 获取uid
    16. *
    17. * @return
    18. */
    19. public long nextId() {
    20. return cachedUidGenerator.getUID();
    21. }
    22. /**
    23. * 格式化传入的uid,方便查看其实际含义
    24. *
    25. * @param uid
    26. * @return
    27. */
    28. public String parse(long uid) {
    29. return cachedUidGenerator.parseUID(uid);
    30. }
    31. }

    第七步:测试

    1. package com.lyf.poi.controller;
    2. import com.lyf.poi.util.DefGenerator;
    3. import com.lyf.poi.util.IdGenerator;
    4. import org.springframework.web.bind.annotation.GetMapping;
    5. import org.springframework.web.bind.annotation.RestController;
    6. import javax.annotation.Resource;
    7. /**
    8. * @author liuyaofu
    9. * @create 2022-08-12-23:16
    10. */
    11. @RestController
    12. public class UidController {
    13. @Resource
    14. private IdGenerator idGenerator;
    15. @Resource
    16. private DefGenerator defGenerator;
    17. @GetMapping(value = "getUid")
    18. public long getUid(){
    19. long l = idGenerator.nextId();
    20. String parse = idGenerator.parse(l);
    21. System.out.println(parse);
    22. return l;
    23. }
    24. @GetMapping(value = "getUidDef")
    25. public long getUidDef(){
    26. long l = defGenerator.nextId();
    27. String parse = defGenerator.parse(l);
    28. System.out.println(parse);
    29. return l;
    30. }
    31. }

    测试结果


     

  • 相关阅读:
    【React】AntD组件的使用--极客园--02.登录模块
    【JavaScript】参考手册-String对象的3个属性和17个方法
    未来展望:大型语言模型与 SQL 数据库集成的前景与挑战
    浅析-ES6
    调试九法准则
    一文搞懂 MySQL 日志
    python创建一个简单的flask应用
    Rust 1.79.0发布
    Oracle基础知识和常用操作
    C语言每日一题(26)移除链表元素
  • 原文地址:https://blog.csdn.net/lylyf520/article/details/126312999