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代码。
值得开心的是,开发完成不久就真实的帮助了一位小伙伴,也感谢小伙伴对华为的信任与支持。
- 点赞
- 收藏
- 关注作者
评论(0)