欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Rust如何使用config配置API

 更新時(shí)間:2023年11月14日 12:09:57   作者:涵樹  
這篇文章主要介紹了Rust如何使用config配置API,這里記錄了如何聲明配置類型,讀取配置,通過環(huán)境變量來覆蓋配置值等開發(fā)中常見的動(dòng)作,需要的朋友可以參考下
在應(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讀取配置文件的實(shí)現(xiàn)步驟

    Rust讀取配置文件的實(shí)現(xiàn)步驟

    任何項(xiàng)目都離不開對(duì)于配置文件的讀取和解析,rust項(xiàng)目也一樣,本文主要介紹了Rust讀取配置文件的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12
  • 解析Rust?struct?中的生命周期

    解析Rust?struct?中的生命周期

    rust?的生命周期保證了內(nèi)存的安全性,同時(shí)也增加了開發(fā)者的心智負(fù)擔(dān)。是在上線之前多費(fèi)心思寫代碼,還是在上線以后忙忙活活查問題,這是個(gè)?trade?off?問題,這篇文章主要介紹了Rust?struct?中的生命周期,需要的朋友可以參考下
    2022-10-10
  • Rust 智能指針實(shí)現(xiàn)方法

    Rust 智能指針實(shí)現(xiàn)方法

    這篇文章主要介紹了Rust 智能指針的實(shí)現(xiàn)方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-01-01
  • 使用Rust采集天氣預(yù)報(bào)信息并實(shí)現(xiàn)實(shí)時(shí)更新數(shù)據(jù)功能

    使用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
  • Rust中不可變變量與const的區(qū)別詳解

    Rust中不可變變量與const的區(qū)別詳解

    Rust作者認(rèn)為變量默認(rèn)應(yīng)該是immutable,即聲明后不能被改變的變量,這一點(diǎn)是讓跨語言學(xué)習(xí)者覺得很別扭,不過這一點(diǎn)小的改變帶來了諸多好處,本節(jié)我們來學(xué)習(xí)Rust中不可變變量與const的區(qū)別,需要的朋友可以參考下
    2024-02-02
  • 使用Cargo工具高效創(chuàng)建Rust項(xiàng)目

    使用Cargo工具高效創(chuàng)建Rust項(xiàng)目

    這篇文章主要介紹了使用Cargo工具高效創(chuàng)建Rust項(xiàng)目,本文有關(guān)Cargo工具的使用和Rust輸入輸出知識(shí)感興趣的朋友一起看看吧
    2022-08-08
  • 詳解Rust中的workspace

    詳解Rust中的workspace

    這篇文章主要向大家介紹Rust中的workspace,主要內(nèi)容包括基礎(chǔ)應(yīng)用、實(shí)用技巧、原理機(jī)制等方面,這個(gè)概念在Rust中是通用的,只不過maven換成了cargo,而模塊變成了crate,下面跟著小編通過一個(gè)例子給大家介紹下
    2022-03-03
  • 在Rust中編寫自定義Error的詳細(xì)代碼

    在Rust中編寫自定義Error的詳細(xì)代碼

    Result<T, E> 類型可以方便地用于錯(cuò)誤傳導(dǎo),Result<T, E>是模板類型,實(shí)例化后可以是各種類型,但 Rust 要求傳導(dǎo)的 Result 中的 E 是相同類型的,所以我們需要編寫自己的 Error 類型,本文給大家介紹了在Rust中編寫自定義Error的詳細(xì)代碼,需要的朋友可以參考下
    2024-01-01
  • Rust用宏實(shí)現(xiàn)參數(shù)可變的函數(shù)的實(shí)現(xiàn)示例

    Rust用宏實(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
  • RUST異步流處理方法詳細(xì)講解

    RUST異步流處理方法詳細(xì)講解

    這篇文章主要介紹了RUST異步流處理方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-12-12

最新評(píng)論