**RuConfig 关联知识点**的完整梳理:
—
## 一、核心结构定义
### 1. [RuConfig](file:///E:/soft/gitee.com/ruwebframe/src/ruconf/ru_config.rs#L54-L57) 结构体
```rust
pub struct RuConfig {
pub config: RwLock<ConfDto>,
}
```
**关键设计**:
– 使用 `RwLock<ConfDto>` 包裹配置,支持**多读单写**的线程安全模型
– 实现了 `BaseEntitySingle` trait → 标记为**单例实体**
– 实现了 `Clone`、`Debug`、`Default`、`Serialize`、`Deserialize`
—
## 二、DI 依赖注入与生命周期
### 2. [ru_config_init.rs](file:///E:/soft/gitee.com/ruwebframe/src/ruconf/ru_config_init.rs) — 自动注册
```rust
#[ctor(unsafe)]
pub fn init() {
RuConfig::register_bean_singleton(); // 注册为单例 Bean
}
```
**关联 Trait**:
– [BeanSingle](file:///E:/soft/gitee.com/ruwebframe/src/ruconf/ru_config_init.rs#L22-L27) — 定义了 `new_bean()` 工厂方法
– 全局获取:`find_bean_ru_config() -> Option<Arc<RuConfig>>`
– 通过 `#[ctor]` 属性在**程序启动前**自动执行注册
### 3. [BaseEntitySingle](file:///E:/soft/gitee.com/ruwebframe/src/rubase/ruentity/base_entity_single.rs#L1-L24) — 单例实体 Trait
```rust
pub trait BaseEntitySingle {
fn if_single(&self) -> bool { true }
fn init(&mut self) {}
fn shutdown(&mut self) {}
fn auto_init(&self) -> bool { false }
fn to_json(&self) -> Result<String, serde_json::Error> { … }
fn from_json(&self, from: String) -> Result<Self, serde_json::Error> { … }
}
```
—
## 三、配置加载流程
### 4. 完整加载链路
```
RuConfig::new()
└─ parse_config()
├─ parse_env2file()
│ ├─ parse_env() → 读取 /config/env.yml 中的 Env 字段
│ └─ 拼接 "ichub-{env}.yml" → 如 ichub-dev.yml
├─ 读取 YAML 文件
├─ str_utils::preprocess_placeholder_vars() → 预处理占位符
├─ serde_yaml::from_str::<ConfDto>() → 反序列化
├─ config.parse_env_var() → 替换 ${VAR:default}
├─ config.parse_dec_var() → 解密 enc(xxx) 字段
├─ 设置 base_path + pkg_name
└─ 写入 self.config (RwLock)
```
### 5. [parse_conf.rs](file:///E:/soft/gitee.com/ruwebframe/src/ruconf/parse_conf.rs) — 独立解析工具
提供不依赖 `RuConfig` 实例的静态解析函数:
– `parse_env()` — 读取环境名
– `parse_env_var()` — 解析 `${VAR:default}` 占位符
– `parse_env2file()` — 环境名 → 配置文件名
– `parse_cfg2file()` — 解析指定 YAML 中的 `software.env`
– `parse_config()` — 测试用硬编码路径解析
—
## 四、核心方法一览
### 6. [RuConfig](file:///E:/soft/gitee.com/ruwebframe/src/ruconf/ru_config.rs#L62-L172) 实例方法
| 方法 | 返回值 | 说明 |
|——|——–|——|
| `new()` | `Self` | 构造函数,自动触发 `parse_config()` |
| `parse_config()` | — | 完整配置解析流程 |
| `read()` | `ConfDto`(克隆) | 获取配置的完整副本 |
| `find_env()` | `String` | 获取当前环境名 |
| `if_env(env)` | `bool` | 判断是否是指定环境 |
| `if_master()` | `bool` | 是否生产环境 |
| `if_not_master()` | `bool` | 是否非生产环境 |
| `get_web_port()` | `u16` | 获取 Web 服务端口 |
| `read_software()` | `SoftDto` | 读取软件配置 |
| `read_web_server()` | `ServerDto` | 读取 Web 服务端配置 |
| `read_web_client()` | `ClientDto` | 读取 Web 客户端配置 |
| `read_redis()` | `RedisDto` | 读取 Redis 配置 |
| `read_datasource()` | `DataSource` | 读取数据源配置 |
| `read_gorm()` | `Gorm` | 读取 GORM 配置 |
| `get_config(file)` | `String` | 拼接完整配置文件路径 |
| `parse_env()` | `String` | 从 env.yml 读环境名 |
| `parse_env2file()` | `String` | 环境名 → 配置文件名 |
### 7. 全局便捷函数([ru_config.rs:L18-L49](file:///E:/soft/gitee.com/ruwebframe/src/ruconf/ru_config.rs#L18-L49))
```rust
pub fn if_dev() -> bool // 是否 dev 环境
pub fn if_test() -> bool // 是否 test 环境
pub fn if_release() -> bool // 是否 release 环境
pub fn if_master() -> bool // 是否 prod/master 环境
pub fn if_not_master() -> bool // 是否非生产环境
pub fn find_env() -> String // 获取当前环境名
pub fn if_env(env: &str) -> bool // 判断是否指定环境
pub fn find_ru_config() -> Arc<RuConfig> // 获取 RuConfig 实例
```
—
## 五、配置数据结构 [ConfDto](file:///E:/soft/gitee.com/ruwebframe/src/rubase/rudto/confdto/conf_dto.rs#L10-L20)
```rust
pub struct ConfDto {
pub software: SoftDto, // 软件信息(名称、版本、作者、环境、加密密钥)
pub web: WebDto, // Web 配置(ServerDto + ClientDto)
pub gorm: Gorm, // 数据库 ORM 配置
pub datasource: DataSource, // 数据源连接信息
pub redis: RedisDto, // Redis 配置
pub etcd: EtcdDto, // Etcd 配置
pub rpc: RpcDto, // RPC 配置
#[serde(skip)] pub base_path: String, // 项目基础路径(运行时注入)
#[serde(skip)] pub pkg_name: String, // 包名(运行时注入)
}
```
**关联 Trait**:
– `ParseEnvVar` — 递归解析 `${VAR:default}` 环境变量占位符
– `BaseEntity` — 基础实体标记
– `GetSelf` — 获取自身克隆
—
## 六、模块导出
### 8. [mod.rs](file:///E:/soft/gitee.com/ruwebframe/src/ruconf/mod.rs) — 模块组织
```rust
pub mod parse_conf;
pub mod ru_config;
pub mod ru_config_init;
pub use ru_config::*; // 重导出所有 RuConfig 方法和全局函数
pub use parse_conf::*; // 重导出解析工具函数
pub use ru_config_init::find_bean_ru_config; // 重导出 DI 获取函数
```
### 9. [prelude.rs](file:///E:/soft/gitee.com/ruwebframe/src/prelude.rs) — 预导入
```rust
pub use crate::rubase::ruentity::BaseEntitySingle;
pub use crate::rubase::ruentity::BeanSingle;
pub use crate::rubase::rudto::confdto::ConfDto;
pub use crate::rubase::rudto::confdto::DataSource;
```
—
## 七、使用示例
### 10. 典型用法
```rust
// 1. 获取配置实例
let cfg = ruconf::find_bean_ru_config().unwrap();
// 2. 读取完整配置
let config: ConfDto = cfg.read();
// 3. 读取特定配置
let env = cfg.find_env();
let gorm = cfg.read_gorm();
let redis = cfg.read_redis();
let port = cfg.get_web_port();
// 4. 环境判断
if ruconf::if_master() { /* 生产环境 */ }
if ruconf::if_dev() { /* 开发环境 */ }
// 5. 序列化/反序列化
let json = config.to_json().unwrap();
let restored: ConfDto = config.from_json(json).unwrap();
```
—
## 八、架构关联图
```
┌──────────────┐ ┌──────────────────┐
│ rubase │────▶│ BaseEntitySingle │ Trait 定义
│ ruentity │ │ BeanSingle │
│ rudto │ │ ParseEnvVar │
│ rutils │ │ ConfDto/Gorm/… │ DTO 定义
│ ruconst │ │ str_utils │ 工具函数
└──────┬───────┘ └──────────────────┘
│ 依赖
▼
┌──────────────┐
│ ruconf │
│ ┌───────────┐ │
│ │ RuConfig │ │ 核心配置管理
│ │ parse_conf│ │ 解析工具
│ │ *_init.rs │ │ DI 自动注册
│ └───────────┘ │
└──────┬───────┘
│ 被依赖
▼
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ database │ │ ruweb │ │ rudomain │ │ rumini │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
```
—
## 九、关键知识点总结
| 知识点 | 说明 |
|——–|——|
| **线程安全** | `RwLock<ConfDto>` 多读单写,非 `Arc<Mutex<>>` 而是单例 `Arc<RwLock<>>` |
| **单例模式** | `BaseEntitySingle` + `BeanSingle` + `#[ctor]` 启动时自动注册 |
| **环境隔离** | 通过 `env.yml` → `ichub-{env}.yml` 实现多环境配置 |
| **占位符解析** | `${VAR:default}` 格式,支持环境变量注入 + 加密字段 `enc(xxx)` 解密 |
| **DI 获取** | `find_bean_ru_config()` 全局唯一入口 |
| **模块导出** | `mod.rs` 用 `pub use *` 扁平化导出,外部直接 `ruconf::find_env()` |
| **配置读取** | `read()` 返回 `ConfDto` 克隆,`read_xxx()` 返回各子模块克隆 |



