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

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何用Rust構(gòu)建一個(gè)KV Server系列

lhl545545 ? 來(lái)源:Rust語(yǔ)言中文社區(qū) ? 作者:Rust語(yǔ)言中文社區(qū) ? 2022-09-14 10:03 ? 次閱讀

本系列是關(guān)于用Rust構(gòu)建一個(gè)KV Server的系列文章,內(nèi)容包括用tokio做底層異步網(wǎng)絡(luò)通訊、使用toml文件做配置、protobuf做傳輸協(xié)議、內(nèi)存/RockDB做數(shù)據(jù)存儲(chǔ)、事件通知、優(yōu)雅關(guān)機(jī)、并發(fā)連接限制及測(cè)量監(jiān)控等。

讓我們先使用tokio實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Client & Server通訊模型,然后在此基礎(chǔ)上逐步實(shí)現(xiàn)上面提及的各項(xiàng)內(nèi)容。

創(chuàng)建一個(gè)新項(xiàng)目:

cargo new --lib kvserver_rust

在Cargo.toml文件中加入tokio依賴(lài):

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

Server

在src目錄下創(chuàng)建bin文件夾,然后創(chuàng)建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讀取數(shù)據(jù)失敗!");
                if n == 0 {                    return;                }
                stream                    .write_all(&buf[0..n])                    .await                    .expect("向Socket寫(xiě)入數(shù)據(jù)失敗!");            }        });    }}

在"127.0.0.1:19999"地址監(jiān)聽(tīng)客戶(hù)端的連接,收到客戶(hù)端發(fā)來(lái)的信息后再返回給客戶(hù)端。

Client

在src/bin目錄下創(chuàng)建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讀取數(shù)據(jù)失敗!");    println!("Receive info:{}, n = {n}", String::from_utf8(buf).unwrap());
    Ok(())}

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

打開(kāi)兩個(gè)終端,分別執(zhí)行:

cargo run --bin kv_servercargo run --bin kv_client

執(zhí)行結(jié)果

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 來(lái)處理配置的序列化和反序列化。在項(xiàng)目根目錄下新建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,}
// 監(jiān)聽(tīng)地址#[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?;    ......}

運(yùn)行kv_sever和kv_client后,執(zhí)行結(jié)果與上面一致。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴

原文標(biāo)題:用Rust實(shí)現(xiàn)KV Server-1 toml格式的配置文件

