SpringBoot项目快速百度UidGenerator分布式数据库id生成器

SpringBoot项目快速优雅集成百度UidGenerator分布式数据库id生成器

简介

百度UidGenerator是一个分布式数据库id生成器,本文在SpringBoot项目快速优雅集成百度UidGenerator,使用的是 uid-generator-spring-boot-starter ,它是基于百度UidGenerator,在此基础上做了部分改进。

  • 改造为spring-boot-starter的形式,不用部署为分布式,直接建表、在项目中引入,即可使用
  • 针对时钟回拨,提供了修正选项(默认启用,可通过配置关闭),小于阈值直接休眠,大于阈值更改机器号
  • 对机器id用尽提供了复用策略:取余
  • 解除id位数限制,由“必须64位”改为“不大于64位”,可根据需要获取更短id

集成步骤

1.在项目使用的数据库里,执行WORKER_NODE表脚本

我这边使用的是MySQL数据库

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: CONTAINER(1), ACTUAL(2), FAKE(3)',
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;

2.maven的pom文件里引入依赖

其它的springboot默认依赖和mysql依赖我就不贴了

<properties>
        <uid-generator.version>1.0.3.RELEASE</uid-generator.version>
</properties>
<dependencies>
	<dependency>
        	<groupId>com.github.wujun234</groupId>
        	<artifactId>uid-generator-spring-boot-starter</artifactId>
        	<version>${uid-generator.version}</version>
	</dependency>
</dependencies>

3.配置文件application.yml里引入自定义配置

这些自定义配置不是必须的,大家结合自己实际情况配置即可。

# UidGenerator
# 初始时间, 默认:"2019-02-20"
uid:
  epochStr: 2020-05-08
  # 时间位, 默认:30
  timeBits: 41
  # 机器位, 默认:16
  workerBits: 10
  # 序列号, 默认:7
  seqBits: 12
  # 是否容忍时钟回拨, 默认:true
  enableBackward: true
  # RingBuffer size扩容参数, 可提高UID生成的吞吐量, 默认:3
  CachedUidGenerator:
    boostPower: 3
  # 指定何时向RingBuffer中填充UID, 取值为百分比(0, 100), 默认为50
    paddingFactor: 50
server:
  port: 8081
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/datesource?characterEncoding=utf-8&useSSL=false
    username: root
    password: root
    driverClassName: com.mysql.jdbc.Driver

4.IdGenerator.java工具类

这边我们使用CachedUidGenerator,因为它的性能更好。

import com.github.wujun234.uid.impl.CachedUidGenerator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

/**
 * @author: JNS
 * @date: 2021年10月18日 12:40
 */
@Component
public class IdGenerator {
    @Autowired
    private CachedUidGenerator cachedUidGenerator;

    /**
     * 获取uid
     *
     * @return
     */
    public long nextId() {
        return cachedUidGenerator.getUID();
    }

    /**
     * 格式化传入的uid,方便查看其实际含义
     *
     * @param uid
     * @return
     */
    public String parse(long uid) {
        return cachedUidGenerator.parseUID(uid);
    }
}

5.UidController.java测试类

import com.jns.wuhudata.config.IdGenerator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author: JNS
 * @date: 2021年10月18日 12:42
 */
@RestController
public class UidController {

    @Autowired
    private IdGenerator idGenerator;

    @GetMapping("/testGet")
    public Long testGet() {
        return idGenerator.nextId();
    }

    @GetMapping("/testParse/{uid}")
    public String testParse(@PathVariable("uid") Long uid) {
        return idGenerator.parse(uid);
    }

}

运行测试

1.启动springboot项目

可以看到worker_node表里已经插入一条记录

img

2.调用接口 http://localhost:8081/testGet

SpringBoot项目快速百度UidGenerator分布式数据库id生成器_第1张图片

3.调用接口 http://localhost:8081/testParse/898654797824

898654797824 是刚刚获取到的uid

2.调用接口 http://localhost:8081/testGet

[外链图片转存中…(img-siY8TGll-1634628295002)]

3.调用接口 http://localhost:8081/testParse/898654797824

898654797824 是刚刚获取到的uid

img

你可能感兴趣的:(spring,boot,id)