作者:FastCoder 2021-07-14 07:17:37
开发
前端
分布式 UidGenerator是Java实现的, 基于Snowflake算法的唯一ID生成器。UidGenerator以组件形式工作在应用项目中, 支持自定义workerId位数和初始化策略, 从而适用于docker等虚拟化环境下实例自动重启、漂移等场景。
江川网站制作公司哪家好,找创新互联!从网页设计、网站建设、微信开发、APP开发、成都响应式网站建设公司等网站项目制作,到程序开发,运营维护。创新互联从2013年成立到现在10年的时间,我们拥有了丰富的建站经验和运维经验,来保证我们的工作的顺利进行。专注于网站建设就选创新互联。
环境: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算法描述:指定机器 & 同一时刻 & 某一并发序列,是唯一的。据此可生成一个64 bits的唯一ID(long)。默认采用上图字节分配方式:
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 补齐方式。
以上为百度的官方介绍,接下来我们将其整合到Springboot项目中
在下面地址下载uid-generator
创建表
- 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;
将其项目中的mapper.xml文件copy到自己项目中,对应的WorkerNodeEntity,WorkerNodeDAO,
DisposableWorkerIdAssigner都copy到自己的项目中。
DisposableWorkerIdAssigner主要是修改注入的dao,因为这里我们需要修改默认的dao相关的配置。
mysql mysql-connector-java runtime org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.4 com.github.pagehelper pagehelper-spring-boot-starter 1.3.0
- pagehelper:
- helperDialect: mysql
- reasonable: true
- pageSizeZero: true
- offsetAsPageNum: true
- rowBoundsWithCount: true
- ---
- mybatis:
- type-aliases-package: com.pack.domain
- mapper-locations:
- - classpath:/mappers/*.xml
- configuration:
- lazy-loading-enabled: false
- aggressive-lazy-loading: false
mapper文件中的namespace及对应domain修改为自己路径下的。
- @Configuration
- public class UIDConfig {
- @Bean
- public DefaultUidGenerator defaultUidGenerator(DisposableWorkerIdAssigner disposableWorkerIdAssigner) {
- DefaultUidGenerator defaultUidGenerator = new DefaultUidGenerator() ;
- defaultUidGenerator.setWorkerIdAssigner(disposableWorkerIdAssigner) ;
- defaultUidGenerator.setTimeBits(29) ;
- defaultUidGenerator.setWorkerBits(21) ;
- defaultUidGenerator.setSeqBits(13) ;
- defaultUidGenerator.setEpochStr("2021-01-01") ;
- return defaultUidGenerator ;
- }
- }
注意这里的
DisposableWorkerIdAssigner是copy到自己项目中的,不是百度提供的。
- @Component
- public class DisposableWorkerIdAssigner implements WorkerIdAssigner {
- @Resource
- private WorkerNodeMapper workerNodeDAO;
- // other code
- }
到此所有的都配置完成了。
- @Resource
- private DefaultUidGenerator uidGenerator ;
- @Test
- public void testGeneratorId() {
- for (int i = 0; i < 10; i++) {
- System.out.println(uidGenerator.getUID()) ;
- }
- }
完毕!!!
网页名称:Springboot整合百度开源分布式ID生成器UIDGenerator
转载注明:http://www.mswzjz.cn/qtweb/news26/235176.html
攀枝花网站建设、攀枝花网站运维推广公司-贝锐智能,是专注品牌与效果的网络营销公司;服务项目有等
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 贝锐智能