CloudWeGo Study Group 是由 CloudWeGo 社区建议的学习小组,展开以 30 天为一期的源码解读和学习活动,协助新成员融入社区圈子,和社区 Committer 互动沟通,并学习上手 CloudWeGo 几大结构项目。

CSG 活动第三期主要以学习 Rust 言语为背景,对 Volo 和 Monoio 源码进行解读。本期活动期间将会安排 4 期直播共享,围绕的主题分别为:

  • Rust 言语的特性、CloudWeGo 挑选 Rust 言语进行深化探究的原因以及 Volo 结构产生的初衷;
  • Rustcc 聊天室:Volo 结构的规划准则、怎么上手以及结构规划特色;
  • Go 工程师怎么测验运用 Rust,怎么从 Go 转型 Rust、调用 Rust 办法,Go 测验和搬迁运用 Volo 结构的运用本钱和优点;
  • 根据 io-uring 的高功用 Rust Runtime:Monoio 的技术特色及规划完结。

本文收拾自 CSG 第三期榜首场直播中字节跳动架构研制工程师刘捷共享内容。

回放链接:meetings.feishu.cn/s/1ib1i995f…

01 嘉宾介绍

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

本次共享内容主要分为以下两个部分:

  1. CloudWeGo 挑选 Rust 言语进行深化探究的原因;

  2. 创立 RPC 结构 Volo 的原因。

02 前语

咱们或许或多或少都接触过 Rust 言语的相关信息。

前段时刻,微软 Azure CTO 呼吁运用 Rust 替代 C/C++。Elon Mask 说自己是 Rust 的粉丝,但是却挑选运用 C++。这种关于言语的口水战是长久以来都是不可防止的,咱们理性看待就好。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

在 Rust 言语范畴,咱们也或许常常会听到某个公司用 Rust 重写了某个项目,获得了哪些收益。究竟在 Rust 言语里边有一句玩笑话,“全部能用 Rust 完结的,终将会用 Rust 重写”。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

咱们也常常会听到关于 Rust 言语的草创公司获得融资的消息。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

除了这些在 Rust 言语编写之外的信息,咱们也会接触到编写 Rust 的相关信息,比方与编译器斗智斗勇、泛型束缚过长以及强大的宏编程。

03 深化探究 Rust 的原因

经过了解以上信息,咱们现已有了关于 Rust 言语的初印象。那么 CloudWeGo 为什么要挑选 Rust 这门言语进行深化探究呢?这不得不提到 Rust 的开展进程。

Rust 开展进程

Rust 言语由 Graydon Hoare 私家研制,他是专门给言语开发编译器和东西集的工程师,他期望开发一种确保安全的一同又能具有高功用的言语。2006 年,他开端进行研制。2008 年,他被 Mozilla 聘任,其时 Mozilla 要开发 Servo 引擎,想要确保安全的一同又能具有高功用,于是他们一拍即合,Graydon Hoare 得到了 Mozilla 的资助。2010 年,Rust 言语初次发布 0.1.0 版别,用于 Servo 引擎的研制。2010 – 2015 年期间,Rust 阅历了 GC 移除等一系列演进,以确保高功用。2015 年,Rust 发布 1.0 版别,这也表示正式官宣 Rust 趋于稳定。2015 – 2018 年,Rust 达成了生产力的承诺,也便是它的东西文档还有编译器变得愈加智能,也对开发者愈加友好了。2018 – 2021 年,Rust 做了更多异步生态的完善,这也使得这门言语逐渐走向老练。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

Rust in 2022

2022 年现已是 Rust 连续第七年位居 Stack Overflow 最受开发者喜爱的编程言语榜榜首。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

为了给办理和开发 Rust 项目的维护者供给一些支撑,Rust 成立了基金会。有了 AWS、谷歌这些大公司的支撑,Rust 的开展也有了必定的保障。一同,Rust 行将融入到 Linux 6.1 版别中,除了 C 言语之外,Rust 是 Linux 内核迄今为止承受的仅有言语,这足以看出 Rust 在业界的重量级和影响力。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

此外,作为 WebAssembly 范畴的首选言语,由 Rust 编写的 WebAssembly 运行时 Wasmtime 发布了 1.0 版别,这也意味着它到达了稳定状况和生产可用性。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

最近 Reddit 的论坛上 Rust 的订阅人数突破了 200K,初次超越了 Go 言语的订阅者人数。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

Rust 2024

