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

    文章

    2212

    浏览量

    55238
  • 数据存储
    +关注

    关注

    5

    文章

    976

    浏览量

    50932
  • 网络通讯
    +关注

    关注

    0

    文章

    74

    浏览量

    11265

原文标题:用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 1349次阅读

    何用Windows 2000 Server充当软路由

    何用Windows 2000 Server充当软路由  这是通过在Windows 2000 Server上安装多块网卡,利用Windows 2000 Server自带的路由器功能实
    发表于 01-29 11:20 1595次阅读

    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 2701次阅读
    如<b class='flag-5'>何用</b>继电器<b class='flag-5'>构建</b>计算机的CPU

    使用tokio实现简单的Client和Server通讯模型

    系列是关于用Rust构建KV Server
    的头像 发表于 09-09 09:45 2327次阅读

    使用Protobuf实现客户端与服务器之间的通信协议层

    系列是关于用Rust构建KV Server
    的头像 发表于 09-14 09:26 2528次阅读

    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 914次阅读

    何用Rust通过JNI和Java进行交互

    近期工作中有Rust和Java互相调用需求,这篇文章主要介绍如何用Rust通过JNI和Java进行交互,还有记录下开发过程中遇到的些坑。
    的头像 发表于 10-17 11:41 797次阅读

    何用Rust编写ChatGPT桌面应用(保姆级教程)

    为什么我们需要桌面应用 原因实在太多,我们需要便捷地 导出 记录,需要在回答长度超长的时候自动加上“继续”,需要 收藏 些很酷很实用的prompt...... (首先我假设你是
    的头像 发表于 09-25 11:19 364次阅读
    如<b class='flag-5'>何用</b><b class='flag-5'>Rust</b>编写<b class='flag-5'>一</b><b class='flag-5'>个</b>ChatGPT桌面应用(保姆级教程)