Nacos适配Gaussdb

举报
yd_282553764 发表于 2024/11/05 20:15:32 2024/11/05
【摘要】 Nacos适配Gaussdb

最近在开源社区做贡献,发现Nacos不能连接Gaussdb进行存储配置信息。于是产生了给Nacos适配Gaussdb的想法。现在记录一下步骤和当时遇到的问题。

首先展示一下我的成果,喜欢的朋友,点个star吧。

有问题可以联系我:sweetwuxiaomei@qq.com

nacos plugin插件仓库

git信息:https://github.com/SweetWuXiaoMei/nacos-plugin

分支:dev_czd_guassdb

demo地址仓库:

git信息:https://gitcode.com/chenzhida/servicecomb-fence/overview

分支:dev_czd_nacos

不想直接看具体适配过程的,可以直接看适配流程:  https://bbs.huaweicloud.cn/blogs/438948

步骤1:fork 仓库

主要是两个仓库:nacos 仓库,nacos plugin的仓库。

nacos源仓库:https://github.com/alibaba/nacos

nacos plugin源仓库:https://github.com/nacos-group/nacos-plugin

步骤2:分析并理解nacos plugin仓库的源码结构并开发

首先切换到develop分支,这里个人不是很理解的是,nacos plugin是基于nacos的snapshot的版本,而不是基于一个稳定版。首先是将其改成基于nacos的最新release版。

由于我只关注数据的部分,所以主要是看nacos-datasource-plugin-ext这个模块,里面分为好几个模块,其中有oracle的,postgresql的等等。因为opengauss是基于postgresql衍生出来的。所以,直接拷贝postgresql的插件库,进行修改。

  • 将项目名改成nacos-opengauss-datasource-plugin-ext
  • 修改pom文件,将artifactId改为nacos-opengauss-datasource-plugin-ext
  • 引入opengauss的驱动
<dependency>
            <groupId>org.opengauss</groupId>
            <artifactId>opengauss-jdbc</artifactId>
            <version>5.1.0-og</version>
</dependency>
  • 在父模块中引入module
<module>nacos-opengauss-datasource-plugin-ext</module>
  • 在主配置文件中,修改nacos的依赖,因为是snapshot,所以改成当前nacos master分支的最新版本,后面我也是基于nacos master分支进行相应的修改的。
<alibaba-nacos.version>2.4.3</alibaba-nacos.version>
  • 这里有点坑。当改成正式版本之后,发现oracle仓库报错。是getFunction方法没有实现。就算是开发插件,也不基于一个稳定版开发。暂时先不管它了。

  • nacos plugin开发,主要是实现以下几个接口。当然nacos plugin的仓库对一些操作进行了一些封装。接口如下
ConfigInfoAggrMapper
ConfigInfoBetaMapper
ConfigInfoMapper
ConfigInfoTagMapper
ConfigTagsRelationMapper
GroupCapacityMapper
HistoryConfigInfoMapper
TenantCapacityMapper
TenantInfoMapper

添加一些不重要的变量

看似好像是没什么能改的了。先这样,mvn clean install 以下。下面准备nacos的环境

步骤3:nacos仓库执行install

