欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 旅游 > Nacos-2.4.0最新版本,postgresql插件适配器修改分享

Nacos-2.4.0最新版本,postgresql插件适配器修改分享

2024/10/24 10:16:11 来源:https://blog.csdn.net/lilinhai548/article/details/140924213  浏览:    关键词:Nacos-2.4.0最新版本,postgresql插件适配器修改分享

在这里插入图片描述

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 新增枚举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.4 修改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)*/@Overridepublic String getFunction(String functionName){return TrustedPostgreSqlFunctionEnum.getFunctionByName(functionName);}@Overridepublic 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!!

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com