UidGenerator适配GaussDB开源开发总结
简介: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注解
-
接口返回,如下信息:
- 点赞
- 收藏
- 关注作者
评论(0)