Nacos-2.2.3版本适配人大金仓数据库

本文介绍了如何在Nacos2.2.3版本中使用PostgreSQL插件的基础上,对代码进行修改以支持人大金仓(Kingbase8)数据库。涉及数据库表初始化、源码调整、Docker部署和配置调整等内容,以及遇到的问题和解决方案。
摘要由CSDN通过智能技术生成


背景

项目采用Nacos+SpringCloudGateway作为注册中心和网关,PostgreSQL作为数据库。后续需要兼容国产化数据库,选用了人大金仓数据库,但Nacos也不支持使用金仓作为外部数据源。
好在金仓与pg的语法几乎相同,可以直接套用pg插件的大部分内容。
以下先介绍pg插件的使用,再说明适配金仓的插件在其基础上需要改动的地方和插件具体使用时遇到的问题。
以下内容仅支持2.2版本Nacos,2.3.0及以后的Nacos在自定义插件里Mapper实现上有较大变动,需要自行适配。


以下Nacos均为Docker镜像部署,因此改application.properties配置需要通过Dockerfile出新镜像完成

Nacos 2.2.3版本PostgreSQL数据源插件

原文参考:CSDN
原文github链接: github
这里忽略安装pg的部分。

数据库表初始化

由于插件无法自动初始化Nacos需要的数据库表,这部分工作需要自己手动完成,或者放到数据库的初始化脚本里执行。
参考脚本:数据库sql脚本
因为pg跟金仓的相似性,可以直接使用pg的脚本初始化金仓的数据库表

插件引入

下载插件: pg数据源插件
将该jar包放入到Nacos的plugins目录下,Nacos的启动脚本中loader.path参数将会将在外部jar包文件到Nacos的环境中。
修改Nacos的conf文件夹application.properties文件,增加postgresql的连接参数信息。
由于我使用的是Docker镜像部署,这里采取Dockerfile形式将插件jar包更新至镜像里的plugins目录吗,以及更新配置文件。
参考Dockerfile

FROM xxxx/nacos-origin:2.2.3
COPY application.properties /home/nacos/conf/application.properties
COPY ./plugins /home/nacos/plugins
ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8
EXPOSE 8848

Nacos启动测试

启动

在Docker中采用以下命令启动Nacos
sudo docker run -d --name nacos-pg -p 8848:8848 -e PREFER_HOST_MODE=hostname -e MODE=standalone nacos-pg:2.2.3
查看容器日志

sudo docker ps
sudo docker logs xxx -f

无报错会在日志里打印Nacos started successfully in stand alone mode. use external storage.

数据测试

  1. 数据库表是否初始化成功。
  2. 登录到nacos的控制台,然后新建配置,数据库中是否增加相应数据。

Nacos 2.2.3版本Kingbase8数据源插件

以下介绍如何在pg插件基础上编译打包自己的Kingbase8插件。

修改源码

下载上述GitHub里插件源码,修改下列几个文件:

nacos-datasource-plugin-ext-base

DatabaseTypeConstant
String POSTGRESQL = "postgresql";
//改为
String KINGBASE = "kingbase8";

nacos-postgresql-datasource-plugin-ext

PostgresqlDatabaseDialect

类名修改KingbaseDatabaseDialect

public String getType() {
        return DatabaseTypeConstant.POSTGRESQL;
    }
//改为
public String getType() {
        return DatabaseTypeConstant.KINGBASE;
    }
impl/postgresql

目录下所有mapper实现中DatabaseTypeConstant.POSTGRESQL改为DatabaseTypeConstant.KINGBASE

resources/META-INF/services

DatabaseDialect

PostgresqlDatabaseDialect改为KingbaseDatabaseDialect

pom.xml

加上kingbase的依赖

插件打包

要注意不能打fatjar,可能会导致mapper识别不到datasource。
打包时可以使用idea的Artifacts灵活选择打包内容,打包插件代码和kingbase8依赖。

Nacos配置文件

使用上面提到的Dockerfile更新Nacos配置文件和插件包

spring.sql.init.platform=kingbase8
spring.datasource.platform=kingbase8
db.num=1
db.url.0=jdbc:kingbase8://127.0.0.1:5432/test
db.user=postgres
db.password=postgres
db.pool.config.driverClassName=com.kingbase8.Driver

Nacos启动

参考上面提到的启动方式。

启动可能遇到的问题

[MapperManager] Failed to find the datasource,dataSource:“kingbase8”

可能是MapperManager无法识别到插件里正确的类,导致数据源识别失败。
打包时避免打fat jar,手动打thin jar可解决。

No datasource set
  1. 检查Nacos数据库连接配置是否正确。
  2. 检查Nacos镜像内配置是否正确更新。
  3. 检查数据库是否能正确远程连接。
  4. 拉取Nacos镜像内启动失败日志,
    命令参考:docker cp xxxx:/home/nacos/logs ./nacos-logs 其中xxxx代表容器id。在拷贝出来的错误日志里,主要看config-fatal.log日志文件
    这里我遇到的问题是client_encoding不正确,报错invalid value for parameter "client_encoding": "ansi_x3.4-1968"
    查询后得知kingbase8在连接时获取了容器的jvm_encoding来设置client_encoding,通过Dockerfile设置容器的jvm_encoding即可。
    ENV JAVA_TOOL_OPTIONS -Dfile.encoding=UTF8

后记

Nacos具体使用时出问题,需要查日志看原因是否为语法不兼容。如果是,需要修改插件里相应Mapper的内容。
如果需要升级Nacos到目前最新的2.3.0版本,由于Nacos提供的自定义插件模块接口发生较大变化,需要重新实现Mapper类。


总结

本文主要是在Nacos2.2.3版本,基于前辈的博客和开源插件,修改完成了自己的kingbase8插件,不需要修改Nacos源码就能支持外部数据源国产化。在部署时遇到了一些问题,通过查日志和搜索引擎一一解决。

  • 15
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值