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

打印 上一主题 下一主题

主题 684|帖子 684|积分 2052


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)函数中的参数,如下所示:
  1. package com.alibaba.nacos.plugin.datasource.enums;
  2. import java.util.HashMap;
  3. import java.util.Map;
  4. public enum TrustedPostgreSqlFunctionEnum {
  5.     /**
  6.      * NOW().
  7.      */
  8.     NOW("NOW()", "NOW()");
  9.     private static final Map<String, TrustedPostgreSqlFunctionEnum> LOOKUP_MAP = new HashMap<>();
  10.     static {
  11.         for (TrustedPostgreSqlFunctionEnum entry : TrustedPostgreSqlFunctionEnum.values()) {
  12.             LOOKUP_MAP.put(entry.functionName, entry);
  13.         }
  14.     }
  15.     private final String functionName;
  16.     private final String function;
  17.     TrustedPostgreSqlFunctionEnum(String functionName, String function) {
  18.         this.functionName = functionName;
  19.         this.function = function;
  20.     }
  21.     /**
  22.      * Get the function name.
  23.      *
  24.      * @param functionName function name
  25.      * @return function
  26.      */
  27.     public static String getFunctionByName(String functionName) {
  28.         TrustedPostgreSqlFunctionEnum entry = LOOKUP_MAP.get(functionName);
  29.         if (entry != null) {
  30.             return entry.function;
  31.         }
  32.         throw new IllegalArgumentException(String.format("Invalid function name: %s", functionName));
  33.     }
  34. }
复制代码
3.5 修改ConfigInfoMapperByPostgresql组件

在该类中新增一个构造函数即可,如下所示:
  1. public class ConfigInfoMapperByPostgresql extends BaseConfigInfoMapper {
  2.    
  3.     /**
  4.      * 解决NOW(integer)错误问题
  5.      * @author sinhy
  6.      * @since 2024-07-23 00:00
  7.      * @param functionName
  8.      * @return
  9.      * @see com.alibaba.nacos.plugin.datasource.impl.mysql.AbstractMapperByMysql#getFunction(java.lang.String)
  10.      */
  11.     @Override
  12.     public String getFunction(String functionName)
  13.     {
  14.         return TrustedPostgreSqlFunctionEnum.getFunctionByName(functionName);
  15.     }
  16.    
  17.     @Override
  18.     public String getDataSource() {
  19.         return DatabaseTypeConstant.POSTGRESQL;
  20.     }
  21.    
  22. }
复制代码
从源码历史更新对比可以看到,的确只新增了一个构造函数,如下图赤色框所示:
  1.     public String getFunction(String functionName)
  2.     {
  3.         return TrustedPostgreSqlFunctionEnum.getFunctionByName(functionName);
  4.     }
复制代码

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企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

星球的眼睛

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表