欢迎光临
我们一直在努力

fuconfig关联知识点

  **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()` 返回各子模块克隆 |

赞(0)
未经允许不得转载:171主机测评 » fuconfig关联知识点
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址