我是靠谱客的博主 正直板凳,最近开发中收集的这篇文章主要介绍nacos添加PostgreSQL支持背景环境步骤结语,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

nacos添加PostgreSQL支持

  • 背景
  • 环境
  • 步骤
    • 1.下载nacos
    • 2. 添加PostgreSQL
      • ① /pom.xml
      • ② /config/pom.xml
      • ③ /naming/pom.xml
    • 3. 添加PostgreSQL驱动代码
      • ① PropertiesConstant.java
      • ② PropertyUtil.java#loadSetting
      • ③ ExternalDataSourceProperties.java
      • ④ StartingApplicationListener.java
    • 4. 兼容PostgreSQL
      • ① 主键
      • ② LIKE
      • ③ LIMIT
    • 5. BUG处理
    • 6. 配置文件
      • ① application.properties
      • ② nacos-postgresql.sql
  • 结语

背景

由于项目中之前使用的是PostgreSQL,最近要添加nacos作为服务中心与注册中心来使用,可惜nacos不支持PostgreSQL,但又不想因此再引入Mysql增加复杂度。此修改保持了mysql与derby的可用性。

环境

使用nacos2.1.0,让其支持

  • postgresql14.x
  • mysql8.x
  • derby

步骤

1.下载nacos

笔者使用时,最新版是2.1.0,下载

git clone https://github.com/alibaba/nacos.git -b 2.1.0

得到如下文件
nacos项目

2. 添加PostgreSQL

修改共3处:

① /pom.xml

<properties>
···
<postgresql.version>42.3.3</postgresql.version>
···
</properties>

···

<dependency>
    <groupId>org.postgresql</groupId>
    <artifactId>postgresql</artifactId>
    <version>${postgresql.version}</version>
</dependency>

② /config/pom.xml

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

③ /naming/pom.xml

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

3. 添加PostgreSQL驱动代码

① PropertiesConstant.java

public static final String MYSQL = "mysql";

public static final String POSTGRESQL = "postgresql";

② PropertyUtil.java#loadSetting

// postgresql or mysql
final String platform = getString(PropertiesConstant.SPRING_DATASOURCE_PLATFORM, "");
setUseExternalDB(PropertiesConstant.MYSQL.equalsIgnoreCase(platform)
        || PropertiesConstant.POSTGRESQL.equalsIgnoreCase(platform));

③ ExternalDataSourceProperties.java

private static final String JDBC_DRIVER_NAME_MYSQL = "com.mysql.cj.jdbc.Driver";

private static final String JDBC_DRIVER_NAME_POSTGRESQL = "org.postgresql.Driver";

···

#build方法内

//Add PostgreSQL support
String driverClassName = JDBC_DRIVER_NAME_MYSQL;
if (PropertiesConstant.POSTGRESQL.equalsIgnoreCase(
        EnvUtil.getProperty(PropertiesConstant.SPRING_DATASOURCE_PLATFORM))) {
    driverClassName = JDBC_DRIVER_NAME_POSTGRESQL;
}

for (int index = 0; index < num; index++) {
    int currentSize = index + 1;
    Preconditions.checkArgument(url.size() >= currentSize, "db.url.%s is null", index);
    DataSourcePoolProperties poolProperties = DataSourcePoolProperties.build(environment);
    poolProperties.setDriverClassName(driverClassName);
    poolProperties.setJdbcUrl(url.get(index).trim());
    poolProperties.setUsername(getOrDefault(user, index, user.get(0)).trim());
    poolProperties.setPassword(getOrDefault(password, index, password.get(0)).trim());
    HikariDataSource ds = poolProperties.getDataSource();
    ds.setConnectionTestQuery(TEST_QUERY);
    ds.setIdleTimeout(TimeUnit.MINUTES.toMillis(10L));
    ds.setConnectionTimeout(TimeUnit.SECONDS.toMillis(3L));
    dataSources.add(ds);
    callback.accept(ds);
}

④ StartingApplicationListener.java

