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的包的(我运行的时候发现找不到包是

  <dependency>
	  <groupId>com.generator</groupId>
	   <artifactId>uid-generator</artifactId>
	   <version>1.0.0-SNAPSHOT</version>
  </dependency>
  <dependency>
      <groupId>commons-lang</groupId>
       <artifactId>commons-lang</artifactId>
       <version>2.6</version>
   </dependency>

刷新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过来的项目位置在一下文件夹中

在这里插入图片描述

在这里插入图片描述

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


# 端口号
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

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

文件中的 @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;
    }
}

第六步:编写生成工具类

  • 以下我使用了两种生成策略,大家可以自行选择
  • IdGenerator
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);
    }
}

  • DefGenerator
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);
    }
}

第七步:测试

  • 测试Controller
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文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>


    <groupId>com.uid</groupId>
    <artifactId>uid-generator</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>uid-generator</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>


    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.2</version>
        </dependency>


        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.20</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>
        <dependency>
            <groupId>com.generator</groupId>
            <artifactId>uid-generator</artifactId>
            <version>1.0.0-SNAPSHOT</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值