在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

如何用Rust構建一個KV Server系列

lhl545545 ? 來源:Rust語言中文社區 ? 作者:Rust語言中文社區 ? 2022-09-14 10:03 ? 次閱讀

本系列是關于用Rust構建一個KV Server的系列文章,內容包括用tokio做底層異步網絡通訊、使用toml文件做配置、protobuf做傳輸協議、內存/RockDB做數據存儲、事件通知、優雅關機、并發連接限制及測量監控等。

讓我們先使用tokio實現一個簡單的Client & Server通訊模型,然后在此基礎上逐步實現上面提及的各項內容。

創建一個新項目:

cargo new --lib kvserver_rust

在Cargo.toml文件中加入tokio依賴:

[dependencies]tokio = { version = "1.19", features = ["full"] }

Server

在src目錄下創建bin文件夾,然后創建kv_server.rs文件:

use anyhow::Result;use tokio::{    io::{AsyncReadExt, AsyncWriteExt},    net::TcpListener,};
#[tokio::main]async fn main() -> Result<(), Box> {    let addr = "127.0.0.1:19999";    let listener = TcpListener::bind(addr).await?;    println!("Listening on {addr} ......");
    loop {        let (mut stream, addr) = listener.accept().await?;        println!("Client: {:?} connected", addr);
        tokio::spawn(async move {            let mut buf = vec![0u8; 1024];
            loop {                let n = stream.read(&mut buf).await.expect("從Socket讀取數據失敗!");
                if n == 0 {                    return;                }
                stream                    .write_all(&buf[0..n])                    .await                    .expect("向Socket寫入數據失敗!");            }        });    }}

在"127.0.0.1:19999"地址監聽客戶端的連接,收到客戶端發來的信息后再返回給客戶端。

Client

在src/bin目錄下創建kv_client.rs文件:

use anyhow::Result;use tokio::{    io::{AsyncReadExt, AsyncWriteExt},    net::TcpStream,};
#[tokio::main]async fn main() -> Result<(), Box> {    let addr = "127.0.0.1:19999";    let mut stream = TcpStream::connect(addr).await?;
    let n = stream.write(b"Hello, world!").await?;    println!("Send info successed!n = {n}");
    let mut buf = vec![0u8; 1024];    let n = stream.read(&mut buf).await.expect("從Socket讀取數據失敗!");    println!("Receive info:{}, n = {n}", String::from_utf8(buf).unwrap());
    Ok(())}

連接server端"127.0.0.1:19999"這個地址,向Server端發送"Hello, world!"消息,然后再接收Server端返回的消息。

打開兩個終端,分別執行:

cargo run --bin kv_servercargo run --bin kv_client

執行結果

kv_server:

Listening on 127.0.0.1:19999 ......Client: 127.0.0.1:51724 connected

kv_client:

Send info successed!n = 13Receive info:Hello, world!, n = 13

配置文件

使用 toml 做配置文件,serde 來處理配置的序列化和反序列化。在項目根目錄下新建conf目錄,并在下面新建server.conf文件:

[listen_address]addr = '127.0.0.1:19999'

和client.conf文件:

[connect_address]server_addr = '127.0.0.1:19999'

新建src/config.rs文件:

