Rust如何使用config配置API
在應(yīng)用開(kāi)發(fā)中,為了讓程序在不同的環(huán)境下都能過(guò)順利運(yùn)行,我們通常會(huì)將一些可變項(xiàng)放到配置文件中。Rust也不例外,在Rust中,我們通常使用config crate來(lái)實(shí)現(xiàn)配置項(xiàng)的讀取。
這里記錄了如何聲明配置類(lèi)型,讀取配置,通過(guò)環(huán)境變量來(lái)覆蓋配置值等開(kāi)發(fā)中常見(jiàn)的動(dòng)作。
步驟
安裝依賴(lài)
[dependencies] config = "0.13.1" serde = { version = "1.0.164", features = ["derive"] }
聲明配置struct
我們雖然可以通過(guò)config提供的api,去一個(gè)字段一個(gè)字段的讀取配置,這種方式顯然不安全。
安全的做法是聲明一個(gè)強(qiáng)類(lèi)型,然后讓config幫我們進(jìn)行反序列化處理,如果字段有錯(cuò),會(huì)直接報(bào)config::ConfigError
。從而避免讓配置錯(cuò)誤成為漏網(wǎng)之魚(yú),去干擾后面的正常邏輯。
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),只有讓我們的類(lèi)型實(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)備工作,我們就可以通過(guò)下面的代碼讀取配置數(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ù)的過(guò)程。但是,在實(shí)際開(kāi)發(fā)中,由于環(huán)境的原因,我們需要根據(jù)不同的運(yùn)行環(huán)境來(lái)調(diào)整某些配置項(xiàng)。
比如上面的redis_addr,我們?cè)陂_(kāi)發(fā)的時(shí)候,它的值是redis-token,可能部署到生產(chǎn)環(huán)境后,這個(gè)值就變成其它的了。但是,如果每次切換環(huán)境都去改這個(gè)值,顯然是很不方便且容易出錯(cuò)的。
最簡(jiǎn)單的方式是通過(guò)環(huán)境變量來(lái)覆蓋對(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é)
我們通過(guò)config crate來(lái)讀取配置。先要聲明配置對(duì)應(yīng)的類(lèi)型(struct),然后通過(guò)反序列化的方式來(lái)讀取配置的數(shù)據(jù)。這是一種安全的方式。
我們還可以通過(guò)環(huán)境變量來(lái)動(dòng)態(tài)修改配置的值。這一點(diǎn)使得我們的應(yīng)用在部署時(shí)更加靈活,也更加專(zhuān)業(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作為一種高效、安全的編程語(yǔ)言,可以用于開(kāi)發(fā)各種應(yīng)用,包括天氣預(yù)報(bào)采集系統(tǒng),本文將探討如何使用Rust來(lái)采集天氣預(yù)報(bào)信息,并實(shí)現(xiàn)實(shí)時(shí)更新數(shù)據(jù)的功能,文中通過(guò)代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01使用Cargo工具高效創(chuàng)建Rust項(xiàng)目
這篇文章主要介紹了使用Cargo工具高效創(chuàng)建Rust項(xiàng)目,本文有關(guān)Cargo工具的使用和Rust輸入輸出知識(shí)感興趣的朋友一起看看吧2022-08-08在Rust中編寫(xiě)自定義Error的詳細(xì)代碼
Result<T, E> 類(lèi)型可以方便地用于錯(cuò)誤傳導(dǎo),Result<T, E>是模板類(lèi)型,實(shí)例化后可以是各種類(lèi)型,但 Rust 要求傳導(dǎo)的 Result 中的 E 是相同類(lèi)型的,所以我們需要編寫(xiě)自己的 Error 類(lèi)型,本文給大家介紹了在Rust中編寫(xiě)自定義Error的詳細(xì)代碼,需要的朋友可以參考下2024-01-01Rust用宏實(shí)現(xiàn)參數(shù)可變的函數(shù)的實(shí)現(xiàn)示例
本文主要介紹了Rust用宏實(shí)現(xiàn)參數(shù)可變的函數(shù)的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-03-03