Rust如何使用config配置API
在應用開發(fā)中,為了讓程序在不同的環(huán)境下都能過順利運行,我們通常會將一些可變項放到配置文件中。Rust也不例外,在Rust中,我們通常使用config crate來實現配置項的讀取。
這里記錄了如何聲明配置類型,讀取配置,通過環(huán)境變量來覆蓋配置值等開發(fā)中常見的動作。
步驟
安裝依賴
[dependencies] config = "0.13.1" serde = { version = "1.0.164", features = ["derive"] }
聲明配置struct
我們雖然可以通過config提供的api,去一個字段一個字段的讀取配置,這種方式顯然不安全。
安全的做法是聲明一個強類型,然后讓config幫我們進行反序列化處理,如果字段有錯,會直接報config::ConfigError
。從而避免讓配置錯誤成為漏網之魚,去干擾后面的正常邏輯。
models.rs
use serde::Deserialize; #[derive(Debug, Default, Deserialize)] pub struct AppConfig { pub server_addr: String, pub port: u16, pub redis_addr: String, pub redis_port: u16, pub route_mapping: Vec<RouteMapping>, } #[derive(Deserialize, Debug, Clone)] pub struct RouteMapping { pub prefix: String, pub target: String, }
serde::Deserialize
幾乎成了Rust生態(tài)中的序列化和反序列化的標準,只有讓我們的類型實現serde::Deserialize
trait,config
才能為我們從配置文件中反序列化。
創(chuàng)建配置文件
配置文件一般放在項目的根目錄中,我們這里命名為config.toml
。
server_addr="0.0.0.0" port=8000 redis_addr="redis-token" redis_port=6379 [[route_mapping]] prefix="/api/notes/" target="notes-api"
注意,route_mapping
這里是列表的形式。
添加配置項加載代碼
完成了上面的準備工作,我們就可以通過下面的代碼讀取配置數據了。
mod models; use config::{Config, File}; use models::AppConfig; fn main() -> _ { let config_ = Config::builder() .add_source(File::with_name("config.toml")) .build() .expect("構建配置錯誤"); let config: AppConfig = config_.try_deserialize().expect("反序列化配置文件錯誤"); println!("server_addr:{}", config.server_addr); ... }
上面代碼中的錯誤未作處理,錯誤處理和當前上下文有關,可以參考我的《Rust-錯誤處理魔法》。
添加環(huán)境變量
到目前為止,我們完成了從聲明配置項到讀取配置數據的過程。但是,在實際開發(fā)中,由于環(huán)境的原因,我們需要根據不同的運行環(huán)境來調整某些配置項。
比如上面的redis_addr,我們在開發(fā)的時候,它的值是redis-token,可能部署到生產環(huán)境后,這個值就變成其它的了。但是,如果每次切換環(huán)境都去改這個值,顯然是很不方便且容易出錯的。
最簡單的方式是通過環(huán)境變量來覆蓋對應的值,幸運的是config為我們提供了這個功能。代碼調整如下:
mod models; use config::{Config, Environment, File}; use models::AppConfig; fn main() -> _ { let config_ = Config::builder() .add_source(File::with_name("config.toml")) .add_source(Environment::with_prefix("api-gate")) .build() .expect("構建配置錯誤"); let config: AppConfig = config_.try_deserialize().expect("反序列化配置文件錯誤"); println!("server_addr:{}", config.server_addr); ... }
config會為我們用環(huán)境變量前綴為api-gate
的值,去覆蓋從config.toml中讀取的值。
以上面的redis_addr為例,執(zhí)行代碼如下:
export api-gate_redis_addr=192.168.3.175 cargo run
總結
我們通過config crate來讀取配置。先要聲明配置對應的類型(struct),然后通過反序列化的方式來讀取配置的數據。這是一種安全的方式。
我們還可以通過環(huán)境變量來動態(tài)修改配置的值。這一點使得我們的應用在部署時更加靈活,也更加專業(yè)。
到此這篇關于Rust-使用config配置你的API的文章就介紹到這了,更多相關Rust使用config配置api內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!