1、背景
Nacos 官方仅支持 MySQL,故需要自己魔改一下。
2、下载源码
源码下载地址:
官网教程地址:
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