Rust 的未来开展会是什么样子的呢?凭借 Rust 官方团队成员的一句话来阐明,“the year of everywhere”,也便是说运用 Rust 言语编写的开源项目会有爆发性的增加。那么为什么能够猜测它会被大范围运用呢?这完全得益于 Rust 关于易用性的建造规划。2021 – 2024 年,Rust 有一个 2024 规划,主题叫做 Scaling Enpowerment(扩展授权)。之所以取这个姓名,是由于 Rust 有一个目标——“empower everyone to build reliable and efficient software”。Rust 最重视也是咱们常常诟病的一点,便是 Rust 的整个学习曲线十分峻峭,所以在这个规划中写道 “Flatten the learning curve”。

Rust 优势

CloudWeGo 挑选 Rust 言语进行探究,是由于 Rust 言语具有以下三大特性。

高功用

  • 根据 RAII 的内存办理

RAII 是将内存资源和目标绑定在一同。在创立目标时将资源分配出去,在毁掉目标时把内存资源直接释放掉。相比于 JAVA / Go 等带有 GC 的言语,在 Rust 言语中,失效目标相对应的内存资源能够得到立马释放,不需求等待某一个时刻点由 GC 进行一致的内存收回,防止了功用损失。

  • 严厉的束缚

Rust 言语的译器对程序员的代码要求会更严厉,除了完结正常功用之外,它还能获取到一些额外的编译信息,以辅佐编译器做极致的优化。

  • 零本钱笼统

零本钱笼统能够理解为你用不到功用,就不需求为之付出代价。例如,Rust 这门言语是几乎没有运行时的,也便是说你在完结一个纯同步代码的功用时,产品里边不会包含异步运行时的开销。

下图是从各言语 Benchmark 里边截取的纯核算 case。能够看出 Rust 的功用是十分优异的,能够与 Go 言语、C++ 等相媲美。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

可靠性

内存安全

内存安全是由两方面保障的,分别是一切权和生命周期。

  • 一切权

一切权指的便是任何资源有且只能有一个绑定目标。如下图所示,这相当于栈上有一个 S1 指针,指向了堆上面的一块内存资源。之后把 S1 仿制给 S2,这个行为在不同言语中有不同的处理方法。在其他言语中,这一次的仿制行为就会默许是一次拷贝,此刻 S1 和 S2 都能够拜访那一块堆上的内存资源。但是在 Rust 言语中,这是一次移动语义,也便是说这次仿制把这一块内存资源的一切权从 S1 搬运到了 S2,S1 也会因而失效而无法运用。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

所以把它打印出来运用的时分,编译器就会报错,这个值现已被移动了。这处理了内存安全中的榜首个痛点,即关于同一块内存资源的二次释放问题。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

  • 生命周期

生命周期是关于引证的约束,它确保的是被引证的目标存活时刻必定长于引证者。这就意味着你引证的目标必定是有效的。如下图所示,r 引证了 x,但是在第六行对 r 进行操作的时分,x 现已在大括号的效果域里边消亡了。

此刻编译器也会报错。这就处理了内存安全中的第二个痛点——悬垂指针的问题。

并发安全

Rust 言语中是经过 Send 和 Sync 这两个符号的 Trait 完结的,Trait 能够理解为编程言语里边的一个接口。Send 和 Sync 里边都是没有任何办法声明以及办法体的,所以二者仅仅是作为符号信息供给给编译器,辅佐编译器拒绝一些线程不安全的代码。

  • Send: 完结 Send 的类型能够在多线程间搬运一切权。

这个拒绝的进程是怎样的呢?以在并发安全里最常见的 Data Race 为例,在不同线程间对同一个变量进行读写的数据争用,下图中 spawn 办法代表的意义是在 Rust 里边开端一个线程。

咱们能够看到它关于函数 F、类型 T 都有 Send 的束缚。这个 Send 的意义是完结 Send 类型,它能够在多线程间搬运一切权,也便是说现在有线程 A 和线程 B,假如 T 的一切权从线程 A 搬运到了线程 B,那么能够防止线程 A 和线程 B 一同对 T 进行读写操作,防止产生数据争用。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

  • Sync: 完结 Sync 的类型能够在多线程间共享引证。

类型 T 所映射的是引证,这便是 Sync 这个符号能够发挥的效果。假如是一个引证的类型需求完结 Send,那么就必须确保这个类型完结了 Sync 符号,以此防止数据竞赛。

想了解更多关于 Send 和 Sync,能够检查下方链接。

