Rust如何使用config配置API
在應(yīng)用開發(fā)中,為了讓程序在不同的環(huán)境下都能過順利運(yùn)行,我們通常會(huì)將一些可變項(xiàng)放到配置文件中。Rust也不例外,在Rust中,我們通常使用config crate來實(shí)現(xiàn)配置項(xiàng)的讀取。
這里記錄了如何聲明配置類型,讀取配置,通過環(huán)境變量來覆蓋配置值等開發(fā)中常見的動(dòng)作。
步驟
安裝依賴
[dependencies] config = "0.13.1" serde = { version = "1.0.164", features = ["derive"] }
聲明配置struct
我們雖然可以通過config提供的api,去一個(gè)字段一個(gè)字段的讀取配置,這種方式顯然不安全。
安全的做法是聲明一個(gè)強(qiáng)類型,然后讓config幫我們進(jìn)行反序列化處理,如果字段有錯(cuò),會(huì)直接報(bào)config::ConfigError
。從而避免讓配置錯(cuò)誤成為漏網(wǎng)之魚,去干擾后面的正常邏輯。
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)中的序列化和反序列化的標(biāo)準(zhǔn),只有讓我們的類型實(shí)現(xiàn)serde::Deserialize
trait,config
才能為我們從配置文件中反序列化。
創(chuàng)建配置文件
配置文件一般放在項(xià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
這里是列表的形式。
添加配置項(xiàng)加載代碼
完成了上面的準(zhǔn)備工作,我們就可以通過下面的代碼讀取配置數(shù)據(jù)了。
mod models; use config::{Config, File}; use models::AppConfig; fn main() -> _ { let config_ = Config::builder() .add_source(File::with_name("config.toml")) .build() .expect("構(gòu)建配置錯(cuò)誤"); let config: AppConfig = config_.try_deserialize().expect("反序列化配置文件錯(cuò)誤"); println!("server_addr:{}", config.server_addr); ... }
上面代碼中的錯(cuò)誤未作處理,錯(cuò)誤處理和當(dāng)前上下文有關(guān),可以參考我的《Rust-錯(cuò)誤處理魔法》。
添加環(huán)境變量
到目前為止,我們完成了從聲明配置項(xiàng)到讀取配置數(shù)據(jù)的過程。但是,在實(shí)際開發(fā)中,由于環(huán)境的原因,我們需要根據(jù)不同的運(yùn)行環(huán)境來調(diào)整某些配置項(xiàng)。
比如上面的redis_addr,我們?cè)陂_發(fā)的時(shí)候,它的值是redis-token,可能部署到生產(chǎn)環(huán)境后,這個(gè)值就變成其它的了。但是,如果每次切換環(huán)境都去改這個(gè)值,顯然是很不方便且容易出錯(cuò)的。
最簡(jiǎn)單的方式是通過環(huán)境變量來覆蓋對(duì)應(yīng)的值,幸運(yùn)的是config為我們提供了這個(gè)功能。代碼調(diào)整如下:
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("構(gòu)建配置錯(cuò)誤"); let config: AppConfig = config_.try_deserialize().expect("反序列化配置文件錯(cuò)誤"); println!("server_addr:{}", config.server_addr); ... }
config會(huì)為我們用環(huán)境變量前綴為api-gate
的值,去覆蓋從config.toml中讀取的值。
以上面的redis_addr為例,執(zhí)行代碼如下:
export api-gate_redis_addr=192.168.3.175 cargo run
總結(jié)
我們通過config crate來讀取配置。先要聲明配置對(duì)應(yīng)的類型(struct),然后通過反序列化的方式來讀取配置的數(shù)據(jù)。這是一種安全的方式。
我們還可以通過環(huán)境變量來動(dòng)態(tài)修改配置的值。這一點(diǎn)使得我們的應(yīng)用在部署時(shí)更加靈活,也更加專業(yè)。
到此這篇關(guān)于Rust-使用config配置你的API的文章就介紹到這了,更多相關(guān)Rust使用config配置api內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
使用Rust采集天氣預(yù)報(bào)信息并實(shí)現(xiàn)實(shí)時(shí)更新數(shù)據(jù)功能
Rust作為一種高效、安全的編程語言,可以用于開發(fā)各種應(yīng)用,包括天氣預(yù)報(bào)采集系統(tǒng),本文將探討如何使用Rust來采集天氣預(yù)報(bào)信息,并實(shí)現(xiàn)實(shí)時(shí)更新數(shù)據(jù)的功能,文中通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01使用Cargo工具高效創(chuàng)建Rust項(xiàng)目
這篇文章主要介紹了使用Cargo工具高效創(chuàng)建Rust項(xiàng)目,本文有關(guān)Cargo工具的使用和Rust輸入輸出知識(shí)感興趣的朋友一起看看吧2022-08-08Rust用宏實(shí)現(xiàn)參數(shù)可變的函數(shù)的實(shí)現(xiàn)示例
本文主要介紹了Rust用宏實(shí)現(xiàn)參數(shù)可變的函數(shù)的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03