1. 背景
自前段时间,发表的一篇博文“Nacos-2.4.0最新版本docker镜像,兼容postgresql最新版本17和16”
有网友在评论区叫我出个修改源码的过程,今天就给大家简单分享一下关于“Nacos最新版(2.4.0)的postgresql插件适配修改方法”
2. PostgreSQL插件不可用的根因分析
在新版本中,或以往部分版本中,nacos组件总是不能在postgresql数据库下正常运行,这是为什么呢?
其实,nacos的postgresql插件默认情况下大部分功能是支持的!只有需要用到nacos配置中心去管理配置时,基于postgresql插件才不能正常创建配置,以及不能正常显示配置列表!
根本原因在于,当使用nacos配置中心在添加一个配置的时候,这条记录要保存一个创建时间,然后代码里面用到一个叫NOW(3) 的sql函数,因为nacos默认是以mysql为主要存储去开发的,mysql里是支持NOW(3) sql函数的。而其它数据库如postgresql等不支持带参数的now函数,致使postgresql无法正常运行。
NOW(3) sql函数的功能主要是用于获取一个带3位数的毫秒时间戳。即在数据库的timestamp字段里面存储的时间,除了年月日时分秒以外,还会带3位数毫秒时间戳。
3. PostgreSQL插件适配源码修改
3.1 首先下载源码
Nacos最新版(2.4.0)的postgresql插件源码地址(注意分支选择,根据更新时间判断,一定要选择最新分支):
https://github.com/nacos-group/nacos-plugin.git
下载下来后,目录结构如下:
3.2 用eclipse或idea打开
打开工程后,我们进入datasource插件目录,找到我们需要修改的postgresql数据库插件,只需要新增一个enum文件以及修改一个类即可完成Nacos最新版的postgresql插件正常适配。
3.3 修改父工程的pom文件
如下图,进入父工程目录下,找到pom.xml文件。
将properties里面的alibaba-nacos.version从2.3.0改成2.4.0。这一步很关键,否则后面打包会失败!
3.4 新增枚举TrustedPostgreSqlFunctionEnum
将新增的枚举放入enums包下,该枚举主要是用于覆盖mysql的NOW(3)函数,因为该函数只有mysql才支持,postgresql等数据库不支持,因此需要去掉NOW(3)函数中的参数,如下所示:
packagecom.alibaba.nacos.plugin.datasource.enums;importjava.util.HashMap;importjava.util.Map;publicenumTrustedPostgreSqlFunctionEnum{/**
* NOW().
*/NOW("NOW()","NOW()");privatestaticfinalMap<String,TrustedPostgreSqlFunctionEnum>LOOKUP_MAP=newHashMap<>();static{for(TrustedPostgreSqlFunctionEnum entry :TrustedPostgreSqlFunctionEnum.values()){LOOKUP_MAP.put(entry.functionName, entry);}}privatefinalString functionName;privatefinalString function;TrustedPostgreSqlFunctionEnum(String functionName,String function){this.functionName = functionName;this.function = function;}/**
* Get the function name.
*
* @param functionName function name
* @return function
*/publicstaticStringgetFunctionByName(String functionName){TrustedPostgreSqlFunctionEnum entry =LOOKUP_MAP.get(functionName);if(entry !=null){return entry.function;}thrownewIllegalArgumentException(String.format("Invalid function name: %s", functionName));}}
3.5 修改ConfigInfoMapperByPostgresql组件
在该类中新增一个构造函数即可,如下所示:
publicclassConfigInfoMapperByPostgresqlextendsBaseConfigInfoMapper{/**
* 解决NOW(integer)错误问题
* @author sinhy
* @since 2024-07-23 00:00
* @param functionName
* @return
* @see com.alibaba.nacos.plugin.datasource.impl.mysql.AbstractMapperByMysql#getFunction(java.lang.String)
*/@OverridepublicStringgetFunction(String functionName){returnTrustedPostgreSqlFunctionEnum.getFunctionByName(functionName);}@OverridepublicStringgetDataSource(){returnDatabaseTypeConstant.POSTGRESQL;}}
从源码历史更新对比可以看到,的确只新增了一个构造函数,如下图红色框所示:
publicStringgetFunction(String functionName){returnTrustedPostgreSqlFunctionEnum.getFunctionByName(functionName);}
4. PostgreSQL插件编译打包
右键子工程“nacos-postgresql-datasource-plugin-ext”使用maven的打包命令clean install,会在target输出jar包
5. PostgreSQL插件部署
将编译好的postgresql插件,拷贝到nacos的plugins目录下,如下图:
6. 总结
好了,以上就是关于nacos最新版本2.4.0支持posgresql数据的适配修改。按照以上方法一步步操作,最终会让nacos最新版2.4.0成功支持postgresql!!
版权归原作者 龙殿殿主 所有, 如有侵权,请联系我们删除。