497 lines
9.7 KiB
Markdown
497 lines
9.7 KiB
Markdown
# 动态数据源延迟加载 API 文档
|
||
|
||
## 元数据
|
||
- 需求编号:2026-01-21-001
|
||
- 创建时间:2026-01-21
|
||
- 创建人:SSOT 架构师
|
||
- 状态:已完成
|
||
- API 版本:v1.0.0
|
||
- 基础路径:/system/datasource
|
||
|
||
## 概述
|
||
|
||
### API 描述
|
||
动态数据源延迟加载 API 提供了数据源的动态加载、切换、查询和移除功能,支持运行时动态管理数据源,无需重启应用。
|
||
|
||
### 认证方式
|
||
- 认证类型:JWT Token
|
||
- 认证头:Authorization: Bearer {token}
|
||
- 权限要求:需要相应的系统权限
|
||
|
||
### 通用响应格式
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "操作成功",
|
||
"data": {}
|
||
}
|
||
```
|
||
|
||
### 响应码说明
|
||
| 响应码 | 说明 |
|
||
| ---- | ---- |
|
||
| 200 | 操作成功 |
|
||
| 401 | 未认证 |
|
||
| 403 | 无权限 |
|
||
| 404 | 资源不存在 |
|
||
| 500 | 服务器内部错误 |
|
||
|
||
## API 接口列表
|
||
|
||
### 1. 加载从库数据源
|
||
|
||
#### 接口描述
|
||
加载从库数据源,从主库读取从库配置并动态创建数据源。
|
||
|
||
#### 请求信息
|
||
- **请求方式**:POST
|
||
- **请求路径**:/system/datasource/loadSlave
|
||
- **权限要求**:system:datasource:load
|
||
|
||
#### 请求参数
|
||
无
|
||
|
||
#### 请求示例
|
||
```bash
|
||
POST /system/datasource/loadSlave
|
||
Authorization: Bearer {token}
|
||
Content-Type: application/json
|
||
```
|
||
|
||
#### 响应示例
|
||
**成功响应**
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "从库数据源加载成功",
|
||
"data": null
|
||
}
|
||
```
|
||
|
||
**失败响应**
|
||
```json
|
||
{
|
||
"code": 500,
|
||
"msg": "加载从库数据源失败:从库配置不存在",
|
||
"data": null
|
||
}
|
||
```
|
||
|
||
#### 错误码说明
|
||
| 错误码 | 说明 |
|
||
| ---- | ---- |
|
||
| 500 | 从库配置不存在 |
|
||
| 500 | 从库已停用,无法加载 |
|
||
| 500 | 数据源已存在 |
|
||
| 500 | 添加动态数据源失败 |
|
||
|
||
---
|
||
|
||
### 2. 切换从库库名
|
||
|
||
#### 接口描述
|
||
切换从库库名,更新从库配置并重新加载数据源。
|
||
|
||
#### 请求信息
|
||
- **请求方式**:POST
|
||
- **请求路径**:/system/datasource/switchSlave/{dbName}
|
||
- **权限要求**:system:datasource:switch
|
||
|
||
#### 请求参数
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
| ---- | ---- | ---- | ---- |
|
||
| dbName | String | 是 | 新的从库库名 |
|
||
|
||
#### 请求示例
|
||
```bash
|
||
POST /system/datasource/switchSlave/new_slave_db
|
||
Authorization: Bearer {token}
|
||
Content-Type: application/json
|
||
```
|
||
|
||
#### 响应示例
|
||
**成功响应**
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "从库切换成功",
|
||
"data": null
|
||
}
|
||
```
|
||
|
||
**失败响应**
|
||
```json
|
||
{
|
||
"code": 500,
|
||
"msg": "切换从库失败:从库配置不存在",
|
||
"data": null
|
||
}
|
||
```
|
||
|
||
#### 错误码说明
|
||
| 错误码 | 说明 |
|
||
| ---- | ---- |
|
||
| 500 | 从库配置不存在 |
|
||
| 500 | 从库已停用,无法切换 |
|
||
| 500 | 移除数据源失败 |
|
||
| 500 | 添加动态数据源失败 |
|
||
|
||
---
|
||
|
||
### 3. 获取从库配置
|
||
|
||
#### 接口描述
|
||
获取从库配置信息。
|
||
|
||
#### 请求信息
|
||
- **请求方式**:GET
|
||
- **请求路径**:/system/datasource/getSlaveConfig
|
||
- **权限要求**:system:datasource:query
|
||
|
||
#### 请求参数
|
||
无
|
||
|
||
#### 请求示例
|
||
```bash
|
||
GET /system/datasource/getSlaveConfig
|
||
Authorization: Bearer {token}
|
||
Content-Type: application/json
|
||
```
|
||
|
||
#### 响应示例
|
||
**成功响应**
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "操作成功",
|
||
"data": {
|
||
"id": 1,
|
||
"dsName": "SLAVE",
|
||
"dbName": "slave_db",
|
||
"dbHost": "localhost",
|
||
"dbPort": 3306,
|
||
"username": "root",
|
||
"password": "******",
|
||
"dbType": "mysql",
|
||
"status": "0",
|
||
"remark": "从库配置",
|
||
"createBy": "admin",
|
||
"createTime": "2026-01-21 10:00:00",
|
||
"updateBy": "admin",
|
||
"updateTime": "2026-01-21 10:00:00"
|
||
}
|
||
}
|
||
```
|
||
|
||
**失败响应**
|
||
```json
|
||
{
|
||
"code": 500,
|
||
"msg": "获取从库配置失败:从库配置不存在",
|
||
"data": null
|
||
}
|
||
```
|
||
|
||
#### 错误码说明
|
||
| 错误码 | 说明 |
|
||
| ---- | ---- |
|
||
| 500 | 从库配置不存在 |
|
||
|
||
---
|
||
|
||
### 4. 切换数据源
|
||
|
||
#### 接口描述
|
||
切换到指定的数据源。
|
||
|
||
#### 请求信息
|
||
- **请求方式**:POST
|
||
- **请求路径**:/system/datasource/switch/{dsName}
|
||
- **权限要求**:system:datasource:switch
|
||
|
||
#### 请求参数
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
| ---- | ---- | ---- | ---- |
|
||
| dsName | String | 是 | 数据源名称(如:MASTER、SLAVE) |
|
||
|
||
#### 请求示例
|
||
```bash
|
||
POST /system/datasource/switch/SLAVE
|
||
Authorization: Bearer {token}
|
||
Content-Type: application/json
|
||
```
|
||
|
||
#### 响应示例
|
||
**成功响应**
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "数据源切换成功",
|
||
"data": null
|
||
}
|
||
```
|
||
|
||
**失败响应**
|
||
```json
|
||
{
|
||
"code": 500,
|
||
"msg": "切换数据源失败:数据源不存在",
|
||
"data": null
|
||
}
|
||
```
|
||
|
||
#### 错误码说明
|
||
| 错误码 | 说明 |
|
||
| ---- | ---- |
|
||
| 500 | 数据源不存在 |
|
||
|
||
---
|
||
|
||
### 5. 移除数据源
|
||
|
||
#### 接口描述
|
||
移除指定的数据源。
|
||
|
||
#### 请求信息
|
||
- **请求方式**:DELETE
|
||
- **请求路径**:/system/datasource/{dsName}
|
||
- **权限要求**:system:datasource:remove
|
||
|
||
#### 请求参数
|
||
| 参数名 | 类型 | 必填 | 说明 |
|
||
| ---- | ---- | ---- | ---- |
|
||
| dsName | String | 是 | 数据源名称 |
|
||
|
||
#### 请求示例
|
||
```bash
|
||
DELETE /system/datasource/SLAVE
|
||
Authorization: Bearer {token}
|
||
Content-Type: application/json
|
||
```
|
||
|
||
#### 响应示例
|
||
**成功响应**
|
||
```json
|
||
{
|
||
"code": 200,
|
||
"msg": "数据源移除成功",
|
||
"data": null
|
||
}
|
||
```
|
||
|
||
**失败响应**
|
||
```json
|
||
{
|
||
"code": 500,
|
||
"msg": "移除数据源失败:数据源不存在",
|
||
"data": null
|
||
}
|
||
```
|
||
|
||
#### 错误码说明
|
||
| 错误码 | 说明 |
|
||
| ---- | ---- |
|
||
| 500 | 数据源不存在 |
|
||
|
||
---
|
||
|
||
## 数据模型
|
||
|
||
### SysDatasourceConfig(数据源配置)
|
||
|
||
| 字段名 | 类型 | 必填 | 说明 |
|
||
| ---- | ---- | ---- | ---- |
|
||
| id | Long | 是 | 主键ID |
|
||
| dsName | String | 是 | 数据源名称(如:SLAVE) |
|
||
| dbName | String | 是 | 数据库名称 |
|
||
| dbHost | String | 是 | 数据库主机 |
|
||
| dbPort | Integer | 是 | 数据库端口 |
|
||
| username | String | 是 | 用户名 |
|
||
| password | String | 是 | 密码(加密存储) |
|
||
| dbType | String | 是 | 数据库类型(mysql/postgresql/oracle等) |
|
||
| status | String | 是 | 状态(0正常 1停用) |
|
||
| remark | String | 否 | 备注 |
|
||
| createBy | String | 否 | 创建者 |
|
||
| createTime | DateTime | 否 | 创建时间 |
|
||
| updateBy | String | 否 | 更新者 |
|
||
| updateTime | DateTime | 否 | 更新时间 |
|
||
|
||
---
|
||
|
||
## 使用示例
|
||
|
||
### 场景 1:首次加载从库数据源
|
||
|
||
```bash
|
||
# 1. 加载从库数据源
|
||
POST /system/datasource/loadSlave
|
||
Authorization: Bearer {token}
|
||
Content-Type: application/json
|
||
|
||
# 响应
|
||
{
|
||
"code": 200,
|
||
"msg": "从库数据源加载成功",
|
||
"data": null
|
||
}
|
||
|
||
# 2. 验证从库配置
|
||
GET /system/datasource/getSlaveConfig
|
||
Authorization: Bearer {token}
|
||
Content-Type: application/json
|
||
|
||
# 响应
|
||
{
|
||
"code": 200,
|
||
"msg": "操作成功",
|
||
"data": {
|
||
"id": 1,
|
||
"dsName": "SLAVE",
|
||
"dbName": "slave_db",
|
||
"dbHost": "localhost",
|
||
"dbPort": 3306,
|
||
"username": "root",
|
||
"password": "******",
|
||
"dbType": "mysql",
|
||
"status": "0",
|
||
"remark": "从库配置",
|
||
"createBy": "admin",
|
||
"createTime": "2026-01-21 10:00:00",
|
||
"updateBy": "admin",
|
||
"updateTime": "2026-01-21 10:00:00"
|
||
}
|
||
}
|
||
```
|
||
|
||
### 场景 2:切换从库库名
|
||
|
||
```bash
|
||
# 1. 切换从库库名
|
||
POST /system/datasource/switchSlave/new_slave_db
|
||
Authorization: Bearer {token}
|
||
Content-Type: application/json
|
||
|
||
# 响应
|
||
{
|
||
"code": 200,
|
||
"msg": "从库切换成功",
|
||
"data": null
|
||
}
|
||
|
||
# 2. 验证从库配置
|
||
GET /system/datasource/getSlaveConfig
|
||
Authorization: Bearer {token}
|
||
Content-Type: application/json
|
||
|
||
# 响应
|
||
{
|
||
"code": 200,
|
||
"msg": "操作成功",
|
||
"data": {
|
||
"id": 1,
|
||
"dsName": "SLAVE",
|
||
"dbName": "new_slave_db",
|
||
"dbHost": "localhost",
|
||
"dbPort": 3306,
|
||
"username": "root",
|
||
"password": "******",
|
||
"dbType": "mysql",
|
||
"status": "0",
|
||
"remark": "从库配置",
|
||
"createBy": "admin",
|
||
"createTime": "2026-01-21 10:00:00",
|
||
"updateBy": "admin",
|
||
"updateTime": "2026-01-21 10:00:00"
|
||
}
|
||
}
|
||
```
|
||
|
||
### 场景 3:切换数据源
|
||
|
||
```bash
|
||
# 1. 切换到从库
|
||
POST /system/datasource/switch/SLAVE
|
||
Authorization: Bearer {token}
|
||
Content-Type: application/json
|
||
|
||
# 响应
|
||
{
|
||
"code": 200,
|
||
"msg": "数据源切换成功",
|
||
"data": null
|
||
}
|
||
|
||
# 2. 切换到主库
|
||
POST /system/datasource/switch/MASTER
|
||
Authorization: Bearer {token}
|
||
Content-Type: application/json
|
||
|
||
# 响应
|
||
{
|
||
"code": 200,
|
||
"msg": "数据源切换成功",
|
||
"data": null
|
||
}
|
||
```
|
||
|
||
### 场景 4:移除数据源
|
||
|
||
```bash
|
||
# 1. 移除从库数据源
|
||
DELETE /system/datasource/SLAVE
|
||
Authorization: Bearer {token}
|
||
Content-Type: application/json
|
||
|
||
# 响应
|
||
{
|
||
"code": 200,
|
||
"msg": "数据源移除成功",
|
||
"data": null
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 注意事项
|
||
|
||
### 1. 权限要求
|
||
所有接口都需要相应的系统权限,确保用户已获得授权。
|
||
|
||
### 2. 数据源切换
|
||
- 数据源切换操作是线程安全的
|
||
- 切换过程不会影响其他请求
|
||
- 切换失败时会自动回滚到原数据源
|
||
|
||
### 3. 主库保护
|
||
- MASTER 数据源不可删除和停用
|
||
- MASTER 数据源不可切换
|
||
|
||
### 4. 密码安全
|
||
- 数据库密码加密存储
|
||
- API 响应中密码字段会被脱敏显示
|
||
|
||
### 5. 异常处理
|
||
- 所有接口都有完善的异常处理
|
||
- 异常信息会返回给调用方
|
||
- 建议调用方根据错误码进行相应的处理
|
||
|
||
---
|
||
|
||
## 版本历史
|
||
|
||
| 版本 | 日期 | 说明 |
|
||
| ---- | ---- | ---- |
|
||
| v1.0.0 | 2026-01-21 | 初始版本,支持动态数据源加载、切换、查询和移除 |
|
||
|
||
---
|
||
|
||
## 相关文档
|
||
- [需求文档](../requirements/2026-01-21-001-动态数据源延迟加载.md)
|
||
- [设计文档](../design/2026-01-21-001-动态数据源延迟加载设计.md)
|
||
- [决策记录](../decisions/2026-01-21-001-ADR-动态数据源延迟加载.md)
|
||
- [SQL 脚本](../sql/2026-01-21-001-sys_datasource_config.sql)
|
||
- [提示词](../prompts/2026-01-21-001-动态数据源延迟加载代码生成提示词.md)
|
||
- [会话记录](../sessions/2026-01-21-001-session.md)
|
||
- [变更日志](../changelog/2026-01-21-001-changelog.md)
|
||
- [复盘文档](../retros/2026-01-21-001-retro.md)
|