private static final String DATABASE_MYSQL = "mysql";

private static final String DATABASE_POSTGRESQL = "postgresql";

···

#judgeStorageMode方法内

// Add PostgreSQL support
final String platform = env.getProperty(DATASOURCE_PLATFORM_PROPERTY, DEFAULT_DATASOURCE_PLATFORM);
boolean useExternalStorage = (DATABASE_MYSQL.equalsIgnoreCase(platform)
        || DATABASE_POSTGRESQL.equalsIgnoreCase(platform));

4. 兼容PostgreSQL

① 主键

# 全局替换:
Statement.RETURN_GENERATED_KEYS 替换为 new String[]{"id"}

# 由于postgresql无法通过Statement.RETURN_GENERATED_KEYS获取主键,因此只能显示的指定要寻找的主键

② LIKE

当前2.1.0版本只有两个地方,都在/plugin-default-impl/src/main/java/com/alibaba/nacos/plugin/auth/impl/persistence下
① ExternalRolePersistServiceImpl#findRolesLikeRoleName
② ExternalUserPersistServiceImpl#findUserLikeUsername
like

#如上图类似替换
LIKE '%' ? '%' 替换成 LIKE ?
new String[] {username} 替换成 new String[] {String.format("%%%s%%", username)}

# LIKE '%' '%AD' '%'的方式,mysql可用,但并非标准sql
# LIKE '%%AD%'的方式,这是标准sql,因此mysql与postgresql都可使用

③ LIMIT

# 全局替换:
LIMIT ?, ?    替换为 OFFSET ? LIMIT ?
LIMIT ?,?     替换为 OFFSET ? LIMIT ?
LIMIT \?,\? 替换为 OFFSET \? LIMIT \?

# LIMIT ?,? 是mysql可用,但并非标准sql
# OFFSET ? LIMIT ? 是sql,因此mysql与postgresql都可使用

还有一个较为特殊
ExternalStoragePaginationHelperImpl#fetchPage

String selectSql;
if (isDerby()) {
    selectSql = sqlFetchRows + " OFFSET " + startRow + " ROWS FETCH NEXT " + pageSize + " ROWS ONLY";
} else if (lastMaxId != null) {
    // PostgreSQL support
    selectSql = sqlFetchRows + " AND id > " + lastMaxId + " ORDER BY id ASC" + " LIMIT " + pageSize + " OFFSET " + 0;
} else {
    // PostgreSQL support
    selectSql = sqlFetchRows + " LIMIT " + pageSize + " OFFSET " + startRow;
}

5. BUG处理

这部分是官方上的bug,已提交了ISSUE,并且也已解决,后续版本应该没问题,解决方式在ISSUE中也提到了

# 1. ExternalStoragePersistServiceImpl#findAllConfigInfoForDumpAll
params.toArray() 替换为 new Object[] {(pageNo - 1) * pageSize, pageSize}

# 2. EmbeddedStoragePersistServiceImpl#findAllConfigInfoForDumpAll
EMPTY_ARRAY 替换为 new Object[] {(pageNo - 1) * pageSize, pageSize}

6. 配置文件

剩下的就是

  1. application.properties
  2. nacos-postgresql.sql

的问题了

① application.properties

spring.datasource.platform=postgresql

db.url.0=jdbc:postgresql://127.0.0.1:5432/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=postgres
db.password.0=nacos

以上配置要类似如上进行修改

② nacos-postgresql.sql

官方提供的是mysql与derby版的,需要使用postgresql版的,在下面提供。

结语

以上已经做了打包,可在Github中下载,这份已做了如上的修改,也加上了日语翻译,如不需要,可下载获取nacos-postgresql.sql,再自行根据以上进行修改打包。

最后

以上就是正直板凳为你收集整理的nacos添加PostgreSQL支持背景环境步骤结语的全部内容,希望文章能够帮你解决nacos添加PostgreSQL支持背景环境步骤结语所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(42)

评论列表共有 0 条评论

立即
投稿
返回
顶部