Leaf适配GaussDB验证过程总结
背景目的
在互联网系统设计开发中,我们需要接口能够达到高性能,高并发和高可用要求,同时需要保证数据的唯一性,传统的数据库自增,uuid等方式无法满足要求,就需要一个性能好,可靠的分布式id组件来解决这个痛点,正好美团Leaf就是其中一个优秀的开源组件。
目前Leaf示例中只写了支持mysql,其它数据库未得到验证,本次任务希望从架构角度出发,修改代码架构,让Leaf能够支持多种数据库,例如GaussDB、openGauss、达梦、人大金仓、南大通用、神舟通用、PostgreSql、MariaDB、SqlServer、oracle等。并以GaussDB作为目标数据库进行验证。
Demo设计
把leaf-boot-starter集成到servicecomb-fence中,前端通过发起调用,service中去获取ID,简单的设计如下:
代码修改
1.扩展支持其它数据库
原始代码只能使用mysql低版本不支持mysql8版本,不能设置驱动名称,这里把驱动名称设置提出到配置文件配置,而不是Druid去猜。
2.驱动依赖修改
因为要支持多数据库,所以驱动引用都提取到leaf-server中,leaf-core中保留mysql驱动的scope为test做单元测试。这里如果大家只使用一种数据库只依赖修改驱动即可,我这里要扩展多数据支持同时构建镜像后续上架镜像仓库方便用户使用,需要依赖多种数据库依赖。对于leaf-boot-starter来说,不引入相关数据库依赖,而在具体的项目中使用时候引入具体数据库依赖。
3.leaf框架版本升级
项目中原始的springboot版本是 2.0.1.RELEASE,spring版本是5.0.5.RELEASE,相关框架过于陈旧了,本次修改决定升级到长期支持版本。当然不升级也能正常扩展其它数据库支持。升级版本如下:
依赖名称\版本 | 旧版本 | 新版本 |
spring | 5.0.5.RELEASE | 6.2.0 |
spring-boot | 2.0.1.RELEASE | 3.4.0 |
JDK | 1.8 | 17 |
mysql-connector-java | 5.1.38 | 8.0.33 |
commons-io | 2.4 | 2.18.0 |
log4j | 2.7 | 2.24.1 |
mybatis-spring | 1.2.5 | 3.0.4 |
junit | 4.12 | 4.13.2 |
maven.compiler | 3.5.1 | 3.13.0 |
curator | 2.6.0 | 5.7.0 |
slf4j | 1.7.2 | 2.0.16 |
druid | 1.0.18 | 1.2.24 |
jackson-databind | 2.9.6 | 2.18.1 |
mybatis-spring | 1.2.5 | 3.0.4 |
sprinboot升级可参考官方支持https://spring.io/projects/spring-boot#support
4.leaf-boot-starter
修改为springboot3版本的自动装配
5.leaf-server中SegmentService和SnowFlakeService修改为Bean初始化,加了条件判断
适配过程
1.本地验证
框架未升级:
先本地测试,引入依赖
<!--gaussdb-->
<dependency>
<groupId>com.huaweicloud.gaussdb</groupId>
<artifactId>opengaussjdbc</artifactId>
<version>503.2.T35</version>
</dependency>
初始化数据脚本,使用mysql脚本修改,其中的bigint和gaussdb的int类型要适配修改
CREATE TABLE `leaf_alloc` (
`biz_tag` varchar(128) NOT NULL DEFAULT '',
`max_id` int8 NOT NULL DEFAULT '1',
`step` int4 NOT NULL,
`description` varchar(256) DEFAULT NULL,
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`biz_tag`)
);
insert into leaf_alloc(biz_tag, max_id, step, description) values('leaf-segment-test', 1, 2000, 'Test leaf Segment Mode Get Id')
本地验证
接口验证
框架升级之后可正常启动运行:
2.云上验证
云上测试分为两部分,一是项目集成leaf-boot-starter验证,二是leaf-server打镜像部署验证。
leaf-boot-starter
- 打包leaf-boot-starter,集成到servicecomb-fence/resource中
- 部署项目
- 初始化脚本
- 接口验证
接口代码
请求结果
leaf-server
创建Dockerfile制作镜像部署leaf
部署
插入一个号段
接口测试
3.验证其它数据库
这一部分我直接在本地跑代码进行验证。首先先把项目打包安装到本地仓库。
引用本地仓库中的leaf-boot-starter
引入测试的驱动依赖
<!--gaussdb-->
<dependency>
<groupId>com.huaweicloud.gaussdb</groupId>
<artifactId>opengaussjdbc</artifactId>
<version>503.2.T35</version>
</dependency>
<!-- /postgresql -->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>42.7.4</version>
</dependency>
<!-- mariadb-java-client -->
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<version>3.5.1</version>
</dependency>
<!-- sqlserver/mssql-jdbc -->
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>mssql-jdbc</artifactId>
<version>12.8.1.jre11</version>
</dependency>
<dependency>
<groupId>com.dameng</groupId>
<artifactId>DmJdbcDriver18</artifactId>
<version>8.1.3.140</version>
</dependency>
PostgreSQL 16.4验证:
脚本和启动参数:
CREATE DATABASE leaf;
CREATE TABLE "public"."leaf_alloc" (
"biz_tag" varchar(128) NOT NULL,
"max_id" int8 NOT NULL,
"step" int4 NOT NULL,
"description" varchar(256) NOT NULL DEFAULT '',
"update_time" timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (biz_tag)
);
insert into leaf_alloc(biz_tag, max_id, step, description) values('leaf-postgres', 1, 2000, 'Test leaf Segment Mode Get Id');
配置启动参数:
--leaf.segment.enable=true
--leaf.segment.driver=org.postgresql.Driver
--leaf.segment.url=jdbc:postgresql://xxx:5432/postgres?currentSchema=public
--leaf.segment.username=root
--leaf.segment.password=123456
验证结果:
Microsoft SQL Server 2022验证:
脚本:
CREATE DATABASE leaf;
CREATE TABLE leaf_alloc (
biz_tag varchar(128) NOT NULL DEFAULT '',
max_id bigint NOT NULL DEFAULT '1',
step int NOT NULL,
description varchar(256) DEFAULT NULL,
update_time ROWVERSION NOT NULL ,
PRIMARY KEY (biz_tag)
);
insert into leaf_alloc(biz_tag, max_id, step, description) values('leaf-sqlserver', 1, 2000, 'Test leaf Segment Mode Get Id')
启动参数:
--leaf.segment.enable=true
--leaf.segment.driver=com.microsoft.sqlserver.jdbc.SQLServerDriver
--leaf.segment.url=jdbc:sqlserver://xxxxx:1433;databaseName=leaf;encrypt=false;trustServerCertificate=true;
--leaf.segment.username=rdsuser
--leaf.segment.password=xxx
验证结果:
MariaDB 10.5.16验证
脚本:
CREATE DATABASE leaf;
CREATE TABLE `leaf_alloc` (
`biz_tag` varchar(128) NOT NULL DEFAULT '',
`max_id` bigint(20) NOT NULL DEFAULT '1',
`step` int(11) NOT NULL,
`description` varchar(256) DEFAULT NULL,
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`biz_tag`)
) ENGINE=InnoDB;
insert into leaf_alloc(biz_tag, max_id, step, description) values('leaf-mariadb', 1000, 2000, 'Test leaf Segment Mode Get Id');
启动参数:
--leaf.segment.enable=true
--leaf.segment.driver=org.mariadb.jdbc.Driver
--leaf.segment.url=jdbc:mariadb://ip:3306/leaf?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=GMT%2B8
--leaf.segment.username=root
--leaf.segment.password=xxxx
验证结果:
达梦数据库验证:
脚本:
CREATE TABLE leaf_alloc (
biz_tag varchar(128) NOT NULL DEFAULT '',
max_id bigint NOT NULL DEFAULT '1',
step int NOT NULL,
description varchar(256) DEFAULT NULL,
update_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (biz_tag)
);
insert into leaf_alloc(biz_tag, max_id, step, description) values('leaf-dm', 1150, 2000, 'Test leaf Segment Mode Get Id')
启动参数:
--leaf.segment.enable=true
--leaf.segment.driver=dm.jdbc.driver.DmDriver
--leaf.segment.url=jdbc:dm://localhost:5236
--leaf.segment.username=SYSDBA
--leaf.segment.password=xxxx
验证结果:
总结
通过修改代码成功的适配了GaussDB,Mysql8,Sqlserver,MariaDB,达梦等数据库,可以看出只要支持jdbc驱动的数据库理论都可以适配,差异在于脚本的数据类型等会有些区别,如果要适配上述之外的数据库可自行实验。
本地测试都是依赖本地仓库中的jar包,后续验证之后会发布release版本到maven仓库,敬请期待。
- 点赞
- 收藏
- 关注作者
评论(0)