use std::{error::Error, fs};
use serde::{Deserialize, Serialize};
// Server端配置#[derive(Debug, Serialize, Deserialize)]pub struct ServerConfig {    pub listen_address: ListenAddress,}
// 監聽地址#[derive(Debug, Serialize, Deserialize)]pub struct ListenAddress {    pub addr: String,}
// Client端配置#[derive(Debug, Serialize, Deserialize)]pub struct ClientConfig {    pub connect_address: ConnectAddress,}
// 連接地址#[derive(Debug, Serialize, Deserialize)]pub struct ConnectAddress {    pub server_addr: String,}
impl ServerConfig {    // 加載Server端配置文件    pub fn load(path: &str) -> Result> {        let config = fs::read_to_string(path)?;        let server_conf: Self = toml::from_str(&config)?;        Ok(server_conf)    }}
impl ClientConfig {    // 加載Client端配置文件    pub fn load(path: &str) -> Result> {        let config = fs::read_to_string(path)?;        let client_conf: Self = toml::from_str(&config)?;        Ok(client_conf)    }}

然后在lib.rs中加入:

mod config;pub use config::*;

修改src/bin/kv_server.rs代碼:

#[tokio::main]async fn main() -> Result<(), Box> {    let server_conf = ServerConfig::load("conf/server.conf")?;    let listen_addr = server_conf.listen_address.addr;
    let listener = TcpListener::bind(&listen_addr).await?;    println!("Listening on {} ......", listen_addr);    ......}

修改src/bin/kv_client.rs代碼:

#[tokio::main]async fn main() -> Result<(), Box> {    let client_conf = ClientConfig::load("conf/client.conf")?;    let connect_addr = client_conf.connect_address.server_addr;
    let mut stream = TcpStream::connect(&connect_addr).await?;    ......}

運行kv_sever和kv_client后,執行結果與上面一致。

審核編輯:彭靜
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 監控
    +關注

    關注

    6

    文章

    2240

    瀏覽量

    55388
  • 數據存儲
    +關注

    關注

    5

    文章

    986

    瀏覽量

    51109
  • 網絡通訊
    +關注

    關注

    0

    文章

    75

    瀏覽量

    11314

原文標題:用Rust實現KV Server-1 toml格式的配置文件

