UidGenerator适配GaussDB开源开发总结
【摘要】 UidGenerator是Java实现的, 基于Snowflake算法的唯一ID生成器。本文提供了一种使用GaussDB存储worker node的方法
简介:UidGenerator是Java实现的, 基于Snowflake算法的唯一ID生成器。
UidGenerator以组件形式工作在应用项目中, 支持自定义workerId位数和初始化策略,
从而适用于docker等虚拟化环境下实例自动重启、漂移等场景。
在实现上, UidGenerator通过借用未来时间来解决sequence天然存在的并发限制;
采用RingBuffer来缓存已生成的UID, 并行化UID的生产和消费,
同时对CacheLine补齐,避免了由RingBuffer带来的硬件级「伪共享」问题. 最终单机QPS可达600万
适配过程
-
在github fork baidu/uid-generator 代码,并下载
-
根据需要集成 uid-generator 项目的需求,修改pom文件,例如:mybatis、spring的版本
-
打包 uid-generator
-
在项目中引入 uid-generator ,过程如下:
- 在项目根目录下新建lib目录,将打包好的uid-generator jar包复制进来,修改项目pom,如下
<dependency> <groupId>com.baidu.fsg</groupId> <artifactId>uid-generator</artifactId> <version>1.0.0-SNAPSHOT</version> <scope>system</scope> <systemPath>${project.basedir}/lib/uid-generator-1.0.0-SNAPSHOT.jar</systemPath> </dependency> 在build中修改plugin配置: <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <includeSystemScope>true</includeSystemScope> </configuration> </plugin>
- 添加spring-boot-starter-jdbc、opengauss等其它依赖
- 在项目根目录下新建lib目录,将打包好的uid-generator jar包复制进来,修改项目pom,如下
-
拷贝 uid-generator的mybatis xml文件,结构如下
mysql存放原有的xml,gaussdb存放gauss的xml,修改两个xml配置
-
复制 uid-generator源码:DisposableWorkerIdAssigner.java、WorkerNodeDAO.java到项目目录下
-
新建配置类,部分代码如下
- mybatis配置
@Primary @Bean public SqlSessionFactory sqlSessionFactory(final DataSource dataSource) throws Exception { SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean(); sqlSessionFactoryBean.setDataSource(dataSource); ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); try { DatabaseMetaData metaData = dataSource.getConnection().getMetaData(); String databaseProductName = metaData.getDatabaseProductName().toLowerCase(); logger.info("===>database product name is {}", databaseProductName); String xmlPath = XmlPathSelectFactory.selectXmlPath(databaseProductName).selectXmlPath(); sqlSessionFactoryBean.setMapperLocations(resolver.getResources(xmlPath)); return sqlSessionFactoryBean.getObject(); } catch (Exception e) { logger.error(e.getMessage(), e); } return null; }
- UidGenerator 配置:
@Bean @ConditionalOnMissingBean public WorkerIdAssigner disposableWorkerIdAssigner() { return new DisposableWorkerIdAssigner(); } @Bean @ConditionalOnMissingBean @Lazy public UidGenerator uidGenerator() { CachedUidGenerator cachedUidGenerator = new CachedUidGenerator(); cachedUidGenerator.setWorkerIdAssigner(disposableWorkerIdAssigner()); cachedUidGenerator.setScheduleInterval(60); cachedUidGenerator.setWorkerBits(15); cachedUidGenerator.setSeqBits(16); cachedUidGenerator.setTimeBits(32); cachedUidGenerator.setEpochStr("2022-01-01"); return cachedUidGenerator; }
DEMO开发
-
在resource-server中开发 /v1/uid/create 接口
-
在接口的实现中调用:
@Autowired private UidGenerator uidGenerator; @Override public String getUID() { long uid = uidGenerator.getUID(); return uidGenerator.parseUID(uid); }
-
在启动类添加MapperScan注解
-
接口返回,如下信息:
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)