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

我在集成id的时候主要分为几个步骤(本人小白,写的不好敬请谅解啊😂)
git-hub地址:uid-generator
中文介绍文档地址:中文文档
这是拉去下来的项目-master分支

打包

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

鼠标放到target上右键鼠标选择 show in explorer 进入文件夹找到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的包的(我运行的时候发现找不到包是
-
-
com.generator -
uid-generator -
1.0.0-SNAPSHOT -
-
-
commons-lang -
commons-lang -
2.6 -
刷新maven仓库

第三步:创建数据库表结构
- DROP TABLE IF EXISTS WORKER_NODE;
- CREATE TABLE WORKER_NODE
- (
- ID BIGINT NOT NULL AUTO_INCREMENT COMMENT 'auto increment id',
- HOST_NAME VARCHAR(64) NOT NULL COMMENT 'host name',
- PORT VARCHAR(64) NOT NULL COMMENT 'port',
- TYPE INT NOT NULL COMMENT 'node type: ACTUAL or CONTAINER',
- LAUNCH_DATE DATE NOT NULL COMMENT 'launch date',
- MODIFIED TIMESTAMP NOT NULL COMMENT 'modified time',
- CREATED TIMESTAMP NOT NULL COMMENT 'created time',
- PRIMARY KEY(ID)
- )
- COMMENT='DB WorkerID Assigner for UID Generator',ENGINE = INNODB;
在resources下新建mapper文件夹放入WORKER_NODE.xml文件。注:这个文件是从源码项目中copy过来的项目位置在一下文件夹中


-
- # 端口号
- server.port=9999
- # 数据库地址
- spring.datasource.url=jdbc:mysql://localhost:3306/test?serverTimezone=UTC
- # 用户名
- spring.datasource.username=root
- # 密码
- spring.datasource.password=123456
- spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
- # UidGenerator 以下是自定义的配置信息
-
- uid.epochStr=2020-05-08
- # 时间位, 默认:30
- uid.timeBits=41
- # 机器位, 默认:16
- uid.workerBits=10
- # 序列号, 默认:7
- uid.seqBits=12
- # 是否容忍时钟回拨, 默认:true
- uid.enableBackward=true
- # RingBuffer size扩容参数, 可提高UID生成的吞吐量, 默认:3
- uid.CachedUidGenerator.boostPower=3
- # 指定何时向RingBuffer中填充UID, 取值为百分比(0, 100), 默认为50
- uid.CachedUidGenerator.paddingFactor=50
-
- #mybatis-plus配置mapper扫描 重点
- mybatis.mapper-locations=classpath*:mapper/**/*Mapper.xml,classpath*:/mapper/WORKER_NODE.xml
文件中的 @Value 注解使用来取配置文件中自定义的配置
别忘了在启动类上加上 @MapperScan(“com.baidu.fsg”)

- package com.uid.uiddemo.config;
-
- import com.baidu.fsg.uid.buffer.RejectedPutBufferHandler;
- import com.baidu.fsg.uid.buffer.RejectedTakeBufferHandler;
- import com.baidu.fsg.uid.buffer.RingBuffer;
- import com.baidu.fsg.uid.impl.CachedUidGenerator;
- import com.baidu.fsg.uid.impl.DefaultUidGenerator;
- import com.baidu.fsg.uid.worker.DisposableWorkerIdAssigner;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.context.annotation.Bean;
- import org.springframework.context.annotation.Configuration;
-
- /**
- * 两种生成策略注入Bean
- *
- * @author Administrator
- */
- @Configuration
- public class UidGeneratorConfiguration {
-
- /**
- * RingBuffer size扩容参数, 可提高UID生成的吞吐量. -->
- * 默认:3, 原bufferSize=8192, 扩容后bufferSize= 8192 << 3 = 65536
- * CachedUidGenerator 参数{@link UidGeneratorConfiguration#cachedUidGenerator()}
- */
- private int boostPower = 3;
- /**
- * 指定何时向RingBuffer中填充UID, 取值为百分比(0, 100), 默认为50 -->
- * 举例: bufferSize=1024, paddingFactor=50 -> threshold=1024 * 50 / 100 = 512.
- * 当环上可用UID数量 < 512时, 将自动对RingBuffer进行填充补全
- */
- private int paddingFactor = 50;
- /**
- * 另外一种RingBuffer填充时机, 在Schedule线程中, 周期性检查填充
- * 默认:不配置此项, 即不实用Schedule线程. 如需使用, 请指定Schedule线程时间间隔, 单位:秒
- */
- private Long scheduleInterval;
- /**
- * 拒绝策略: 当环已满, 无法继续填充时 -->
- * 默认无需指定, 将丢弃Put操作, 仅日志记录. 如有特殊需求, 请实现RejectedPutBufferHandler接口(支持Lambda表达式)
- */
- private RejectedPutBufferHandler rejectedPutBufferHandler;
- /**
- * 拒绝策略: 当环已空, 无法继续获取时 -->
- * 默认无需指定, 将记录日志, 并抛出UidGenerateException异常. 如有特殊需求, 请实现RejectedTakeBufferHandler接口(支持Lambda表达式)
- */
- private RejectedTakeBufferHandler rejectedTakeBufferHandler;
- /**
- * 暂时不知道
- */
- private RingBuffer ringBuffer;
-
- @Bean(name = "cachedUidGenerator")
- public CachedUidGenerator cachedUidGenerator(){
- CachedUidGenerator cachedUidGenerator = new CachedUidGenerator();
- cachedUidGenerator.setWorkerIdAssigner(disposableWorkerIdAssigner());
- return cachedUidGenerator;
- }
-
- @Bean(name = "disposableWorkerIdAssigner")
- public DisposableWorkerIdAssigner disposableWorkerIdAssigner(){
- return new DisposableWorkerIdAssigner();
- }
-
-
- /**
- * # 时间位, 默认:28
- */
- private int timeBits;
- /**
- * # 机器位, 默认:22
- */
- private int workerBits;
- /**
- * # 序列号, 默认:13
- */
- private int seqBits;
- /**
- * # 初始时间, 默认:"2016-05-20"
- */
- @Value("${uid.epochStr}")
- private String epochStr;
-
- @Bean(name = "defaultUidGenerator")
- public DefaultUidGenerator defaultUidGenerator(){
- DefaultUidGenerator defaultUidGenerator = new DefaultUidGenerator();
- defaultUidGenerator.setWorkerIdAssigner(disposableWorkerIdAssigner());
- return defaultUidGenerator;
- }
- }
-
- package com.uid.uiddemo.util;
-
- import com.baidu.fsg.uid.impl.CachedUidGenerator;
- import org.springframework.stereotype.Component;
-
- import javax.annotation.Resource;
-
- /**
- * id自增的一种方式
- *
- * @author Administrator
- */
- @Component
- public class IdGenerator {
-
- @Resource(name = "cachedUidGenerator")
- private CachedUidGenerator cachedUidGenerator;
-
- /**
- * 获取uid
- *
- * @return
- */
- public long nextId() {
- return cachedUidGenerator.getUID();
- }
-
- /**
- * 格式化传入的uid,方便查看其实际含义
- *
- * @param uid
- * @return
- */
- public String parse(long uid) {
- return cachedUidGenerator.parseUID(uid);
- }
- }
-
- package com.uid.uiddemo.util;
-
- import com.baidu.fsg.uid.impl.DefaultUidGenerator;
- import org.springframework.stereotype.Component;
-
- import javax.annotation.Resource;
-
- /**
- * 默认的生成器策略
- *
- * @author Administrator
- */
- @Component
- public class DefGenerator {
-
- @Resource(name = "defaultUidGenerator")
- private DefaultUidGenerator defaultUidGenerator;
-
- /**
- * 获取uid
- *
- * @return
- */
- public long nextId() {
- return defaultUidGenerator.getUID();
- }
-
- /**
- * 格式化传入的uid,方便查看其实际含义
- *
- * @param uid
- * @return
- */
- public String parse(long uid) {
- return defaultUidGenerator.parseUID(uid);
- }
- }
-
- package com.uid.uiddemo.controller;
-
- import com.uid.uiddemo.util.DefGenerator;
- import com.uid.uiddemo.util.IdGenerator;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- import javax.annotation.Resource;
-
- /**
- * @author Administrator
- */
- @RestController
- public class UidController {
-
- @Resource
- private IdGenerator idGenerator;
-
- @Resource
- private DefGenerator defGenerator;
-
-
- @GetMapping(value = "getUid")
- public long getUid(){
- long l = idGenerator.nextId();
- String parse = idGenerator.parse(l);
- System.out.println(parse);
- return l;
- }
-
- @GetMapping(value = "getUidDef")
- public long getUidDef(){
- long l = defGenerator.nextId();
- String parse = defGenerator.parse(l);
- System.out.println(parse);
- return l;
- }
-
-
-
- }
-

最后pom文件
- "1.0" encoding="UTF-8"?>
"http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" - xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
-
4.0.0 -
-
org.springframework.boot -
spring-boot-starter-parent -
2.4.5 -
-
-
-
-
com.uid -
uid-generator -
0.0.1-SNAPSHOT -
uid-generator -
Demo project for Spring Boot -
-
1.8 -
-
-
-
-
-
org.springframework.boot -
spring-boot-starter-web -
-
-
org.mybatis.spring.boot -
mybatis-spring-boot-starter -
2.2.2 -
-
-
-
-
mysql -
mysql-connector-java -
8.0.20 -
-
-
org.projectlombok -
lombok -
true -
-
-
org.springframework.boot -
spring-boot-starter-test -
test -
-
-
commons-lang -
commons-lang -
2.6 -
-
-
com.generator -
uid-generator -
1.0.0-SNAPSHOT -
-
-
-
-
-
-
org.springframework.boot -
spring-boot-maven-plugin -
-
-
-
org.projectlombok -
lombok -
-
-
-
-
-
-