The Rustonomicon: doc.rust-lang.org/nomicon/sen…

生产力

Rust 言语是一门工程实践言语。它不需求遵循某一个特定的编程范式,开发这门言语的编程人员也一同在用这门言语完结一些生产工作。因而 Rust 言语有以下四个特色:

  • 智能的编译器

调查研究标明,由于 Rust 言语的编译器报错信息愈加翔实智能,运用 Rust 言语的开发者在开发进程中 Stack Overflow 运用更少一些。

  • 完善的文档

Rust 秉持“注释即文档”的理念。假如你想用某个库完结必定的功用,一般依照它的示例阐明就能够快速上手。

  • 完全的东西链

Rust 是一个多渠道支撑的言语。

调查研究标明,由于 Rust 言语的编译器报错信息愈加翔实智能,运用 Rust 言语的开发者在开发进程中 Stack Overflow 运用更少一些。

  • 老练的包办理

它能够协助你更好地处理一些依赖。并且每当遇到一个新项目,你能够快速找到一个入口去上手。

最终,最重要的一点是,假如运用 Rust 这门言语,你完全能够信任别人的代码。由于假如别人的代码里有内存安全或者并发安全问题,根本都是编译不过的。

Benefits

了解 Rust 这门言语的三大优势后,我从个人的角度动身,共享一些 Rust 言语值得被挑选的理由。

榜首,Rust 协助你成为更好的程序员。Rust 这门言语足够底层,究竟它能够融入到 Linux 内核中。在编写 Rust 的进程中,咱们不可防止地会接触到一些底层相关的知识。此外,Rust 的编译器非严厉。在写代码的进程中,它会强制你去考虑,从你所写的代码一直考虑到内存堆栈引证、变量效果域等一系列内容。

第二,互联网的粗野成长早晚会到尽头,硬件的摩尔定律也在失效,后续或许便是存量优化的阶段,这个时分 Rust 这门言语就十分合时宜了。

第三,Rust 言语开发的项目会更稳定,也更好维护。由于它把运行时或许呈现的一些问题提前到编译时期进行处理。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

Go or Rust

假如把 Go 言语和 Rust 言语进比照,结果会是怎样的呢?

如下图所示,无论是呈现时刻,开展进程还是适用范畴,二者都相差不大,但二者并不是敌对联系,而是合作联系,它们是扬长避短的。究竟言语仅仅东西,许多时分这个东西只要运用起来称心如意就能够。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

2021 年 Go 开发者调研的报告显现,假如在新项目中挑选替代 Go 言语的另一种言语,挑选 Rust 言语的占比是最高的。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

那么在运用这两种言语时应该怎么挑选呢?

一般关于功用不灵敏的运用、重 IO 的运用以及需求快速开发快速迭代胜过稳定性的运用,引荐运用 Go 言语,这种运用运用 Rust 并不会带来显着的收益。

而关于需求极致功用、重核算的运用,以及需求稳定性并能承受必定开发速度损失的运用,引荐运用 Rust,Rust 在极致功用优化和安全性上的优势能够在这类运用中得以发挥。

在初步了解 Rust 言语后,对 Rust 言语感兴趣的同学或许期望能够动手实际操作一下,所以接下来介绍一下 Rust 的装置和运用。

Rust 装置

  • 环境变量

咱们一般运用 RUSTUP 进行 Rust 东西链的装置和办理。一般能够先在你的体系上装备这两个环境变量,下面是咱们团队维护的 RUSTUP 镜像,它能够加速在国内的下载。

RUSTUP_DIST_SERVER=”rsproxy.cn”

RUSTUP_UPDATE_ROOT=”rsproxy.cn/rustup”

  • 装置

装置分为以下两种状况:

榜首,假如是 Linux 以及 MacOS 体系,在终端履行这条命令即可。

Linux/MacOS: curl –proto ‘=https’ –tlsv1.2 -sSf https://rsproxycn/rustup-init.sh | sh

第二,假如是 Windows 体系,下载下方链接中的 exe 可履行文件,后续依照默许的装置装备操作即可。

Windows: static.rust-lang.org/rustup/dist…

  • 验证

装置成功的验证是在终端以及命令行里边输入 rustc -version,能够看到依照以下格局显现的最新稳定版别的版别号、对应的 Commit Hash 和 Commit 日期:

rustc x.y.z(abcabcabc yyyy-mm-dd)

这就代表现已装置成功。

环境装备

装置成功后要进行环境装备,装备文件:

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