文章出處:【微信號:Rust語言中文社區,微信公眾號:Rust語言中文社區】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    只會用Python?教你在樹莓派上開始使用Rust

    ));}就是這樣!保存您的腳本,然后返回到終端。進行測試再次構建項目以更新可執行文件。另外,運行命令可以構建并運行腳本:cargo run您應該看到
    發表于 05-20 08:00

    使用rust開發stm32系列教程

    本文為使用 rust 開發 stm32 系列教程前言。Why RustRust 特性就不用多介紹了,有編譯器管著有時候比用C到處浪把自己整沒了好。ST官方逐漸停止對C固件庫的更新,使用MX感覺沒
    發表于 08-20 07:18

    何用 rust 語言開發 stm32

    本文介紹如何用 rust 語言開發 stm32。開發平臺為 linux(gentoo)。硬件準備本文使用的芯片為 STM32F103C8T6。該芯片性價比較高,價格低廉,適合入門學習。需要
    發表于 11-26 06:20

    RUST在嵌入式開發中的應用是什么

    的文檔、有用的錯誤消息、友好編譯器、流的工具,只是Rust的幾個好處。它帶有集成的包管理器和構建工具,支持自動完成和類型檢查的智能多編
    發表于 12-24 08:34

    Rust代碼中加載靜態庫時,出現錯誤 ` rust-lld: error: undefined symbol: malloc `怎么解決?

    我正在 MCUXpresso IDE 中創建靜態庫。我正在使用 redlib 在我的代碼中導入 ` [i]stdlib.h`。它成功地構建
    發表于 06-09 08:44

    何用Foxmail Server搭建郵件服務器

    何用Foxmail Server搭建郵件服務器 Foxmail Server(以下簡稱FMS)可以搭建出功能強大的郵件服務器。本文以FMS For Windows 2.0為例,從其設置、管理、收
    發表于 01-27 17:05 ?1353次閱讀

    何用Windows 2000 Server充當軟路由

    何用Windows 2000 Server充當軟路由  這是通過在Windows 2000 Server上安裝多塊網卡,利用Windows 2000 Server自帶的路由器功能實
    發表于 01-29 11:20 ?1600次閱讀

    Rust開發操作系統教程之如何自制操作系統

    正如標題,這篇文章是關于如何用Rust開發船新的操作系統,而這個操作系統只會打印句話: Hello World 在這之前,我們需要了解
    發表于 06-05 17:51 ?0次下載
    <b class='flag-5'>Rust</b>開發操作系統教程之如何自制<b class='flag-5'>一</b><b class='flag-5'>個</b>操作系統

    何用繼電器構建計算機的CPU

    這個迷你系列文章描述了如何用繼電器構建計算機的 CPU(中央處理單元)。
    的頭像 發表于 07-28 10:41 ?2795次閱讀
    如<b class='flag-5'>何用</b>繼電器<b class='flag-5'>構建</b>計算機的CPU

    使用tokio實現簡單的Client和Server通訊模型

    系列是關于用Rust構建KV Server
    的頭像 發表于 09-09 09:45 ?2401次閱讀

    使用Protobuf實現客戶端與服務器之間的通信協議層

    系列是關于用Rust構建KV Server
    的頭像 發表于 09-14 09:26 ?2581次閱讀

    Xilinx KV 260構建一個人臉識別車庫門鎖

    電子發燒友網站提供《Xilinx KV 260構建一個人臉識別車庫門鎖.zip》資料免費下載
    發表于 10-26 11:24 ?7次下載
    Xilinx <b class='flag-5'>KV</b> 260<b class='flag-5'>構建</b><b class='flag-5'>一個</b>人臉識別車庫門鎖

    Rust構建QEMU插件的框架

    Cannonball 是Rust 構建 QEMU 插件的框架!您可以在 C 語言的 QEMU TCG 插件中執行的任何操作,都可以使用cannonball。編寫以最小的開銷和盡
    的頭像 發表于 07-21 16:57 ?975次閱讀

    何用Rust通過JNI和Java進行交互

    近期工作中有Rust和Java互相調用需求,這篇文章主要介紹如何用Rust通過JNI和Java進行交互,還有記錄下開發過程中遇到的些坑。
    的頭像 發表于 10-17 11:41 ?844次閱讀

    何用Rust編寫ChatGPT桌面應用(保姆級教程)

    為什么我們需要桌面應用 原因實在太多,我們需要便捷地 導出 記錄,需要在回答長度超長的時候自動加上“繼續”,需要 收藏 些很酷很實用的prompt...... (首先我假設你是
    的頭像 發表于 09-25 11:19 ?429次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>Rust</b>編寫<b class='flag-5'>一</b><b class='flag-5'>個</b>ChatGPT桌面應用(保姆級教程)
    主站蜘蛛池模板: 久久看片网 | 成人国产永久福利看片 | 91视频看看| 色综合欧美 | 丁香伊人五月综合激激激 | 黄色在线免费看 | 特级毛片aaaa级毛片免费 | 中文字幕在线观看第一页 | 免费观看欧美成人1314w色 | 免费一级欧美片在线观看 | 夜夜操夜夜摸 | 日本黄色美女网站 | ww欧洲ww在线视频看ww | 免费a网站 | 久久99国产亚洲高清观看首页 | 两性色午夜视频免费国产 | 欧美潘金莲一级风流片a级 欧美片欧美日韩国产综合片 | 亚洲日本一区二区三区在线不卡 | 日本一区三区二区三区四区 | 有码视频在线观看 | 久久久国产高清 | 国产亚洲3p无码一区二区 | 欧美性视频一区二区三区 | 四虎免费久久影院 | 中年艳妇乱小玩 | 色偷偷91综合久久噜噜 | 婷婷免费高清视频在线观看 | 91在线免费看 | 色天使色婷婷丁香久久综合 | 国产美女视频黄a视频免费全过程 | 正在播放羽月希与黑人bd在线 | 国产成人精品日本亚洲语言 | 欧美大狠狠大臿蕉香蕉大视频 | 日韩成人午夜 | 成 人 免费 黄 色 视频 | 免费黄色大片在线观看 | 国产乱码免费卡1卡二卡3卡四 | 久久国产精品久久久久久久久久 | 美女被猛男躁免费视频网站 | 久久天天躁夜夜躁狠狠 | 午夜久久久久久 |