最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Rust如何使用config配置API

 更新時間:2023年11月14日 12:09:57   作者:涵樹  
這篇文章主要介紹了Rust如何使用config配置API,這里記錄了如何聲明配置類型,讀取配置,通過環(huán)境變量來覆蓋配置值等開發(fā)中常見的動作,需要的朋友可以參考下
在應用開發(fā)中,為了讓程序在不同的環(huán)境下都能過順利運行,我們通常會將一些可變項放到配置文件中。Rust也不例外,在Rust中,我們通常使用config crate來實現(xiàn)配置項的讀取。

這里記錄了如何聲明配置類型,讀取配置,通過環(huán)境變量來覆蓋配置值等開發(fā)中常見的動作。

步驟

安裝依賴

[dependencies]
config = "0.13.1"
serde = { version = "1.0.164", features = ["derive"] }

聲明配置struct

我們雖然可以通過config提供的api,去一個字段一個字段的讀取配置,這種方式顯然不安全。

安全的做法是聲明一個強類型,然后讓config幫我們進行反序列化處理,如果字段有錯,會直接報config::ConfigError 。從而避免讓配置錯誤成為漏網(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)中的序列化和反序列化的標準,只有讓我們的類型實現(xiàn)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這里是列表的形式。

添加配置項加載代碼

完成了上面的準備工作,我們就可以通過下面的代碼讀取配置數(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("構建配置錯誤");
    let config: AppConfig = config_.try_deserialize().expect("反序列化配置文件錯誤");
    println!("server_addr:{}", config.server_addr);
    ...
}

上面代碼中的錯誤未作處理,錯誤處理和當前上下文有關,可以參考我的《Rust-錯誤處理魔法》。

添加環(huán)境變量

到目前為止,我們完成了從聲明配置項到讀取配置數(shù)據(jù)的過程。但是,在實際開發(fā)中,由于環(huán)境的原因,我們需要根據(jù)不同的運行環(huán)境來調(diào)整某些配置項。

比如上面的redis_addr,我們在開發(fā)的時候,它的值是redis-token,可能部署到生產(chǎn)環(huán)境后,這個值就變成其它的了。但是,如果每次切換環(huán)境都去改這個值,顯然是很不方便且容易出錯的。

最簡單的方式是通過環(huán)境變量來覆蓋對應的值,幸運的是config為我們提供了這個功能。代碼調(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("構建配置錯誤");
    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),然后通過反序列化的方式來讀取配置的數(shù)據(jù)。這是一種安全的方式。

我們還可以通過環(huán)境變量來動態(tài)修改配置的值。這一點使得我們的應用在部署時更加靈活,也更加專業(yè)。

到此這篇關于Rust-使用config配置你的API的文章就介紹到這了,更多相關Rust使用config配置api內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Rust+React創(chuàng)建富文本編輯器

    Rust+React創(chuàng)建富文本編輯器

    這篇文章主要為大家介紹了Rust+React創(chuàng)建富文本編輯器示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • Rust中的不安全代碼詳解

    Rust中的不安全代碼詳解

    這篇文章主要為大家介紹了Rust中的不安全代碼詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-04-04
  • Rust 文檔注釋功能示例代碼

    Rust 文檔注釋功能示例代碼

    Rust的文檔注釋使用特定的格式,以便通過 rustdoc工具生成 API 文檔,本文給大家介紹Rust 文檔注釋功能,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • Rust使用kind進行異常處理(錯誤的分類與傳遞)

    Rust使用kind進行異常處理(錯誤的分類與傳遞)

    Rust?有一套獨特的處理異常情況的機制,它并不像其它語言中的?try?機制那樣簡單,這篇文章主要介紹了Rust指南錯誤的分類與傳遞以及使用kind進行異常處理,需要的朋友可以參考下
    2022-09-09
  • Rust常用特型之ToOwned特型示例詳解

    Rust常用特型之ToOwned特型示例詳解

    在Rust中,假定某類型實現(xiàn)了Clone特型,如果給你一個對它引用,那我們得到它指向內(nèi)容的備份的最常見方式是調(diào)用其clone()函數(shù),這篇文章主要介紹了Rust常用特型之ToOwned特型,需要的朋友可以參考下
    2024-04-04
  • Rust中的Box<T>之堆上的數(shù)據(jù)與遞歸類型詳解

    Rust中的Box<T>之堆上的數(shù)據(jù)與遞歸類型詳解

    本文介紹了Rust中的Box<T>類型,包括其在堆與棧之間的內(nèi)存分配,性能優(yōu)勢,以及如何利用Box<T>來實現(xiàn)遞歸類型和處理大小未知類型,通過Box<T>,Rust程序員可以更靈活地管理內(nèi)存,避免編譯時大小不確定的問題,并提高代碼的效率和靈活性
    2025-02-02
  • 深入了解Rust的切片使用

    深入了解Rust的切片使用

    除了引用,Rust?還有另外一種不持有所有權的數(shù)據(jù)類型:切片(slice),切片允許我們引用集合中某一段連續(xù)的元素序列,而不是整個集合。本文讓我們來深入了解Rust的切片
    2022-11-11
  • Rust之Rhai腳本編程的示例

    Rust之Rhai腳本編程的示例

    文章介紹了如何在Rust中使用Rhai庫執(zhí)行腳本,包括添加依賴、創(chuàng)建引擎、定義腳本、執(zhí)行腳本并處理結果,示例展示了如何定義一個簡單的函數(shù)并調(diào)用它,輸出問候信息
    2025-02-02
  • Rust語言中級教程之指針

    Rust語言中級教程之指針

    Rust中共有三種類型的指針,分別為引用,解引用,智能指針,這篇文章主要介紹了Rust語言中級教程之指針,需要的朋友可以參考下
    2023-05-05
  • Rust中的Drop特性之解讀自動化資源清理的魔法

    Rust中的Drop特性之解讀自動化資源清理的魔法

    Rust通過Drop特性實現(xiàn)了自動清理機制,確保資源在對象超出作用域時自動釋放,避免了手動管理資源時可能出現(xiàn)的內(nèi)存泄漏或雙重釋放問題,智能指針如Box、Rc和RefCell都依賴于Drop來管理資源,提供了靈活且安全的資源管理方案
    2025-02-02

最新評論

九江市| 新源县| 新津县| 喀喇| 建瓯市| 宝丰县| 荆门市| 英德市| 昔阳县| 元朗区| 蓝山县| 博野县| 涪陵区| 宜黄县| 寿宁县| 华池县| 阿拉善右旗| 固镇县| 邛崃市| 安新县| 休宁县| 南安市| 洛隆县| 金塔县| 定兴县| 任丘市| 藁城市| 房产| 武强县| 上林县| 黄平县| 武威市| 新沂市| 新河县| 晋州市| 乡城县| 长沙市| 临江市| 息烽县| 兴国县| 专栏|