Nacos 2.x 入门系列【6】持久化

422 阅读3分钟

1. 概述

Nacos中的用户、租户、服务配置等信息,需要使用关系型数据库进行存储,在实际开发中,可能还会面临各种数据库适配问题。

2. Derby

DerbyApache一个开源用纯Java编写的关系数据库管理系统。

Derby最大的特点就是简单易用,可以直接嵌入到JAVA应用程序中,所以Nacos默认使用Derby作为内嵌数据库。

\nacos\data目录下可以看到相关数据文件: image.png

3. Mysql

Derby虽然简单易用,但是数据不好维护,在集群环境下,无法共享数据,所以Nacos默认也支持Mysql数据库。

3.1 初始化脚本

/nacos/conf配置文件目录下,提供了mysql-schema.sql脚本: image.png 首先在Mysql中创建数据库,并执行脚本,成功创建了12张表: image.png

表说明如下:

表名说明
config_info配置信息表
config_info_aggr配置聚合表
config_info_beta灰度配置信息表
config_info_tag标签对应的特殊配置信息表
config_tags_relation配置标签信息表
group_capacity集群、各分组容量信息表
his_config_info配置历史信息表
tenant_capacity租户容量信息表
tenant_info租户信息表
users用户信息表
roles角色表
permissions角色权限表

说明: 这里使用的是Mysql 8.0.29

3.2 服务端配置

服务端默认已经引入了Mysql驱动: image.png 所以我们只需要在application.properties中配置一些连接信息即可:

#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
### Deprecated configuration property, it is recommended to use `spring.sql.init.platform` replaced.
### spring.datasource.platform=mysql
spring.sql.init.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/pearl_nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=root

### Connection pool configuration: hikariCP
db.pool.config.connectionTimeout=30000
db.pool.config.validationTimeout=10000
db.pool.config.maximumPoolSize=20
db.pool.config.minimumIdle=2

3.3 验证

在控制台添加一个新用户,查看users表: image.png

4. 数据源插件

在目前信创计划的环境下,很多软件系统都需要适配国产数据库,Nacos也不例外。在Nacos之前的版本中,想适配国产数据库是比较难的,只能自己修改很多源码。

之前版本所有的SQL操作的执行是通过直接使用JdbcTemplate执行固定SQL语句的形式,使得SQL语句与业务逻辑高度耦合,并且只支持DerbyMySQL两种数据源。

原有架构如下:

image.png Nacos2.2.0版本开始,可通过SPI机制注入多数据源实现插件,并在引入对应数据源实现后,便可在Nacos启动时通过读取application.properties配置文件中spring.datasource.platform配置项选择加载对应数据源插件。

数据源插件通过SPI机制,将SQL操作按照数据表进行抽象出多个Mapper接口,Mapper接口的实现类需要按照不同的数据源编写对应的SQL方言实现。现在插件默认提供Derby以及MySQLMapper实现,可直接使用,而其他的数据源则需要用户使用数据源插件进行加载。

其改造后架构图如下:

image.png

注意: 目前多数据源插件处于Beta测试阶段,其API及接口方法定义可能会在后续版本升级而有较大修改,请注意您的插件适用版本。

由于目前还不是正式发布版本,所以后续再进行国产数据库适配演示。