• springboot集成UidGenerator


    springboot集成UidGenerator
    集成UidGenerator
    第一步:拉去开源项目,打成jar包
    第二步:导包
    第三步:创建数据库表结构
    第四步:配置数据库信息以及mapper扫描
    第五步:配置Bean注入配置文件
    第六步:编写生成工具类
    第七步:测试
    集成UidGenerator
    废话不多说,直接开始
    使用的技术有
    springboot+mybatis-plus+mysql-8.0+maven
    项目总体结构 项目使用的pom信息我放到文章最后了

    在这里插入图片描述

    我在集成id的时候主要分为几个步骤(本人小白,写的不好敬请谅解啊😂)

    1. 找到开源项目拉去到本地,打成jar包
    2. 创建生成id所需要的表
    3. 配置生成策略文件(就是把实现类注入Bean)
    4. 测试生成结果

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

    git-hub地址:uid-generator
    中文介绍文档地址:中文文档
    这是拉去下来的项目-master分支

    在这里插入图片描述

     打包

    在这里插入图片描述

    然后项目中会生成一个target文件-target下会有生成的jar包

    在这里插入图片描述

     鼠标放到target上右键鼠标选择 show in explorer 进入文件夹找到jar包

    第二步:导包

    • 注意:以下是在新建的springboot项目中操作
    • 新建springboot项目并且把刚才打成本地jar包的导入新的项目中去

    在这里插入图片描述

     运行一下我们修改好的路径(每个人的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
    

    -Dfile= 后边填写你的jar包具体位置
    -DgroupId= 后边对应pom中groupId中的名称
    -DartifactId= 后边对应pom中artifactId中名称
    -Dversion= 后边对应pom中version中名称

    项目中引入maven依赖-这里多放一个依赖是使用StringUtils的包的(我运行的时候发现找不到包是

    1. com.generator
    2. uid-generator
    3. 1.0.0-SNAPSHOT
    4. commons-lang
    5. commons-lang
    6. 2.6

    刷新maven仓库

    在这里插入图片描述

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

    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;

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

    在这里插入图片描述

    在这里插入图片描述

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

    1. # 端口号
    2. server.port=9999
    3. # 数据库地址
    4. spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC
    5. # 用户名
    6. spring.datasource.username=root
    7. # 密码
    8. spring.datasource.password=123456
    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

    第五步:配置Bean注入配置文件

    文件中的 @Value 注解使用来取配置文件中自定义的配置
    别忘了在启动类上加上 @MapperScan(“com.baidu.fsg”)

    在这里插入图片描述

    1. package com.uid.uiddemo.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. * 两种生成策略注入Bean
    13. *
    14. * @author Administrator
    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. }

    第六步:编写生成工具类

    • 以下我使用了两种生成策略,大家可以自行选择
    • IdGenerator
    1. package com.uid.uiddemo.util;
    2. import com.baidu.fsg.uid.impl.CachedUidGenerator;
    3. import org.springframework.stereotype.Component;
    4. import javax.annotation.Resource;
    5. /**
    6. * id自增的一种方式
    7. *
    8. * @author Administrator
    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. }
    • DefGenerator
    1. package com.uid.uiddemo.util;
    2. import com.baidu.fsg.uid.impl.DefaultUidGenerator;
    3. import org.springframework.stereotype.Component;
    4. import javax.annotation.Resource;
    5. /**
    6. * 默认的生成器策略
    7. *
    8. * @author Administrator
    9. */
    10. @Component
    11. public class DefGenerator {
    12. @Resource(name = "defaultUidGenerator")
    13. private DefaultUidGenerator defaultUidGenerator;
    14. /**
    15. * 获取uid
    16. *
    17. * @return
    18. */
    19. public long nextId() {
    20. return defaultUidGenerator.getUID();
    21. }
    22. /**
    23. * 格式化传入的uid,方便查看其实际含义
    24. *
    25. * @param uid
    26. * @return
    27. */
    28. public String parse(long uid) {
    29. return defaultUidGenerator.parseUID(uid);
    30. }
    31. }

    第七步:测试

    • 测试Controller
    1. package com.uid.uiddemo.controller;
    2. import com.uid.uiddemo.util.DefGenerator;
    3. import com.uid.uiddemo.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 Administrator
    9. */
    10. @RestController
    11. public class UidController {
    12. @Resource
    13. private IdGenerator idGenerator;
    14. @Resource
    15. private DefGenerator defGenerator;
    16. @GetMapping(value = "getUid")
    17. public long getUid(){
    18. long l = idGenerator.nextId();
    19. String parse = idGenerator.parse(l);
    20. System.out.println(parse);
    21. return l;
    22. }
    23. @GetMapping(value = "getUidDef")
    24. public long getUidDef(){
    25. long l = defGenerator.nextId();
    26. String parse = defGenerator.parse(l);
    27. System.out.println(parse);
    28. return l;
    29. }
    30. }

    在这里插入图片描述

     最后pom文件

    1. "1.0" encoding="UTF-8"?>
    2. "http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. 4.0.0
    5. org.springframework.boot
    6. spring-boot-starter-parent
    7. 2.4.5
    8. com.uid
    9. uid-generator
    10. 0.0.1-SNAPSHOT
    11. uid-generator
    12. Demo project for Spring Boot
    13. 1.8
    14. org.springframework.boot
    15. spring-boot-starter-web
    16. org.mybatis.spring.boot
    17. mybatis-spring-boot-starter
    18. 2.2.2
    19. mysql
    20. mysql-connector-java
    21. 8.0.20
    22. org.projectlombok
    23. lombok
    24. true
    25. org.springframework.boot
    26. spring-boot-starter-test
    27. test
    28. commons-lang
    29. commons-lang
    30. 2.6
    31. com.generator
    32. uid-generator
    33. 1.0.0-SNAPSHOT
    34. org.springframework.boot
    35. spring-boot-maven-plugin
    36. org.projectlombok
    37. lombok

  • 相关阅读:
    [VIM]spcaevim
    【win12】服务器windows server2012因为DNS配置失败而导致无法上网的解决办法【手动配置DNS试试->取消自动获取】
    Python通过dlib模块实现人脸识别的案例
    08 数据库查询(2) | OushuDB 数据库使用入门
    Day27——39. 组合总和 40.组合总和II 131.分割回文串
    python-opencv之图像梯度Sobel、Scharr、Laplacian算子边缘检测
    Kotlin 变量详解:声明、赋值与最佳实践指南
    Vue笔记-vue中使用JS创建的函数
    面试题:volatile能否保证线程安全
    SD系列——图像高清化算法方法
  • 原文地址:https://blog.csdn.net/qq_40428665/article/details/126125111