# 百度uid-generator唯一ID生成器
UidGenerator是Java实现的, 基于Snowflake算法的唯一ID生成器。UidGenerator以组件形式工作在应用项目中, 支持自定义workerId位数和初始化策略, 从而适用于docker等虚拟化环境下实例自动重启、漂移等场景。 在实现上, UidGenerator通过借用未来时间来解决sequence天然存在的并发限制; 采用RingBuffer来缓存已生成的UID, 并行化UID的生产和消费, 同时对CacheLine补齐,避免了由RingBuffer带来的硬件级「伪共享」问题. 最终单机QPS可达600万。依赖版本:Java8及以上版本, MySQL(内置WorkerID分配器, 启动阶段通过DB进行分配; 如自定义实现, 则DB非必选依赖)
### 中文文档
https://github.com/baidu/uid-generator/blob/master/README.zh_cn.md
### 官方源码
https://github.com/baidu/uid-generator
### 案例使用
全局ID生成器是服务化系统的基础设施,其在保障系统的正确运行和高可用方面发挥着重要作用。而关于全局ID生成算法首屈一指的当属 Snowflake雪花算法,然而 Snowflake本身很难在现实项目中直接使用,因此实际应用时需要一种可落地的方案。
UidGenerator 由百度开发,是Java实现的, 基于 Snowflake算法的唯一ID生成器。UidGenerator以组件形式工作在应用项目中, 支持自定义workerId位数和初始化策略, 从而适用于 docker等虚拟化环境下实例自动重启、漂移等场景。
>本文就在项目中来集成 UidGenerator这一工程来作为项目的全局唯一 ID生成器。
案例源码地址:https://gitee.com/zhangbw666/uid-generator-boot
![](https://ymtd-1307390667.cos.ap-guangzhou.myqcloud.com/img-other/20210313001.jpg)
本案例主要是讲解springboot集成百度uid-generator唯一ID生成器,比如订单中心生成唯一订单号,可调用此服务生成全局唯一ID供业务使用。可作为单独的服务独立部署,做成一个微服务供其他服务调用。
- 说明
```text
升级spring boot 版本: 2.1.10.RELEASE
升级 mybatis,mybatis-spring 版本
升级 mysql-connector-java 版本:8.0.12
升级 junit 版本
```
- 启动入口
```java
uid-provide 中的 UidProvideApplication
```
- 浏览器访问
```html
http://localhost:8080/uidGenerator
```
- 返回全局UID
```text
1071649247213936641
```
好了,以上步骤就是实现了全局ID的生成,通过调用http://localhost:8080/uidGenerator接口,即可很方便的生成全局ID,是不是很简单。接下来,我们需要讲解详细过程,先讲讲官方源码是怎样玩的。
### 官方源码实战
- 创建数据库表
导入官网数据库SQL [https://github.com/baidu/uid-generator/blob/master/src/main/scripts/WORKER_NODE.sql](https://github.com/baidu/uid-generator/blob/master/src/main/scripts/WORKER_NODE.sql)
也就是一张表
我这里是在`uid_generator`库中,创建了这张表
```sql
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 datetime NOT NULL COMMENT 'modified time',
CREATED datetime NOT NULL COMMENT 'created time',
PRIMARY KEY(ID)
)
COMMENT='DB WorkerID Assigner for UID Generator',ENGINE = INNODB;
```
- mysql配置信息更改
因为升级到8.x ,配置文件部分也要跟着修改`uid-generator` 下,测试文件夹下的资源包`uid/mysql.properties` 以下修改为
```java
mysql.driver=com.mysql.cj.jdbc.Driver
```
修改完成后,配置好数据库相关参数,这样单元测试即可执行成功。接下来,我们就讲讲在SpringBoot中如何基于百度uid-generator唯一ID生成器实现全局ID的生成。
### 案例详解
计划将全局生成唯一ID作为一个服务提供者,供其他微服务使用调用。这里创建了一个项目,项目中包含两个子项目一个是`uid-generator`官方本身,当然你也可以不需要放到本项目中,直接使用官方的自行打包即可,一个是`uid-provide` 服务提供者。以下说明的主要是`服务提供者`
- 创建 子项目 uid-provide
POM配置文件如下
```xml
<?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>
<groupId>com.bowen</groupId>
<artifactId>uid-provide</artifactId>
<version>1.0-SNAPSHOT</version>
<name>uid-provide</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.bowen</groupId>
<artifactId>uid-generator-boot</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<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.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--for mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!--for Mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>8.0.12</version>
</dependency>
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.16</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- uid-generator jar 包 -->
<dependency>
<groupId>com.bowen</groupId>
<artifactId>uid-generator</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
```
- 复制 mapper
先在`uid-provide`项目资源包路径下创建`mapper`文件夹,然后到官方`uid-generator`资源包路径下`META-INF/mybatis/mapper/WORKER_NODE.xml` 复制`WORKER_NODE.xml`文件,粘贴到该文件夹`mapper`内。
- cache id 配置文件
>UidGenerator 有两个具体的实现类,分别是 DefaultUidGenerator 和 CachedUidGenerator,不过官方也推荐了对于性能比较敏感的项目应使用后者,因此本文也使用 CachedUidGenerator,而对于 DefaultUidGenerator不做过多阐述。
先在`uid-provide`项目资源包路径下创建`uid`文件夹,然后到官方`uid-generator` `测试` [注意:`这里是测试资源包`] 资源包路径下`uid/cached-uid-spring.xml` 复制`cached-uid-spring.xml`文件,粘贴到该文件夹`uid`内。
```xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://w
没有合适的资源?快使用搜索试试~ 我知道了~
雪花片算法(包含百度、滴滴、美团的实现方法)
共474个文件
xml:283个
java:99个
class:30个
需积分: 3 0 下载量 78 浏览量
2024-07-27
20:33:04
上传
评论
收藏 615KB RAR 举报
温馨提示
雪花片算法(包含百度、滴滴、美团的实现方法)
资源推荐
资源详情
资源评论
收起资源包目录
雪花片算法(包含百度、滴滴、美团的实现方法) (474个子文件)
$PROJECT_FILE$ 364B
$PROJECT_FILE$ 364B
$PROJECT_FILE$ 364B
$PROJECT_FILE$ 364B
RingBuffer.class 7KB
BufferPaddingExecutor.class 5KB
CachedUidGenerator.class 5KB
DefaultUidGenerator.class 5KB
CachedUidGeneratorTest.class 5KB
DefaultUidGeneratorTest.class 5KB
NamingThreadFactory.class 4KB
DisposableWorkerIdAssigner.class 2KB
BitsAllocator.class 2KB
WorkerNodeEntity.class 2KB
DateUtils.class 2KB
DockerUtils.class 2KB
NetUtils.class 2KB
EnumUtils.class 2KB
WorkerNodeType.class 1KB
NamingThreadFactory$1.class 1KB
UidGenerateException.class 1KB
UidProvideApplication.class 1021B
UidController.class 1001B
PaddedAtomicLong.class 814B
UidGenService.class 662B
WorkerNodeDAO.class 555B
UidProvideApplicationTests.class 523B
UidConfig.class 503B
BufferedUidProvider.class 318B
RejectedTakeBufferHandler.class 300B
RejectedPutBufferHandler.class 298B
UidGenerator.class 266B
ValuedEnum.class 243B
WorkerIdAssigner.class 169B
spring.factories 110B
.gitignore 363B
.gitignore 270B
.gitignore 263B
.gitignore 263B
.gitignore 262B
.gitignore 262B
.gitignore 253B
.gitignore 155B
uid-provide.iml 10KB
leaf-spring-boot-starter-core.iml 8KB
tinyid-server.iml 8KB
leaf-spring-boot-start.iml 6KB
leaf-spring-boot-starter-server.iml 5KB
leaf-common.iml 5KB
uid-generator.iml 3KB
tinyid-client.iml 1KB
leaf-spring-boot-starter.iml 683B
tinyid-base.iml 670B
baidu-uid-generator.iml 585B
didi-tinyid.iml 585B
snowflake-test.iml 344B
client-test.iml 81B
uid-generator-1.0-SNAPSHOT.jar 31KB
SegmentIDGenImpl.java 11KB
SnowflakeZookeeperHolder.java 11KB
RingBuffer.java 10KB
DefaultUidGenerator.java 8KB
CachedUidGenerator.java 7KB
BufferPaddingExecutor.java 6KB
IdContronller.java 5KB
NamingThreadFactory.java 5KB
SnowflakeIDGenImpl.java 4KB
BitsAllocator.java 4KB
CachedUidGeneratorTest.java 4KB
CachedIdGenerator.java 3KB
IdGeneratorFactoryClient.java 3KB
DataSourceConfig.java 3KB
DefaultUidGeneratorTest.java 3KB
DbSegmentIdServiceImpl.java 3KB
SegmentBuffer.java 3KB
DateUtils.java 3KB
DockerUtils.java 3KB
IDAllocDaoImpl.java 3KB
SegmentId.java 3KB
DisposableWorkerIdAssigner.java 3KB
WorkerNodeEntity.java 3KB
TinyIdHttpUtils.java 3KB
Utils.java 2KB
NetUtils.java 2KB
TinyIdTokenServiceImpl.java 2KB
TinyIdInfoDAOImpl.java 2KB
RequestFilter.java 2KB
HttpSegmentIdServiceImpl.java 2KB
SegmentService.java 2KB
TinyIdInfo.java 2KB
UidGenerateException.java 2KB
LeafAutoConfig.java 2KB
TinyIdClientConfig.java 2KB
EnumUtils.java 2KB
SegmentBufferView.java 2KB
PaddedAtomicLong.java 2KB
TinyIdTokenDAOImpl.java 1KB
SnowflakeService.java 1KB
IDAllocMapper.java 1KB
WorkerNodeDAO.java 1KB
共 474 条
- 1
- 2
- 3
- 4
- 5
资源评论
风雨无阻1203
- 粉丝: 569
- 资源: 38
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 牙科铣床三维建模图纸 STP格式 .zip
- 基于Spring Boot框架的优惠券卡包系统.zip
- SSS Shader Graph
- 基于Spring Boot框架的仿牛客网社区.zip
- 基于Spring Boot框架的仓库管理系统.zip
- OpenNJet实现了NGINX云原生功能增强、安全加固和代码重构,利用动态加载机制可以实现不同的产品形态,如Web服务器等等
- 基于正负序分离控制的三相离网逆变器,带不平衡阻性负载 图片为基于正序控制的和基于正负序分离控制的离网逆变器分别带载的波形
- 基于Spring Boot框架的乐优商城.zip
- 基于ros2的fast-lio2定位算法
- 基于Spring Boot框架的Hadoop集群管理系统.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功