配置服务存储说明

创建 configdb 数据库

脚本位置:Nebula.net\script\sql\config_db.sql

执行脚本后,会创建4张表:

  • configfiles: 用于存储独立配置文件
  • dbconfig: 用于存储数据库连接配置
  • settings: 用于存储全局配置/帐号参数
  • tenantconn: 用于存储租户的数据库连接映射



configfiles 配置文件表

configfiles表存储了所有的独立配置文件:

xx

字段说明:

字段名含意
FileName配置文件的名称,此名称必须全局唯一,建议包含应用的名称
FileBody配置文件的内容。



settings 全局参数配置

settings表用于管理所有全局的配置参数,可供多个服务共享访问。
所有参数保存在一张数据表中,可参考下图:

xx

字段说明:

字段名含意
name表示配置的名称,在代码中使用
value表示配置的值
restype资源类别,用于界面过滤以及监控发现
extra额外数据,可忽略
remark备注信息



restype的取值可参考下表: 监控枚举值说明



dbconfig 数据库路由表

dbconfig用于管理数据库的路由信息,可参考下图:

xx

这张表定义了【数据库连接名称】以及对应的连接参数,
所以在我们的代码中,只需要使用【数据库连接名称】就可以了。

特别说明

  • 对于SaaS应用程序来说,master连接 必须提前创建好,可参考上图中的第一行。

字段说明:

字段名含意
name数据库连接名称,供代码中引用
dbType数据库类型,0:SQLSERVER, 1:MYSQL
server数据库实例的服务器地址,IP或者DNS名称
database数据库名称
username登录用的用户名
password登录用的密码
port连接端口。 上以5个字段就是数据库的具体连接参数,有些列可不填(视具体数据库而定)
args连接字符串额外参数

dbtype的取值可参考:监控枚举值说明



tenantconn 租户&连接映射表

xx

字段说明:

字段名含意
tenant_id租户ID
db_name租户对应的数据库名称(在任何数据库都使用这个名称)
xsql_nameSQLSERVER/MySQL/PostgreSQL 实例的连接名称
influx_nameInfluxDb实例的连接名称

举例说明:

  • 假设租户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)
}

执行过程:

  1. 先获取租户ID,假设租户ID=my561f78c61816f
  2. 查找 tenantconn 表,WHERE tenant_id='my561f78c61816f'
  3. 如果是连接MySQL则读取 xsql_name 列, 此时取到连接名称 rds_1
  4. 如果是连接InfluxDB则读取 influx_name 列, 此时取到连接名称 influx_1
  5. 如果指定了 readonlyDB=true,则连接名称后面再拼接 "_readonly",例如:rds_1_readonly
  6. (接第3步),再查找 dbconfig 表,WHERE name='rds_1',获取到 server, username, password
  7. 根据 tenantconn表的 db_name 以及获取的 server, username, password 生成一个连接字符串
  8. 连接到具体的租户库