IDE

Rust 有 VS Code 和 Clion 两种编辑器可供挑选。

VS Code

如下图所示,VS Code 只需装置 Rust Extension Pack 扩展包即可,其间最重要的是 rust-analyzer,它作为一个言语的服务器后端,能够协助你进行代码诊断。下图左侧的其他部分是比较引荐的 Extension,能够用来辅佐开发,其间 CodeLLDB 是 Rust 用来 Debug 的东西。

图中右侧是比较引荐的 VS Code 设置。其间第三个设置在保存代码文件时,能够改成 clippy,也便是检查东西,它能够协助改进你的代码。将第四个设置中 build.rs 打开,能够协助你在履行项目代码之前编译履行 build.rs 的脚本。最终一个设置是关于 Rust 进程宏,能够协助你能够更好地写宏以及看别人写的宏。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

Clion

Clion 需求装置 Rust 插件,装置之后打开图中所示 build.scripts 脚本选项即可。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

Hello World

最终就能够正式进行 Hello World Demo 的运用了,能够依照以下步骤进行:

  • 创立新项目: cargo new he ello_world
  • 运用 VS Code 打开:codel hello_world
  • 跑起来:cargo run

咱们能够看到下图中 Hello World 的项目结构。src 是源码目录,main.rs 里边有 main 函数。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

Cargo.toml 能够协助你办理包的信息以及依赖的引入。Cargo.lock 根本无需改动,它是 Cargo 主动生成的,能够协助你办理。target 里边是一些编译产品。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

学习资源

  • The Book: doc.rust-lang.org/book/
  • Rust By Example: doc.rust-lang.org/rust-by-exa…
  • Rustlings: github.com/rust-lang/r…
  • Async Rust: rust-lang.github.io/async-book/
  • 汇总: github.com/ctjhoa/rust…

04 创立 Volo 的原因

Volo 是字节跳动服务结构团队研制的轻量级、高功用、可扩展性强、易用性好的 Rust RPC 结构,运用了 Rust 最新的 GAT 和 TAIT 特性。在字节内部,Volo 现已落地多个事务和基础组件,并且取得了超预期的功用收益。

明晰了 CloudWeGo 挑选 Rust 言语的原因以及 Rust 的优势,我也详细阐述一下发明 Volo 结构的原因。

生态现状

发明 Volo 结构与其时的生态状况是有关的。咱们其时调研过整个社区的生态,发现没有生产可用的 Async Thrift 完结。哪怕是社区中最老练的 Tonic 结构,它的服务治理功用也是比较弱的,并且易用性也不够强。更重要的是其时在 Rust 言语社区,还没有根据 Generic Associated Type(GAT,Rust 言语最新的⼀个重量级 Feature)和 Type Alias Impl Trait(TAIT,另⼀个重量级 Feature)的规划。

GAT & TAIT

GAT 和 TAIT 是现在只能在 Nightly Rust 上运用的特性,这两个特性也是 Rust 官方团队“2021 – 2024 三年规划”中三项重点工作其间两项。感兴趣的同学可自行进一步了解。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

一个 Timeout 中间件

从下图咱们能够直观地看到,假如采用之前社区的方法来编写一个最简略的 Timeout 中间件,在功用不损耗的状况下,代码量也是十分大的。在运用 GAT 和 TAIT 特性后,不只代码量削减一倍,并且逻辑也愈加简略明晰了。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

Volo 优势

易用性

Rust 以难学难用而出名,咱们期望尽或许地下降用户运用 Volo 结构和 Rust 言语编写微服务的难度,供给给用户最契合人体工程学和直觉的编码体验,因而咱们把结构易用性作为重要目标之一。只有让咱们真实地运用 Volo,Volo 才能表现它的价值。所以 Volo 结构根据 GAT 和 TAIT 特性,大大提升了用户编写中间件的便当程度。除此之外,咱们供给了 Volo 命令行东西生成默许 Layout,并且 Volo 的命令行东西供给 IDL 办理的才能,这在业界是首例。咱们还供给了进程宏等能够再度下降 Service 编写难度的功用。当然还有许多其他的精心规划,比方许多 API 都是尽量以最契合人体工程学的方法给出的,也能够防止误用。

扩展性

  • 根据 Service 的笼统

获益于 Rust 强大的表达和笼统才能,开发者能够根据十分灵敏的 Service 笼统,用一致的形式对 RPC 的元信息恳求和呼应做一些处理,比方服务发现、负载均衡等服务治理功用都是直接完结 Service 即可。

  • 根据 RPC 元信息的操控