执行mvn clean install不成功,遂查找官网如何开发插件。找到这篇文章(https://nacos.io/docs/latest/plugin/datasource-plugin/),命令是mvn -B clean package install -Dmaven.test.skip=true。

但是天不遂人愿,执行失败。按照文档提示,更新maven最新版本到3.9.9,依然失败。这里就不展示错误了。然后按照自己的经验,失败一个就忽略一个。依然失败。按照我之前给servicbomb提交代码的经验。此时mvn在执行时,会提交-p的很多属性,然后在查找源代码中,还真的被我找到了。最终能将nacos mvn install成功的命令是

mvn -B -U -Prelease-nacos clean install -Dmaven.test.skip=true -Drat.skip=true -Denforcer.skip=true

这里会在distribution包下面得到一个target文件夹,里面的nacos-server文件夹下有可以直接运行的文件。这里来一个小插曲:如何在release包中运行插件。

还有一个问题是:我本地的jdk是21,nacos对jdk21是不兼容的。至少运行mvn命令是无法成功,遂改成了jdk1.8

步骤3-小插曲:如何在release包中运行插件

在nacos-server-2.4.3(mvn install之后的文件夹)的文件夹下,新建plugins的文件夹,然后将步骤2 mvn install的jar包放入plugins目录下,同时修改nacos-server-2.4.3/conf/application.properties,添加属性如下:

spring.datasource.platform=gaussdb
db.num=1
db.url.0=jdbc:opengauss://ip:port/postgres?currentSchema=nacos
db.user=root
db.password=pwd
db.pool.config.driverClassName=org.opengauss.Driver

这样就可以运行了。但是这不是我的目的,我知道现在肯定有很多的报错在等着我。所以我需要将nacos源代码给启动起来。

步骤4:找启动nacos源代码

nacos的启动类是在console模块下的Nacos类,之前的release包,其实就是Nacos启动类,整个console模块就是一个入口,console的配置文件也等同于release包中的配置文件。所以直接运行。

步骤5:购买华为云Gaussdb&执行opengauss中的sql文件

购买华为云Gaussdb,并且购买公网IP,不然无法访问。配置如下:

产品名称

产品类型

数据库引擎版本

性能规格

实例类型

部署形态

备注

云数据库 GaussDB

基础版

8.201

独享型1:4

集中式

1主2备

推荐

购买完成之后,执行opengauss中的sql文件,由于是copy postgresql过来的。这里其实是一模一样的。

步骤6-1:执行本地Nacos类,并且测试加入值是否能够添加到OpenGauss中-日期格式时间兼容问题

在console模块中修改application.properties,代码如下:

spring.sql.init.platform=gaussdb
db.num=1
db.url.0=jdbc:opengauss://ip:port/com_mysql?currentSchema=nacos
db.user=root
db.password=root
db.pool.config.driverClassName=org.opengauss.Driver

在console模块下pom.xml,添加一下信息:

<dependency>
            <groupId>com.alibaba.nacos</groupId>
            <artifactId>nacos-opengauss-datasource-plugin-ext</artifactId>
            <version>1.0.0</version>
</dependency>

这样就可以通过源码进行debug了,方便多了。启动本Nacos类,chrome执行http://localhost:8848,直接就能打开页面了。点击创建配置,dataId填入test,配置格式选择properties,内容填入,hello:world。点击发布。

不出意外的报错了。是时间类型不匹配。通过debug,找到ConfigOperationService下面的代码

一看就是如果不存在就插入,存在就更新。然后进入实现类(ExternalConfigInfoPersistServiceImpl)。通过查看源码可以发现,是通过jdbcTemplate执行的sql,但是这里的sql是写死的。个人感觉更好的方式是,这里应该将全部的sql逻辑放入plugins的项目中进行管理。在这里打断点,发现的报错是因为日期的格式不对。

它这里的逻辑是,自己生成一个sql,然后日期类型,各个数据库是不一样的。在插件的内部实现中,去覆盖这里的值。然后我去到OpenGauss插件里的日期处理,发现Postgresql使用了Mysql的时间处理类。

于是我整理了一下OpenGauss的代码,把这个依赖给去除了。其实这个问题,在nacos plugin是的issue上有多次提到,但是从来没有被修正过。不止一个人反映过这个问题。

https://github.com/nacos-group/nacos-plugin/issues/48

https://github.com/nacos-group/nacos-plugin/issues/57

将它的代码重新整理一下,有兴趣的朋友可以查看项目代码。Postgresql的插件主要是继承了一些Mysql的类,通过重写来实现不同的逻辑。我把这些不必要的关系都给重新整理一下。并且提供了新的GaussdbFunctionEnum。

步骤6-2:执行本地Nacos类,并且测试加入值是否能够添加到OpenGauss中-OpenGauss的数据库兼容问题

继续测试,发现可以插入了,于是我想更新一下,结果在数据库里面发现了两条数据。这不对呀,按照之前的逻辑,不存在就插入,存在就更新。通过debug,仔细查看插入逻辑,发现在插入时,的确将变量tenant_id设置成了空字符串。但是在数据库中确变成了null。这不符合逻辑呀。于是我查看了Gaussdb的官网,发现OpenGauss其实是有两种兼容模式的,一种是Mysql的兼容模式,一种是Oracle的兼容模式,Mysql的兼容模式是区分null和空白字符串的。Oracle是不区分的。Gaussdb默认是使用了Oracle的模式。于是我调整初始化代码,将tenant_id设置为 not null。这样就提出了一个要求:tenant_id是租户字段(命名空间),在使用nacos opengauss插件时,必须要使用租户。也就是必须要新增如下图的内容。

于是在OpenGauss的插件库中,提供了两种模式的初始化sql,一个是兼容Mysql的,一个是兼容Oracle的。

步骤6-3:执行本地Nacos类,并且测试加入值是否能够添加到OpenGauss中-兼容Oracle模式下必须使用加密

于是接着测试,在使用oracle兼容模式的情况下,进行插入,又报一个错误,说加密失败。通过一顿debug之后,发现tenant_id不为null时,必须要给nacos添加加解密的插件。

开始我在console的项目中添加nacos-aes-encryption-plugin插件,运行良好,然后既然OpenGauss插件和nacos-aes-encryption-plugin插件是必须捆绑在一起的,可以在OpenGauss的plugin项目中,集成nacos-aes-encryption-plugin。在更新进去之后,完美运行。

值得注意的一点是,加密插件对dataId的名称有要求,要以cipher-加密算法开头,插件中只有aes,所以只能用aes。以resource-server为例,加密的dataId是,cipher-aes-resource-server。

步骤7:在servicecomb-fence项目中调用nacos

servicecomb(https://github.com/apache/servicecomb-java-chassis)是华为一个微服务集成开发框架,里面集成了各种微服务的优秀的最佳解决方案。fence是一个基于servicecomb的demo项目,里面可以轻松集成各项开源软件,例如etcd,nacos,还有rpc方案,以及api 网关方案。值得注意的是,在fence的配置文件中,environment相当于是一个nacos中的命名空间id。添加servicecomb中的nacos包。并进行如下配置,新增接口,就可以了。

配置文件:

servicecomb:
  service:
    application: scb-fence
    name: resource-server
    version: 0.0.1
    # 命名空间id
    environment: 5b7b78d5-0566-4aea-a682-d4e896236019  

  # nacos相关配置
  nacos:
    dataId: scb-fence
    group: resource-server
    serverAddr: http://127.0.0.1:8848

hello: world

pom.xml

<dependency>
      <groupId>org.apache.servicecomb</groupId>
      <artifactId>config-nacos</artifactId>
</dependency>

步骤7:测试结果

首先启动fence项目调用api:http://110.41.135.13:9092/resource/v1/auth/handler/hello,运行如下图所示

在nacos server修改配置内容hello:world1,再次调用api,如下图所示。

至此,项目完成。

步骤8:在华为云上测试

购买两台ecs,一台部署nacos,一台部署fence,配置如下:

产品名称 CPU架构 实例类型 公共镜像 镜像版本 备注
弹性云服务器 鲲鹏计算 鲲鹏通用计算增强型 Huawei Cloud EulerOS Huawei Cloud EulerOS 2.0 标准版 64位 ARM版(10GiB) 推荐

总共有三台服务器,一台OpenGauss,两台ecs,注意都要在同一个vpc(华为云网络隔离方案,相当于是一个子网)。

步骤9:修改OpenGauss plugin的仓库版本为正式版1.0.0

步骤10:提交pr,将OpenGauss的plugin代码提交到nacos plugin仓库中

将OpenGauss的plugin代码提交到nacos plugin仓库中,因为Postgresql的插件库和OpenGauss很相似,后面有空改一下Postgresql的plugin代码。

值得开心的是,开发完成不久就真实的帮助了一位小伙伴,也感谢小伙伴对华为的信任与支持。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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