feat: 添加环境初始数据源配置功能(阶段一:需求定义)

- 在 DataiConfigEnvironment 实体中添加 isInitialDataSource 字段
- 创建需求文档:环境初始数据源配置需求
- 支持为每个环境配置初始数据源
- 支持应用启动时自动加载环境的初始数据源
- 结合动态数据源延迟加载机制,实现环境与数据源的灵活绑定

需求编号: 2026-01-24-001
阶段: 阶段一 - 需求定义
This commit is contained in:
Kris 2026-01-24 18:46:29 +08:00
parent 4b4dc90a98
commit 813b76f87e
2 changed files with 283 additions and 0 deletions

View File

@ -55,6 +55,11 @@ public class DataiConfigEnvironment extends BaseEntity
@Schema(title = "是否有效") @Schema(title = "是否有效")
@Excel(name = "是否有效") @Excel(name = "是否有效")
private Boolean isValid; private Boolean isValid;
/** 是否初始数据源 */
@Schema(title = "是否初始数据源")
@Excel(name = "是否初始数据源")
private Boolean isInitialDataSource;
public void setId(Long id) public void setId(Long id)
{ {
this.id = id; this.id = id;
@ -139,6 +144,16 @@ public class DataiConfigEnvironment extends BaseEntity
return isValid; return isValid;
} }
public void setIsInitialDataSource(Boolean isInitialDataSource)
{
this.isInitialDataSource = isInitialDataSource;
}
public Boolean getIsInitialDataSource()
{
return isInitialDataSource;
}
@Override @Override
public String toString() { public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE) return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
@ -150,6 +165,7 @@ public class DataiConfigEnvironment extends BaseEntity
.append("description", getDescription()) .append("description", getDescription())
.append("isActive", getIsActive()) .append("isActive", getIsActive())
.append("isValid", getIsValid()) .append("isValid", getIsValid())
.append("isInitialDataSource", getIsInitialDataSource())
.append("remark", getRemark()) .append("remark", getRemark())
.append("createBy", getCreateBy()) .append("createBy", getCreateBy())
.append("createTime", getCreateTime()) .append("createTime", getCreateTime())

View File