文章出處:【微信號(hào):Rust語(yǔ)言中文社區(qū),微信公眾號(hào):Rust語(yǔ)言中文社區(qū)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    只會(huì)用Python?教你在樹(shù)莓派上開(kāi)始使用Rust

    ));}就是這樣!保存您的腳本,然后返回到終端。進(jìn)行測(cè)試再次構(gòu)建項(xiàng)目以更新可執(zhí)行文件。另外,運(yùn)行命令可以構(gòu)建并運(yùn)行腳本:cargo run您應(yīng)該看到
    發(fā)表于 05-20 08:00

    使用rust開(kāi)發(fā)stm32系列教程

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

    何用 rust 語(yǔ)言開(kāi)發(fā) stm32

    本文介紹如何用 rust 語(yǔ)言開(kāi)發(fā) stm32。開(kāi)發(fā)平臺(tái)為 linux(gentoo)。硬件準(zhǔn)備本文使用的芯片為 STM32F103C8T6。該芯片性?xún)r(jià)比較高,價(jià)格低廉,適合入門(mén)學(xué)習(xí)。需要
    發(fā)表于 11-26 06:20

    RUST在嵌入式開(kāi)發(fā)中的應(yīng)用是什么

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

    Rust代碼中加載靜態(tài)庫(kù)時(shí),出現(xiàn)錯(cuò)誤 ` rust-lld: error: undefined symbol: malloc `怎么解決?

    我正在 MCUXpresso IDE 中創(chuàng)建個(gè)靜態(tài)庫(kù)。我正在使用 redlib 在我的代碼中導(dǎo)入 ` [i]stdlib.h`。它成功地構(gòu)建個(gè)
    發(fā)表于 06-09 08:44

    何用Foxmail Server搭建郵件服務(wù)器

    何用Foxmail Server搭建郵件服務(wù)器 Foxmail Server(以下簡(jiǎn)稱(chēng)FMS)可以搭建出功能強(qiáng)大的郵件服務(wù)器。本文以FMS For Windows 2.0為例,從其設(shè)置、管理、收
    發(fā)表于 01-27 17:05 ?1364次閱讀

    何用Windows 2000 Server充當(dāng)軟路由

    何用Windows 2000 Server充當(dāng)軟路由  這是通過(guò)在Windows 2000 Server上安裝多塊網(wǎng)卡,利用Windows 2000 Server自帶的路由器功能實(shí)
    發(fā)表于 01-29 11:20 ?1621次閱讀

    Rust開(kāi)發(fā)操作系統(tǒng)教程之如何自制個(gè)操作系統(tǒng)

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

    使用tokio實(shí)現(xiàn)個(gè)簡(jiǎn)單的Client和Server通訊模型

    系列是關(guān)于用Rust構(gòu)建個(gè)KV Server
    的頭像 發(fā)表于 09-09 09:45 ?2585次閱讀

    使用Protobuf實(shí)現(xiàn)客戶(hù)端與服務(wù)器之間的通信協(xié)議層

    系列是關(guān)于用Rust構(gòu)建個(gè)KV Server
    的頭像 發(fā)表于 09-14 09:26 ?2729次閱讀

    Xilinx KV 260構(gòu)建一個(gè)人臉識(shí)別車(chē)庫(kù)門(mén)鎖

    電子發(fā)燒友網(wǎng)站提供《Xilinx KV 260構(gòu)建一個(gè)人臉識(shí)別車(chē)庫(kù)門(mén)鎖.zip》資料免費(fèi)下載
    發(fā)表于 10-26 11:24 ?7次下載
    Xilinx <b class='flag-5'>KV</b> 260<b class='flag-5'>構(gòu)建</b><b class='flag-5'>一個(gè)</b>人臉識(shí)別車(chē)庫(kù)門(mén)鎖

    Rust構(gòu)建QEMU插件的框架

    Cannonball 是個(gè)Rust 構(gòu)建 QEMU 插件的框架!您可以在 C 語(yǔ)言的 QEMU TCG 插件中執(zhí)行的任何操作,都可以使用cannonball。編寫(xiě)以最小的開(kāi)銷(xiāo)和盡
    的頭像 發(fā)表于 07-21 16:57 ?1148次閱讀

    何用Rust通過(guò)JNI和Java進(jìn)行交互

    近期工作中有Rust和Java互相調(diào)用需求,這篇文章主要介紹如何用Rust通過(guò)JNI和Java進(jìn)行交互,還有記錄下開(kāi)發(fā)過(guò)程中遇到的些坑。
    的頭像 發(fā)表于 10-17 11:41 ?1080次閱讀

    何用Rust編寫(xiě)個(gè)ChatGPT桌面應(yīng)用(保姆級(jí)教程)

    為什么我們需要個(gè)桌面應(yīng)用 原因?qū)嵲谔啵覀冃枰憬莸?導(dǎo)出 記錄,需要在回答長(zhǎng)度超長(zhǎng)的時(shí)候自動(dòng)加上“繼續(xù)”,需要 收藏 些很酷很實(shí)用的prompt...... (首先我假設(shè)你是
    的頭像 發(fā)表于 09-25 11:19 ?598次閱讀
    如<b class='flag-5'>何用</b><b class='flag-5'>Rust</b>編寫(xiě)<b class='flag-5'>一</b><b class='flag-5'>個(gè)</b>ChatGPT桌面應(yīng)用(保姆級(jí)教程)

    何用FastMCP快速開(kāi)發(fā)自己的MCP Server

    的感受到了基于AI大模型和 MCP可以非常方便的構(gòu)建自己的AI智能體工作流。在此基礎(chǔ)上,不少讀者咨詢(xún),如何將自己已有的工具或函數(shù),制作成MCP Server給AI大模型調(diào)用呢?本文從零開(kāi)始介紹
    的頭像 發(fā)表于 05-07 16:07 ?837次閱讀
    如<b class='flag-5'>何用</b>FastMCP快速開(kāi)發(fā)自己的MCP <b class='flag-5'>Server</b>?
    主站蜘蛛池模板: 香蕉久久夜色精品国产小说 | 亚洲在线a| 污色网站 | 7777在线 | 精品精品国产理论在线观看 | 国产免费人成在线看视频 | 免费精品99久久国产综合精品 | 日本美女黄视频 | 国产成人毛片视频不卡在线 | 色综合久久98天天综合 | 五月天丁香激情 | 99 久久99久久精品免观看 | 久久久久无码国产精品一区 | 波多野结衣一级特黄毛片 | 夜夜夜爽爽爽久久久 | 一级做a爱片在线播放 | 夜夜草天天干 | 手机在线黄色 | 91大神在线精品网址 | 精品欧美一区二区三区 | 免费日本网站 | 999伊人 | 2020欧美极品hd18| 欧亚色视频 | 瑟瑟网站免费 | 日本久久高清视频 | 91大神在线观看精品一区 | 最近最新免费视频 | 免费人成年激情视频在线观看 | 人人澡人人添 | 狼色网| 免费能直接在线观看黄的视频 | 一 级 黄 色 片生活片 | 欲妇放荡叫床很浪的小说 | 免费观看在线观看 | 一级特色黄大片 | 2021韩国理论片ok电影天堂 | 欧美系列在线 | 色在线免费视频 | 夜夜爽66 | se97se成人亚洲网站 |