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)函数中的参数,如下所示:
- package com.alibaba.nacos.plugin.datasource.enums;
- import java.util.HashMap;
- import java.util.Map;
- public enum TrustedPostgreSqlFunctionEnum {
- /**
- * NOW().
- */
- NOW("NOW()", "NOW()");
- private static final Map<String, TrustedPostgreSqlFunctionEnum> LOOKUP_MAP = new HashMap<>();
- static {
- for (TrustedPostgreSqlFunctionEnum entry : TrustedPostgreSqlFunctionEnum.values()) {
- LOOKUP_MAP.put(entry.functionName, entry);
- }
- }
- private final String functionName;
- private final String function;
- TrustedPostgreSqlFunctionEnum(String functionName, String function) {
- this.functionName = functionName;
- this.function = function;
- }
- /**
- * Get the function name.
- *
- * @param functionName function name
- * @return function
- */
- public static String getFunctionByName(String functionName) {
- TrustedPostgreSqlFunctionEnum entry = LOOKUP_MAP.get(functionName);
- if (entry != null) {
- return entry.function;
- }
- throw new IllegalArgumentException(String.format("Invalid function name: %s", functionName));
- }
- }
复制代码 3.5 修改ConfigInfoMapperByPostgresql组件
在该类中新增一个构造函数即可,如下所示:
- public class ConfigInfoMapperByPostgresql extends BaseConfigInfoMapper {
-
- /**
- * 解决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)
- */
- @Override
- public String getFunction(String functionName)
- {
- return TrustedPostgreSqlFunctionEnum.getFunctionByName(functionName);
- }
-
- @Override
- public String getDataSource() {
- return DatabaseTypeConstant.POSTGRESQL;
- }
-
- }
复制代码 从源码历史更新对比可以看到,的确只新增了一个构造函数,如下图赤色框所示:
- public String getFunction(String functionName)
- {
- return TrustedPostgreSqlFunctionEnum.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!!
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |