文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Springboot整合百度开源分布式ID生成器UIDGenerator

2024-12-03 02:00

关注

环境:sprinboot2.3.12.RELEASE + uid-generator1.0.0

简介

UidGenerator是Java实现的, 基于Snowflake算法的唯一ID生成器。UidGenerator以组件形式工作在应用项目中, 支持自定义workerId位数和初始化策略, 从而适用于docker等虚拟化环境下实例自动重启、漂移等场景。 在实现上, UidGenerator通过借用未来时间来解决sequence天然存在的并发限制; 采用RingBuffer来缓存已生成的UID, 并行化UID的生产和消费, 同时对CacheLine补齐,避免了由RingBuffer带来的硬件级「伪共享」问题. 最终单机QPS可达600万。

依赖版本:Java8及以上版本, MySQL(内置WorkerID分配器, 启动阶段通过DB进行分配; 如自定义实现, 则DB非必选依赖)

Snowflake算法


Snowflake算法描述:指定机器 & 同一时刻 & 某一并发序列,是唯一的。据此可生成一个64 bits的唯一ID(long)。默认采用上图字节分配方式:

以上参数均可通过Spring进行自定义

CachedUidGenerator

RingBuffer环形数组,数组每个元素成为一个slot。RingBuffer容量,默认为Snowflake算法中sequence最大值,且为2^N。可通过boostPower配置进行扩容,以提高RingBuffer 读写吞吐量。

Tail指针、Cursor指针用于环形数组上读写slot:

 CachedUidGenerator采用了双RingBuffer,Uid-RingBuffer用于存储Uid、Flag-RingBuffer用于存储Uid状态(是否可填充、是否可消费)

由于数组元素在内存中是连续分配的,可最大程度利用CPU cache以提升性能。但同时会带来「伪共享」FalseSharing问题,为此在Tail、Cursor指针、Flag-RingBuffer中采用了CacheLine 补齐方式。


RingBuffer填充时机

以上为百度的官方介绍,接下来我们将其整合到Springboot项目中

UIDGenerator下载

在下面地址下载uid-generator


UIDGenerator环境配置

创建表

  1. DROP TABLE IF EXISTS WORKER_NODE; 
  2. CREATE TABLE WORKER_NODE 
  3.   ID BIGINT NOT NULL AUTO_INCREMENT COMMENT 'auto increment id'
  4.   HOST_NAME VARCHAR(64) NOT NULL COMMENT 'host name'
  5.   PORT VARCHAR(64) NOT NULL COMMENT 'port'
  6.   TYPE INT NOT NULL COMMENT 'node type: ACTUAL or CONTAINER'
  7.   LAUNCH_DATE DATE NOT NULL COMMENT 'launch date'
  8.   MODIFIED TIMESTAMP NOT NULL COMMENT 'modified time'
  9.   CREATED TIMESTAMP NOT NULL COMMENT 'created time'
  10.   PRIMARY KEY(ID) 
  11. )COMMENT='DB WorkerID Assigner for UID Generator',ENGINE = INNODB; 

 将其项目中的mapper.xml文件copy到自己项目中,对应的WorkerNodeEntity,WorkerNodeDAO,

DisposableWorkerIdAssigner都copy到自己的项目中。

DisposableWorkerIdAssigner主要是修改注入的dao,因为这里我们需要修改默认的dao相关的配置。

项目配置

依赖

  1.  
  2.   mysql 
  3.   mysql-connector-java 
  4.   runtime 
  5.  
  6.  
  7.   org.mybatis.spring.boot 
  8.   mybatis-spring-boot-starter 
  9.   2.1.4 
  10.  
  11.  
  12.   com.github.pagehelper 
  13.   pagehelper-spring-boot-starter 
  14.   1.3.0 
  15.  

mybatis配置

  1. pagehelper: 
  2.   helperDialect: mysql 
  3.   reasonable: true 
  4.   pageSizeZero: true 
  5.   offsetAsPageNum: true 
  6.   rowBoundsWithCount: true 
  7. --- 
  8. mybatis: 
  9.   type-aliases-package: com.pack.domain 
  10.   mapper-locations: 
  11.   - classpath:/mappers/*.xml 
  12.   configuration: 
  13.     lazy-loading-enabled: false 
  14.     aggressive-lazy-loading: false  

 mapper文件中的namespace及对应domain修改为自己路径下的。

配置UIDGenerator

  1. @Configuration 
  2. public class UIDConfig { 
  3.      
  4.     @Bean 
  5.     public DefaultUidGenerator defaultUidGenerator(DisposableWorkerIdAssigner disposableWorkerIdAssigner) { 
  6.         DefaultUidGenerator defaultUidGenerator = new DefaultUidGenerator() ; 
  7.         defaultUidGenerator.setWorkerIdAssigner(disposableWorkerIdAssigner) ; 
  8.         defaultUidGenerator.setTimeBits(29) ; 
  9.         defaultUidGenerator.setWorkerBits(21) ; 
  10.         defaultUidGenerator.setSeqBits(13) ; 
  11.         defaultUidGenerator.setEpochStr("2021-01-01") ; 
  12.         return defaultUidGenerator ; 
  13.     } 
  14.  

 注意这里的

DisposableWorkerIdAssigner是copy到自己项目中的,不是百度提供的。

  1. @Component 
  2. public class DisposableWorkerIdAssigner implements WorkerIdAssigner { 
  3.   @Resource 
  4.   private WorkerNodeMapper workerNodeDAO; 
  5.   // other code 

 到此所有的都配置完成了。

测试

  1. @Resource 
  2. private DefaultUidGenerator uidGenerator ; 
  3.      
  4. @Test 
  5. public void testGeneratorId() { 
  6.   for (int i = 0; i < 10; i++) { 
  7.     System.out.println(uidGenerator.getUID()) ; 
  8.   } 


完毕!!!

 

来源:今日头条内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