#apollo #configuration #programming-language #local-file

kosei

A 一个易于使用的 Rust 编程语言配置库

5 个版本

0.2.0 2023年2月25日
0.1.3 2023年2月11日
0.1.2 2022年12月24日
0.1.1 2022年12月16日
0.1.0 2022年12月16日

#436 in 配置

Download history 13/week @ 2024-07-05 53/week @ 2024-07-26

每月 66 次下载

MIT 许可协议

36KB
890

Kōsei

こうせい

A 一个易于使用的 Rust 编程语言配置库。

特性

Crates.io Crates.io

特性

动态 热重载配置支持
apollo Apollo 支持
nacos Nacos 支持

快速入门

查看 examples 以获取更多使用信息。

配置项

// `Deserialize` and `Clone` traits should be applied
#[derive(Clone, Debug, Deserialize)]
struct Entry {
    ...
}
  • 基础文件配置
#[test]
fn base_test() {
    // Panic if no such file `config/config.yaml`
    let config: Config<Entry> = Config::from_file("config/config.yaml");
    let entry: &Entry = config.as_inner(); // borrowed value has the same lifetimes as config
    let entry: Entry = config.to_inner();  // clone a new Entry
    let entry: Entry = config.into_inner(); // take ownership
}
  • 动态文件配置
#[tokio::test]
async fn dynamic_test() {
    // Create a dynamic config and a watcher
    let (config, mut watcher) = DynamicConfig::<Entry>::watch_file("config/config.yaml");
    // Listen to file modify event
    watcher.watch().unwrap();
    let lock = config.lock();
    let entry: &Entry = lock.as_inner();  // borrow Entry
    let entry: Entry = lock.to_inner();  // clone a new Entry
    // let entry: Entry = lock.into_inner(); panic! cannot take the lock ownership
    let arc = config.as_arc();  // clone a new arc
    // Stop watching
    watcher.stop().unwrap();
    // You can watch twice
    watcher.watch().unwrap();
}
  • 动态 Apollo 配置
use kosei::apollo::{Builder, WatchMode};
use kosei::{ConfigType, DynamicConfig, InnerWatcher};
use serde::Deserialize;
use std::time::Duration;

#[derive(Deserialize, Clone, Debug)]
struct Entry {
    x: f64,
    y: f64,
}

#[tokio::main]
async fn main() {
    let client = Builder::new()
        .app_id("test")
        .namespace("test", ConfigType::YAML)
        .server_url("https://127.0.0.1:8080")
        .finish();
    let (config, mut watcher) =
        DynamicConfig::<Entry>::watch_apollo(client, WatchMode::RealTime).await;

    watcher.watch().unwrap();

    {
        let guard = config.lock();
        println!("entry: {:?}", guard.as_inner());
    }

    tokio::time::sleep(Duration::from_secs(10)).await;

    {
        let guard = config.lock();
        println!("entry: {:?}", guard.as_inner());
    }
}


依赖

~9–24MB
~337K SLoC