欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

荐 NCAOS源码修改--适配PostgreSQL数据库

程序员文章站 2022-03-31 21:59:56
概述nacos现在除了自身的内嵌数据库外,只支持mysql数据库,由于工作需要,需要将nacos连接到postgresql数据库,查看源码之后发现源码中只兼容了mysql数据库,需要对源码进行修改。刚毕业的小白,有什么错误欢迎大佬指点!!!修改思路首先修改配置项,将配置mysql的位置加入判断条件,兼容postgresql;其次修改判断语句,源码中有许多判断是否使用mysql的位置,如没有用mysql且单机模式启动,则会加载内嵌数据库,此处加上postgresql的判断条件;最后,修改nacos中my...

概述

nacos现在除了自身的内嵌数据库外,只支持mysql数据库,由于工作需要,需要将nacos连接到postgresql数据库,查看源码之后发现源码中只兼容了mysql数据库,需要对源码进行修改。刚毕业的小白,有什么错误欢迎大佬指点!!!

修改思路

首先修改配置项,将配置mysql的位置加入判断条件,兼容postgresql;其次修改判断语句,源码中有许多判断是否使用mysql的位置,如没有用mysql且单机模式启动,则会加载内嵌数据库,此处加上postgresql的判断条件;最后,修改nacos中mysql与postgresql在sql语句方面的不同,例如postgresql用``包裹字段会报错,不支持limit m,n的写法。

nacos版本:1.1.4
package com.alibaba.nacos.config.server.service

主要内容位于这个包内,下面按照每个修改的类进行描述

BasicDataSourceServiceImpl

对mysql的加载位于这个类中,由于想要动态判断加载mysql或postgresql驱动,删掉了static代码块,在reload方法中加入了如下代码

if (env.getProperty("spring.datasource.platform").equals("postgresql")) {
	JDBC_DRIVER_NAME = DEFAULT_POSTGRESQL_DRIVER;
	log.info("Use PostgreSQL as the driver");
}else {
	try {
		Class.forName(MYSQL_HIGH_LEVEL_DRIVER);
		JDBC_DRIVER_NAME = MYSQL_HIGH_LEVEL_DRIVER;
		log.info("Use Mysql 8 as the driver");
	} catch (ClassNotFoundException ex) {
		log.info("Use Mysql as the driver");
		JDBC_DRIVER_NAME = DEFAULT_MYSQL_DRIVER;
}

其次下面加入了if else语句,将原本的for循环放到了else中,if中加入判断条件,若是postgresql数据库,复制一份mysql的加载过程,将其中 db. + i 等修改为自己配置文件中的配置即可。

if (JDBC_DRIVER_NAME == DEFAULT_POSTGRESQL_DRIVER) {
				String val = null;

				BasicDataSource ds = new BasicDataSource();
				ds.setDriverClassName(JDBC_DRIVER_NAME);

				val = env.getProperty("db.url");
				if (null == val) {
					fatalLog.error("db.url is null");
					throw new IllegalArgumentException();
				}
				ds.setUrl(val.trim());

				val = env.getProperty("db.user", env.getProperty("db.user"));
				if (null == val) {
					fatalLog.error("db.user is null");
					throw new IllegalArgumentException();
				}
				ds.setUsername(val.trim());

				val = env.getProperty("db.password", env.getProperty("db.password"));
				if (null == val) {
					fatalLog.error("db.password is null");
					throw new IllegalArgumentException();
				}
				ds.setPassword(val.trim());

				val = env.getProperty("db.initialSize", env.getProperty("db.initialSize"));
				ds.setInitialSize(Integer.parseInt(defaultIfNull(val, "10")));

				val = env.getProperty("db.maxActive", env.getProperty("db.maxActive"));
				ds.setMaxActive(Integer.parseInt(defaultIfNull(val, "20")));

				val = env.getProperty("db.maxIdle", env.getProperty("db.maxIdle"));
				ds.setMaxIdle(Integer.parseInt(defaultIfNull(val, "50")));

				ds.setMaxWait(3000L);
				ds.setPoolPreparedStatements(true);

				// 每10分钟检查一遍连接池
				ds.setTimeBetweenEvictionRunsMillis(TimeUnit.MINUTES.toMillis(10L));
				ds.setTestWhileIdle(true);
				ds.setValidationQuery("SELECT 1 ");

				dblist.add(ds);

				JdbcTemplate jdbcTemplate = new JdbcTemplate();
				jdbcTemplate.setQueryTimeout(queryTimeout);
				jdbcTemplate.setDataSource(ds);

				testJTList.add(jdbcTemplate);
				isHealthList.add(Boolean.TRUE);

				if (dblist == null || dblist.size() == 0) {
					throw new RuntimeException("no datasource available");
				}

				dataSourceList = dblist;
				new SelectMasterTask().run();
				new CheckDBHealthTask().run();
			}
DynamicDataSource;LocalDataSourceServiceImpl; ConfigService;

这三个类中主要是在原本的判断条件后面加入了postgresql的判断条件,如下

if (STANDALONE_MODE && !propertyUtil.isStandaloneUseMysql() && !propertyUtil.isStandaloneUsePostgreSql())

对应添加即可。(ps,可以用搜索功能搜索所有此类语句,基本需要全部更改)

propertyUtil.isStandaloneUsePostgreSql()方法

ctrl + 左键 转到propertyUtil类中,模仿mysql的方法新增PostgreSql相关方法和属性。

package com.alibaba.nacos.config.server.utils;

本包中主要是sql相关,主要目的是修改limit语句,通过源码可以看到,本身nacos就因为mysql的limit在内嵌数据库中不支持写了判断语句修改sql

if (STANDALONE_MODE && !PropertyUtil.isStandaloneUseMysql() && !PropertyUtil.isStandaloneUsePostgreSql()) {
            selectSQL = selectSQL.replaceAll("(?i)LIMIT \\?,\\?", "OFFSET ? ROWS FETCH NEXT ? ROWS ONLY");
        }

因此,相关位置只需要根据原本的判断条件,加入如下代码:

        if(STANDALONE_MODE && PropertyUtil.isStandaloneUsePostgreSql()) {
        	selectSQL = selectSQL.replaceAll("(?i)LIMIT \\?,\\?", "OFFSET ? LIMIT ? ");
        }

将limit ?,? 替换为 OFFSET ? LIMIT ?即可

最后

使用搜索替换功能,删掉sql语句中所有的`
记得修改配置文件并在启动项加入

-Dnacos.standalone=true -Dnacos.home=D:\nacos-server-1.1.4\nacos-1.1.4\distribution
修改的类如下

package com.alibaba.nacos.config.server.service:
BasicDataSourceServiceImpl;
DynamicDataSource;
LocalDataSourceServiceImpl;
ConfigService;

package com.alibaba.nacos.config.server.service.capacity:
GroupCapacityPersistService;
TenantCapacityPersistService

package com.alibaba.nacos.config.server.controller:
ConfigServletInner;

package com.alibaba.nacos.config.server.utils:
PaginationHelper;
PropertyUtil;

Github连接如下

https://github.com/CNWangTy/nacos

有错误的话希望大家给我指出,并球球大家教教我怎么解决!万分感激!

本文地址:https://blog.csdn.net/SdWangTy/article/details/107639663