Nacos - 支持PostgreSQL

1、背景

Nacos 官方仅支持 MySQL,故需要自己魔改一下。

2、下载源码

源码下载地址:

GitHub - alibaba/nacos: an easy-to-use dynamic service discovery, configuration and service management platform for building cloud native applications.

官网教程地址:

https://nacos.io/zh-cn/docs/qui

3、源码修改

3.1  引入PostgreSQL驱动

nacos-all中添加依赖

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>42.2.20</version>
</dependency>

nacos-config下的pom.xml

<!--postgresql libs-->
<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
</dependency>

3.2 修改数据库配置

nacos-consloe下的application.properties

# 是否使用外置数据库,直接mysql就等于是使用外置数据库,使用什么数据库则由db.jdbcDriverName决定
spring.datasource.platform=mysql

### Count of DB:
db.num=1
# 新增的配置项,指定数据库驱动
db.jdbcDriverName=org.postgresql.Driver
db.url.0=jdbc:postgresql://localhost:5432/nacos
db.user.0=postgres
db.password.0=postgres

3.3 修改com.alibaba.nacos.config.server.service.datasource.ExternalDataSourceProperties

可通过配置文件指定数据库驱动。

类中新增对应配置文件中的字段和set方法。

private String jdbcDriverName;

public void setJdbcDriverName(String jdbcDriverName) {
    this.jdbcDriverName = jdbcDriverName;
}

对List<HikariDataSource> build(Environment environment, Callback<HikariDataSource> callback)方法进行修改

List<HikariDataSource> build(Environment environment, Callback<HikariDataSource> callback) {
    // ...
    for (int index = 0; index < num; index++) {
        // ...
        if (StringUtils.isNotEmpty(jdbcDriverName)) {
            // 增加对postgresql数据库的支持
            poolProperties.setDriverClassName(jdbcDriverName);
        } else {
            // 默认使用mysql驱动
            poolProperties.setDriverClassName(JDBC_DRIVER_NAME);
        }
        // ...
    }
    // ...
}

3.4 修改com.alibaba.nacos.config.server.service.repository.extrnal.ExternalStoragePersistServiceImpl

修改addConfigInfoAtomic方法。

public long addConfigInfoAtomic(final long configId, final String srcIp, final String srcUser,
            final ConfigInfo configInfo, final Timestamp time, Map<String, Object> configAdvanceInfo) {
    // 2057行
    
    
    // 2099行,注释掉Number nu = keyHolder.getKey();,更换为以下内容
    // Number nu = keyHolder.getKey();
    // 捕获InvalidDataAccessApiUsageException异常
    Number nu = null;
    try {
        nu = keyHolder.getKey();
    } catch (InvalidDataAccessApiUsageException e) {
        List<Map<String, Object>> keyList = keyHolder.getKeyList();
        if (keyList.size() > 0) {
            Iterator<Object> keyIter = keyList.get(0).values().iterator();
            if (keyIter.hasNext()) {
                Object key = keyIter.next();
                if (!(key instanceof Number)) {
                    throw new DataRetrievalFailureException(
                            "The generated key is not of a supported numeric type. " + "Unable to cast [" + (
                                    key != null ? key.getClass().getName() : null) + "] to ["
                                    + Number.class.getName() + "]");
                }
                nu = (Number) key;
            }
        }
    }
    // ...
}

3.5 特殊 sql 脚本适配改造

修改com.alibaba.nacos.config.server.service.repository.extrnal.ExternalStoragePaginationHelperImpl

修改fetchPage方法。 代码在 96 行。

// selectSql = sqlFetchRows + " LIMIT " + startRow + "," + pageSize;
// 修改为支持postgresql
selectSql = sqlFetchRows + " limit " + pageSize + " offset " + startRow;

3.6 全局替换

利用工具进行全局替换,将所有limit ?,? 替换为 offset ? limit ?。兼容 mysql 和 postgresql

4、本地源码启动

启动类:com.alibaba.nacos.Nacos

单机启动需配参数:-Dnacos.standalone=true

5、重新编译、运行

编译命令:

mvn -Prelease-nacos -Dmaven.test.skip=true -Dpmd.skip=true -Dcheckstyle.skip=true -Drat.skip=true clean install -U

成功后,编译好的文件路径:

nacos-all\distribution\target...

此时,nacos 已支持 postgresql 数据库。

单机启动命令:

sh startup.sh -m standalone
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值