另外,在咱们的结构规划中,一切结构行为都是受到 RPC 元信息操控的。因而咱们只要在 Service 中对 RPC 元信息进行修改,就能直接操控结构的行为,然后完结所需的功用。

下图是 Volo 自带的负载均衡中间件完结中最关键的一部分,即赤色线框圈出的代码。只要把 Load Balance 选出来的地址放到 RPC 元信息中,就能够操控结构对这个对端地址建议恳求。

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

高功用

假如过多谈论结构的功用比照,容易引战。但是根据 Rust 言语的功用优势以及 CloudWeGo 团队关于极致功用的追求,咱们能够预想到 Volo 的功用也是十分高的。

假如把 Volo 和 Kitex 进行跨言语的比照也是不太公平的,但是由于许多用户都重视功用数据,为了让运用者对 Volo 结构的功用有大致的了解,咱们只给出比较简略的功用数据。

  • 在与 Kitex 相同的测试条件(约束 4C)下,Volo 极限 QPS 为 35W。
  • 咱们内部正在验证根据 Monoio(CloudWeGo 开源的 Rust Async Runtime)的版别,极限 QPS 能够到达 44W。

实际事务收益

在结构的实践进程中,咱们尽或许在编译期就确认类型巨细,防止在堆上的内存动态分配。一同在数据传输以及转化的进程中,咱们会尽量削减内存拷贝。我选取了由 Go 搬迁到 Volo 结构的两个事务,呈现真实的事务落地收益。

1.事务 A(Proxy 类)。A 事务的 IO 比较多,是 IO bound 类型的事务,搬迁到 Volo 结构后的各方面数据如下:

  • CPU: -39.68%
  • MEM: -77.78%
  • P99: -76.67%
  • AVG: -70%

2.事务 B(有很多事务逻辑)。事务 B 是一个核算密集型的事务,是 CPU bound 类型的事务,运用 Volo 结构后数据如下:

  • CPU: -43.75%
  • MEM: -69%
  • P99: -43.22%
  • AVG: -47.81%

因而咱们能够总结,不论是 IO bound 还是 CPO bound 类型的事务,运用 Volo 结构后 CPU 、内存和延时指标都有显着的优化。

相关生态

随着 Volo 结构开源,一同开源的一切生态如下:

  • Volo是 RPC 结构的姓名,包含了 Volo-Thrift 和 Volo-gRPC 两部分。
  • Volo-rs 安排:Volo 的相关生态。
  • Pilota:Volo 运用的 Thrift 与 Protobuf 编译器及编解码的纯 Rust 完结。
  • Motore:Volo 参考 Tower 规划的,运用了 GAT 和 TAIT 的 middleware 笼统层。
  • Metainfo:Volo 用于进行元信息透传的组件,定义了一套元信息透传的规范。

Volo 相关地址

Volo 的项目结构如下图红线框圈出部分所示。假如想对 Volo 做奉献,能够多多重视 volo-thrift/volo-grpc/volo。一同咱们也供给了很多的 Good First Issue,咱们能够以练代学,参与到 Volo 的建造中来,咱们也会给咱们供给一些翔实的协助。以下是一切相关生态的库房地址。

欢迎咱们来提 Issue 或 PR,一同共建 Volo!

  • 官网: www.cloudwego.io/zh/docs/vol…
  • Good First Issue: github.com/cloudwego/v…
  • Volo: github.com/cloudwego/v…
  • Volo-rs: github.com/volo-rs
  • Pilota: github.com/cloudwego/p…
  • Motore: github.com/cloudwego/m…
  • Metainfo: github.com/cloudwego/m…

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

Demo

Rust RPC 结构的调用链如下图所示:

Rust 新手学习指南:为什么学 Rust?如何快速上手 Volo 框架?

具体调用 Demo 演示进程请参考直播视频回放链接:(从 41:18 处开端)

meetings.feishu.cn/s/1ib1i995f…

Demo 相关官网文档:
www.cloudwego.io/zh/docs/vol…

以上内容收拾自 CloudWeGo 源码解读活动第三期榜首场直播共享,获取 讲师 PPT 和回放视频,请重视 CloudWeGo 大众号,并在后台回复关键词 “Volo”

项目地址

GitHub:github.com/cloudwego

官网:www.cloudwego.io

CSG 三期:mp.weixin.qq.com/s/vwa09qkou…