配置服务存储说明
创建 configdb 数据库
脚本位置:Nebula.net\script\sql\config_db.sql
执行脚本后,会创建4张表:
- configfiles: 用于存储独立配置文件
- dbconfig: 用于存储数据库连接配置
- settings: 用于存储全局配置/帐号参数
- tenantconn: 用于存储租户的数据库连接映射
configfiles 配置文件表
configfiles表存储了所有的独立配置文件:
字段说明:
字段名 | 含意 |
---|---|
FileName | 配置文件的名称,此名称必须全局唯一,建议包含应用的名称 |
FileBody | 配置文件的内容。 |
settings 全局参数配置
settings表用于管理所有全局的配置参数,可供多个服务共享访问。
所有参数保存在一张数据表中,可参考下图:
字段说明:
字段名 | 含意 |
---|---|
name | 表示配置的名称,在代码中使用 |
value | 表示配置的值 |
restype | 资源类别,用于界面过滤以及监控发现 |
extra | 额外数据,可忽略 |
remark | 备注信息 |
restype的取值可参考下表: 监控枚举值说明
dbconfig 数据库路由表
dbconfig用于管理数据库的路由信息,可参考下图:
这张表定义了【数据库连接名称】以及对应的连接参数,
所以在我们的代码中,只需要使用【数据库连接名称】就可以了。
特别说明
- 对于SaaS应用程序来说,master连接 必须提前创建好,可参考上图中的第一行。
字段说明:
字段名 | 含意 |
---|---|
name | 数据库连接名称,供代码中引用 |
dbType | 数据库类型,0:SQLSERVER, 1:MYSQL |
server | 数据库实例的服务器地址,IP或者DNS名称 |
database | 数据库名称 |
username | 登录用的用户名 |
password | 登录用的密码 |
port | 连接端口。 上以5个字段就是数据库的具体连接参数,有些列可不填(视具体数据库而定) |
args | 连接字符串额外参数 |
dbtype的取值可参考:监控枚举值说明
tenantconn 租户&连接映射表
字段说明:
字段名 | 含意 |
---|---|
tenant_id | 租户ID |
db_name | 租户对应的数据库名称(在任何数据库都使用这个名称) |
xsql_name | SQLSERVER/MySQL/PostgreSQL 实例的连接名称 |
influx_name | InfluxDb实例的连接名称 |
举例说明:
- 假设租户ID=my561f78c61816f
- 此租户的MySQL数据库【连接名】为 rds_1
- 此租户的InfluxDB数据库【连接名】为 influx_1
- 此租户的MySQL/InfluxDB的【数据库名称】:tianxiang_my561f78c61816f
当调用下面方法时:
public abstract class BaseController : ControllerBase, IDisposable
{
/// <summary>
/// 创建指定租户ID的数据库连接
/// </summary>
/// <param name="tenantId">租户ID,可以为空。如果是空,就从当前用户身份中获取。</param>
/// <param name="readonlyDB">是否连接【只读库】</param>
/// <returns></returns>
public virtual DbContext CreateTenantConnection(string tenantId = null, bool readonlyDB = false)
}
public class InfluxClient
{
/// <summary>
/// 根据租户ID创建对应的连接,再构造InfluxClient实例
/// </summary>
/// <param name="tenantId">租户ID</param>
/// <param name="readonlyDB">是否连接【只读库】</param>
/// <returns></returns>
public static InfluxClient CreateTenant(string tenantId, bool readonlyDB = false)
}
执行过程:
- 先获取租户ID,假设租户ID=my561f78c61816f
- 查找 tenantconn 表,WHERE tenant_id='my561f78c61816f'
- 如果是连接MySQL则读取 xsql_name 列, 此时取到连接名称 rds_1
- 如果是连接InfluxDB则读取 influx_name 列, 此时取到连接名称 influx_1
- 如果指定了 readonlyDB=true,则连接名称后面再拼接 "_readonly",例如:rds_1_readonly
- (接第3步),再查找 dbconfig 表,WHERE name='rds_1',获取到 server, username, password
- 根据 tenantconn表的 db_name 以及获取的 server, username, password 生成一个连接字符串
- 连接到具体的租户库