@ -0,0 +1,267 @@
# 环境初始数据源配置需求
## 元数据
- 需求编号2026-01-24-001
- 创建时间2026-01-24
- 创建人SSOT 架构师
- 状态:进行中
- 优先级:高
## 需求概述
为每个环境配置初始数据源,支持应用启动时自动加载环境的初始数据源,结合动态数据源延迟加载机制,实现环境与数据源的灵活绑定。
## 目标
1. **环境数据源绑定**:每个环境可以配置一个初始数据源,支持主库和从库的灵活配置
2. **自动加载**:应用启动时自动加载所有标记为初始数据源的环境配置
3. **延迟加载**:未标记为初始数据源的环境,按需动态加载
4. **灵活切换**:支持运行时动态切换环境的初始数据源
5. **无侵入性**:使用现有的 `@DataSource` 注解进行数据源切换,业务代码无需修改
## 业务上下文
### 当前问题
- 现有动态数据源延迟加载机制只支持主库和从库的固定配置
- 多租户场景下,不同租户需要使用不同的数据源,现有方案无法支持
- 环境切换时,需要手动配置和加载数据源,操作复杂
- 缺少环境与数据源的关联机制,无法实现环境级别的数据源管理
### 业务场景
```
环境配置 + 初始数据源
├─ 环境A生产环境
│ ├─ 初始数据源MASTER主库
│ └─ 启动时自动加载
├─ 环境B测试环境
│ ├─ 初始数据源SLAVE从库
│ └─ 启动时自动加载
└─ 环境C开发环境
├─ 初始数据源:无
└─ 按需动态加载
```
### 应用场景
1. **多租户系统**:不同租户使用独立的数据源,租户切换时自动切换数据源
2. **多环境管理**:生产、测试、开发环境使用不同的数据源,环境切换时自动加载对应数据源
3. **数据隔离**:不同环境的数据完全隔离,避免数据混淆
4. **灵活部署**:支持不同环境使用不同的数据库配置,便于部署和测试
## 涉众分析
| 角色 | 需求 | 影响 |
| ---- | ---- | ---- |
| 系统管理员 | 能够为每个环境配置初始数据源 | 降低运维成本,提高环境管理灵活性 |
| 开发人员 | 使用现有注解即可切换数据源,无需修改业务代码 | 降低开发复杂度,提高开发效率 |
| 最终用户 | 系统启动更快,环境切换无感知 | 提升用户体验 |
| 运维人员 | 支持环境级别的数据源管理,减少手动配置 | 提高系统可用性,减少停机时间 |
## 功能需求
### 核心功能
#### 功能 1环境初始数据源配置
- **描述**:在环境配置表中添加"是否初始数据源"字段,支持为每个环境配置初始数据源
- **验收标准**
1. 在 `datai_config_environment` 表中添加 `is_initial_data_source` 字段
2. 支持通过 API 配置环境的初始数据源状态
3. 支持查询环境的初始数据源配置
4. 支持修改环境的初始数据源配置
5. 配置信息包含环境ID、环境编码、是否初始数据源、初始数据源名称等
- **优先级**:高
- **依赖关系**:依赖环境配置管理功能
#### 功能 2初始数据源自动加载
- **描述**:应用启动时自动加载所有标记为初始数据源的环境配置
- **验收标准**
1. 应用启动时查询所有标记为初始数据源的环境
2. 为每个初始数据源环境创建并注册数据源
3. 数据源创建成功后记录日志
4. 数据源创建失败时记录错误日志,但不影响其他数据源加载
5. 支持配置启动时是否自动加载初始数据源(可选)
- **优先级**:高
- **依赖关系**:依赖功能 1环境初始数据源配置
#### 功能 3环境数据源关联管理
- **描述**:建立环境与数据源的关联关系,支持环境级别的数据源管理
- **验收标准**
1. 支持查询环境关联的数据源列表
2. 支持添加环境数据源关联
3. 支持删除环境数据源关联
4. 支持修改环境数据源关联
5. 支持查询环境当前激活的数据源
- **优先级**:高
- **依赖关系**:依赖功能 1环境初始数据源配置
#### 功能 4环境数据源动态切换
- **描述**:支持运行时动态切换环境的初始数据源,无需重启应用
- **验收标准**
1. 支持通过 API 切换环境的初始数据源
2. 切换流程:更新环境配置 → 移除旧数据源 → 创建新数据源 → 注册到路由器
3. 切换过程线程安全,不影响其他请求
4. 切换失败时回滚到原数据源
5. 切换时间 < 1
- **优先级**:高
- **依赖关系**:依赖功能 1环境初始数据源配置、功能 2初始数据源自动加载
#### 功能 5数据源路由增强
- **描述**:通过 `@DataSource` 注解实现环境级别的数据源路由
- **验收标准**
1. 使用 `@DataSource(DataSourceType.MASTER)` 切换到主库
2. 使用 `@DataSource(DataSourceType.SLAVE)` 切换到从库
3. 支持通过环境编码切换数据源
4. AOP 切面自动拦截并切换数据源
5. 支持方法级别的数据源切换
6. 支持类级别的数据源切换
- **优先级**:高
- **依赖关系**:依赖功能 2初始数据源自动加载
### 次要功能
#### 功能 6环境数据源状态监控
- **描述**:提供环境数据源状态监控功能,包括连接池状态、活跃连接数等
- **验收标准**
1. 支持查询环境数据源连接池状态
2. 支持查询环境数据源活跃连接数
3. 支持查询环境数据源空闲连接数
4. 支持查询环境数据源是否可用
5. 支持查询环境数据源的加载状态
- **优先级**:中
- **依赖关系**:依赖功能 2初始数据源自动加载
#### 功能 7多数据库类型支持
- **描述**:支持多种数据库类型的环境数据源配置
- **验收标准**
1. 支持 MySQL 数据库
2. 支持 PostgreSQL 数据库
3. 支持 Oracle 数据库
4. 支持 openGauss 数据库
5. 支持 SQL Server 数据库
6. 支持 H2 数据库
7. 支持扩展其他数据库类型
- **优先级**:中
- **依赖关系**:依赖功能 1环境初始数据源配置
## 非功能需求
### 性能需求
- **响应时间**:环境数据源切换响应时间 < 1
- **吞吐量**:支持 1000+ 并发请求
- **并发用户数**:支持 500+ 并发用户
- **启动时间**:应用启动时间减少 20%(相比启动时加载所有数据源)
### 安全需求
- **认证方式**:使用现有的 Spring Security 认证机制
- **授权机制**:只有管理员权限才能操作环境数据源配置
- **数据加密**:数据库密码加密存储
- **审计日志**:记录环境数据源配置变更日志
### 可用性需求
- **系统可用性**99.9%
- **容错机制**:环境数据源切换失败时自动回滚
- **灾备方案**:主库故障时系统降级,只读模式
### 兼容性需求
- **浏览器兼容性**支持主流浏览器Chrome、Firefox、Edge、Safari
- **操作系统兼容性**:支持 Windows、Linux、macOS
- **接口兼容性**:兼容现有的 `@DataSource` 注解接口
### 可扩展性需求
- **扩展方式**:支持新增环境数据源配置,无需修改代码
- **负载均衡**:支持多个环境数据源的负载均衡(未来扩展)
### 可维护性需求
- **代码可读性**:代码符合项目编码规范,注释完整
- **文档完整性**:提供完整的使用文档和 API 文档
- **测试覆盖率**:单元测试覆盖率 ≥ 80%
## 数据需求
### 数据模型
#### datai_config_environment 表结构变更
```
datai_config_environment (配置环境表)
├─ id (BIGINT) - 主键ID
├─ dept_id (BIGINT) - 部门ID
├─ environment_name (VARCHAR) - 环境名称
├─ environment_code (VARCHAR) - 环境编码
├─ org_type (VARCHAR) - ORG类型
├─ description (VARCHAR) - 环境描述
├─ is_active (BOOLEAN) - 是否激活
├─ is_valid (BOOLEAN) - 是否有效
├─ is_initial_data_source (BOOLEAN) - 是否初始数据源(新增)
├─ remark (VARCHAR) - 备注
├─ create_by (VARCHAR) - 创建者
├─ create_time (DATETIME) - 创建时间
├─ update_by (VARCHAR) - 更新者
└─ update_time (DATETIME) - 更新时间
```
### 数据存储需求
- **数据库类型**MySQL 8.3.0
- **存储容量**:单表支持 1000 万+ 数据
- **数据备份策略**:每日备份,保留 7 天
### 数据流转需求
```
应用启动
└─ 查询所有标记为初始数据源的环境
└─ 为每个初始数据源环境创建并注册数据源
└─ 记录数据源加载日志
运行时切换环境
└─ 查询环境的初始数据源配置
└─ 移除旧数据源
└─ 创建新数据源
└─ 注册到路由器
└─ 更新环境激活状态
```
## 业务规则
1. **环境编码唯一性**环境编码environment_code必须唯一
2. **初始数据源唯一性**:每个环境只能有一个初始数据源
3. **主库不可删除**MASTER 数据源不可删除和停用
4. **切换时事务隔离**:环境数据源切换时不能在事务中执行
5. **并发安全**:环境数据源切换操作必须线程安全
6. **密码加密**:数据库密码必须加密存储
7. **配置验证**:环境数据源配置修改后必须验证连接有效性
8. **激活环境必须有初始数据源**:激活环境时必须配置初始数据源
## 技术约束
1. **Spring Boot 版本**3.5.7
2. **Java 版本**21
3. **数据库**MySQL 8.3.0
4. **连接池**Druid 1.2.27
5. **ORM 框架**MyBatis 3.5.16
6. **必须使用现有的 `@DataSource` 注解**:不能引入新的注解或 API
## 成功标准
1. 应用启动时间减少 20%
2. 环境数据源切换响应时间 < 1
3. 支持运行时切换环境数据源,无需重启应用
4. 业务代码无需修改,使用现有 `@DataSource` 注解即可切换数据源
5. 单元测试覆盖率 ≥ 80%
6. 系统可用性 ≥ 99.9%
## 风险评估
| 风险 | 影响程度 | 发生概率 | 缓解措施 |
| ---- | ------ | ------ | ------ |
| 环境数据源切换失败导致服务不可用 | 高 | 中 | 实现自动回滚机制,切换前备份原配置 |
| 并发切换导致数据源状态不一致 | 中 | 中 | 使用 synchronized 关键字保证线程安全 |
| 密码泄露导致数据库安全风险 | 高 | 低 | 密码加密存储,使用 AES 加密算法 |
| 连接池资源耗尽 | 中 | 中 | 合理配置连接池参数,实现连接池监控 |
| 数据库连接超时 | 中 | 中 | 配置合理的连接超时时间,实现重试机制 |
| 初始数据源配置错误导致启动失败 | 高 | 低 | 启动时验证数据源配置,失败时记录日志但不影响其他数据源 |
## 依赖关系
- 依赖现有的 `@DataSource` 注解和 AOP 切面机制
- 依赖现有的 `DataSourceManager` 数据源管理器
- 依赖现有的 `DynamicDataSource` 动态数据源路由器
- 依赖现有的 `DynamicDataSourceContextHolder` 数据源上下文持有者
- 依赖现有的环境配置管理功能
- 依赖需求 2026-01-21-001动态数据源延迟加载
## 相关文档
- [动态数据源延迟加载需求](2026-01-21-001-动态数据源延迟加载.md)
- [设计文档](../design/2026-01-24-001-环境初始数据源配置设计.md)
- [架构决策](../decisions/adr/2026-01-24-001-ADR-环境初始数据源配置.md)
- [数据库脚本](../sql/2026-01-24-001-datai_config_environment.sql)
- [变更日志](../changelog/2026-01-24-001-changelog.md)