Leaf适配GaussDB验证过程总结

举报
纷纷扰扰 发表于 2024/12/09 23:51:12 2024/12/09
【摘要】 在互联网系统设计开发中,我们需要接口能够达到高性能,高并发和高可用要求,同时需要保证数据的唯一性,传统的数据库自增,uuid等方式无法满足要求,就需要一个性能好,可靠的分布式id组件来解决这个痛点,正好美团Leaf就是其中一个优秀的开源组件。 目前Leaf示例中只写了支持mysql,其它数据库未得到验证,本次任务希望从架构角度出发,修改代码架构,让Leaf能够支持多种数据库。

背景目的

在互联网系统设计开发中,我们需要接口能够达到高性能,高并发和高可用要求,同时需要保证数据的唯一性,传统的数据库自增,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仓库,敬请期待。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。