文章目录
- 1. 概述
- 2. 持久层机制
- 2.1 固定语句
- 2.2 数据源插件
- 3. 案例演示
- 3.1 编译已实现插件
- 3.2 自定义插件
- 3.3 数据库初始化
- 3.4 插件引入
- 3.4.1 方式一:引入到源码
- 3.4.2 方式二:插件加载目录
- 3.5 修改配置
- 3.6 测试
1. 概述
在实际项目开发中,特别是政府项目,信创计划要求使用国产数据库,所以Nacos
需要支持不同类型的数据库。
Nacos
表结构如下,可以看到主要是存储配置、用户、租户相关信息:
2. 持久层机制
2.1 固定语句
在 Nacos 2.2
之前的版本中,所有的 SQL
操作的执行是通过直接使用 JdbcTemplate
执行固定 SQL
语句的形式,使得 SQL
语句与业务逻辑高度耦合,并且只支持 Derby
与 MySQL
两种数据源。
原有模块架构如下:
Nacos 2.1.1
源码中执行 SQL
示例:
如果是 Nacos 2.2
之前的版本,想要兼容多种数据库还是比较头疼的,官方提供的多中数据源支持分支停留在 1.4.2
版本,集成时还需要改造一些代码:
2.2 数据源插件
Nacos
从 2.2.0
版本开始,实现了通过 SPI
机制注入多数据源插件的方式。将 SQL
操作按照数据表进行抽象出多个 Mapper
接口,Mapper
接口的实现类需要按照不同的数据源编写对应的 SQL
方言实现。
架构图如下:
在 nacos-plugin 中,可以看到包含了很多插件:
数据源插件模块 nacos-datasource-plugin-ext
中,可以看到已经实现了DM
(达梦)、SQLServer
、Oracle
、PostgreSQL
:
3. 案例演示
注意事项:
- 目前多数据源插件处于
Beta
测试阶段,其API
及接口方法定义可能会在后续版本升级而有较大修改,请注意您的插件适用版本 - 这里使用的是
Nacos 2.3.2
版本
3.1 编译已实现插件
nacos-plugin 已经实现了多个数据库支持,但是目前仍然处于开发阶段,需要拉取源码自行编译。拉取到本地后,切换到 develop
开发分支。
首先需要将 alibaba-nacos.version
修改为最新的 2.3.2
版本,原先引入的是 2.3.0-SNAPSHOT
快照版本,本地和 Maven
仓库肯定都是没有的:
然后执行 mvn install
安装到本地仓库,这里建议上传到公司的 Maven
仓库。
3.2 自定义插件
针对 nacos-plugin 没有实现的数据库,需要自定义实现(这里只是简单示例,实际是复制了 nacos-postgresql-datasource-plugin-ext
相关代码)。
在 nacos-plugin 中的 nacos-datasource-plugin-ext
下创建自定义插件模块,引入数据库驱动、数据源插件基础依赖:
<parent>
<artifactId>nacos-datasource-plugin-ext</artifactId>
<groupId>com.alibaba.nacos</groupId>
<version>${revision}</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>nacos-postgresql-datasource-plugin-ext</artifactId>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<jdbc.postgresql.version>42.2.19</jdbc.postgresql.version>
</properties>
<dependencies>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<version>${jdbc.postgresql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-datasource-plugin-ext-base</artifactId>
<version>${revision}</version>
<scope>compile</scope>
</dependency>
</dependencies>
实现 AbstractDatabaseDialect
数据库方言接口,设置数据库类型、重写相关分页关键字方法:
public class PostgresqlDatabaseDialect extends AbstractDatabaseDialect {
@Override
public String getType() {
return DatabaseTypeConstant.POSTGRESQL;
}
@Override
public String getLimitTopSqlWithMark(String sql) {
return sql + " LIMIT ? ";
}
@Override
public String getLimitPageSqlWithMark(String sql) {
return sql + " OFFSET ? LIMIT ? ";
}
@Override
public String getLimitPageSql(String sql, int pageNo, int pageSize) {
return sql + " OFFSET " + getPagePrevNum(pageNo, pageSize) + " LIMIT " + pageSize;
}
@Override
public String getLimitPageSqlWithOffset(String sql, int startOffset, int pageSize){
return sql + " OFFSET " + startOffset + " LIMIT " + pageSize;
}
}
继承相关 BaseMapper
类,重写一些 Mapper
接口中的特殊 SQL
方法:
编写 SPI
配置文件,引入方言类、自定义 Mapper
,提供修改后对应的数据库初始化SQL
脚本:
3.3 数据库初始化
这里使用 PostgreSQL
进行演示,新建数据库,找到对应的脚本执行即可:
3.4 插件引入
3.4.1 方式一:引入到源码
在 Nacos 2.3.2
源码中的 plugin/datasource/pom.xml
文件中,引入插件依赖:
这里只引入了 PostgreSQL
,也可以引入多个:
<dependency>
<groupId>com.alibaba.nacos</groupId>
<artifactId>nacos-postgresql-datasource-plugin-ext</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>
执行打包命令:
mvn -Prelease-nacos -Dmaven.test.skip=true -Dpmd.skip=true -Drat.skip=true -Dcheckstyle.skip=true clean install -U
在源码 nacos-2.3.2\distribution\target\nacos-server-2.3.2\nacos
目录下,可以看到打包后的项目:
可以查看 nacos-server.jar
中是否已包含当前数据库驱动:
3.4.2 方式二:插件加载目录
在 Nacos
的启动脚本中,可以看到有一个 loader.path
启动参数, Nacos
支持通过指定路径加载插件:
所以可以直接将编译后的 jar
包(可以多个)放入到 nacos/plugins
目录中:
3.5 修改配置
修改 application.properties
配置文件,添加数据库配置:
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
# spring.datasource.platform=mysql
spring.sql.init.platform=postgresql
### Count of DB:
db.num=1
### Connect URL of DB:
db.url.0=jdbc:postgresql://127.0.0.1:5432/nacos?tcpKeepAlive=true&reWriteBatchedInserts=true&ApplicationName=nacos_java
db.user=postgres
db.password=123456
### Connection pool configuration: hikariCP
db.pool.config.driverClassName=org.postgresql.Driver
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2
#如果是 oracle 则需要改为 SELECT * FROM dual
#db.pool.config.connectionTestQuery=SELECT 1
3.6 测试
启动 Nacos
,添加配置、用户,查看数据库: