每日一 R「15」实践课之 kv-server(一)
今天是实践课程,我们一起跟着老师来构建一个 KV server。在此之前,我们先来学习下 Rust 中一个 package 典型的目录结构。
01-典型的 package 目录结构
这是 Cargo 推荐的目录结构,其中主要的目录解释如下:
src 是源码目录
src/lib.rs 是默认的 lib 包根
src/main.rs 是默认的二进制包根,src/bin/ 是其他二进制的包跟
tests 是继承测试代码目录
benches 是基准测试代码目录
examples 是示例代码
Rust package 相关的更多内容,可以参考:[1] crate 和 module [2] cargo target
02-一个示例实现
首先,要实现课程中给出的示例,并能成功运行。包目录结构:
接下来,我们将一步步拆分,最终达到能够运行的目的。项目的源码我放在自己的 gitee 上,感兴趣的朋友可以克隆下来运行。
02.1-初始化项目
可以通过cargo new kv --lib
初始化一个项目。下文默认的当前目录是 package 根目录。编辑 Cargo.toml 添加如下 prost 和 prost-build 依赖。
02.2-编译 proto
在 package 根目录下,添加 abi.proto (proto 定义文件)和 build.rs (prost-build 编译脚本)
与 proto 编译相关的依赖包括:prost 和 prost-build
prost is a Protocol Buffers implementation for the Rust Language.prost-build makes it easy to generate Rust code from .proto files as part of a Cargo build.
如果想了解更多使用 prost-build 的例子,可以参考 [1] Snazzy
运行cargo build
会将 abi.proto 文件编译生成 src/pb/abi.rs 文件。
02.3-使用 module
通过 proto 定义并生成的数据结构作为当前 crate 的一个 module,需要在 src/pb 下放一个 mod.rs 引入该模块的其他文件。
mod.rs 与 Python 中的 init.py 有异曲同工之妙。lib.rs 作为库的入口文件(对应的,main.rs 作为可执行项目的入口文件),在它之中可以通过mod pb;
将 module 加载进来。
除了加载相关地文件外,mod.rs 中还为 abi.rs 中定义的 struct 实现了一些辅助 trait 和辅助方法。mod.rs 完整内容在 gitee.
因为 mod.rs 中用到了 KvError 类型,所以在 src 目录下添加一个 error.rs。
02.4-运行示例
现在到了最后一个环节了,在 examples 下添加 server.rs 和 client.rs。
server 的代码来自于课程中的示例,主要思路是:
通过 tokio 中的 TcpListener 监听本机的 9527 端口,
在无限循环中接受客户端的链接
当客户端连接后,使用 tokio::spawn 创建新的线程来处理客户端链接
client 的代码来自于课程 github,主要思路是:
通过 tokio 中的 TcpStream 链接到本地 9527 端口
生成一个 HSET 命令,发送给服务端,等待响应
好了,到此为止,我们所有的要素都准备好了,可以尝试运行一下了。运行效果如下图所示:
本节课程链接:
版权声明: 本文为 InfoQ 作者【Samson】的原创文章。
原文链接:【http://xie.infoq.cn/article/452b7aa21fefa5572d9b8b3d1】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论