我将在这篇文章中分享我的 Rust 学习之旅,我是如何学习 Rust 以及一些免费的 Rust 学习资源。这篇文章是去年首发在我的英文博客中的,只是之前一直没来得及翻译成中文。
Rust 已经变的越来越流行,通过 StackOverflow 2022 的调查问卷,可以看到很多人都在对 Rust 感兴趣。
Rust is on its seventh year as the most loved language with 87% of developers saying they want to continue using it.
Rust also ties with Python as the most wanted technology with TypeScript running a close second
- Most Wanted
- Most Loved vs. Dreaded
但是 Rust 的学习曲线比较特殊
这让我想要回顾一下自己的 Rust 旅程,并且介绍为什么我会选择 Rust,以及如何学习 Rust。
和 Rust 结缘
在 Rust 刚发布的时候我就已经听说了它,我对它的印象是可以代替 C/C++ 的一种系统编程语言,并且足够的安全。但是我并没有真正的去学习和使用它。 (我只用它写过 Hello World!)
时间回退到 5 年前,我在主导公司内基础设施向云原生堆栈的改造。
其中我需要构造一套完全基于 Prometheus 的监控堆栈,用来替换公司内部一套自己研发的,超过 10 年以上历史的监控软件。 以及一些其他的监控软件,比如 Nagios, Zabbix, Graphite。
是的,你没有看错,我们在用很多监控软件。这有一些原因:
- 单一的软件无法满足所有的需求
- 团队分散,大多数时候仅仅是为了满足特定的需要,便会引入新的软件,而非去真正解决问题
总之,这是一些历史原因。
并且,从我上述提到的,我们有一套自己研发的,超过 10 年以上历史的监控软件,你就可以看出来, 我们的基础设施的迭代速度很慢。
而且由于我们有自己的物理机房,这也导致了我们的服务器存在很多老旧的机器没有更新换代。(这也是后来我使用 Rust 的原因之一)
我首先在一个新上线的小型机房中进行监控堆栈的替换,大概 400 台机器,效果不错。 使用 Prometheus 完成了这个小型机房中所有的服务器,以及在上面运行的各种服务的监控, 还有在 Grafana 中为它们创建了 Dashboard,通过 Alertmanager 创建了报警通知。
后来,我又在两个机房中推进这些改造,整体而言也比较顺利,包括 Kubernetes 的监控也是在这个过程中完成的。
但是在最后的一个机房中实施的时候,我面临了最大的挑战。
node_exporter 在一些机器上无法启动,还有一些机器上出现了运行一段时间后自动崩溃的情况。
我开始调查这一问题。
对于自动崩溃的问题,我通过增加重启的脚本来临时修复了它。
我主要在关注为什么 node_exporter 无法启动的问题。我发现这部分机器的操作系统是 CentOS 5, 内核是 2.6.18 。
我发现在社区中已经有了类似的 issue : https://github.com/prometheus/node_exporter/issues/691
同时,我也注意到了 Go 的文档中明确写了不支持 CentOS 5,需要至少 2.6.32 以上版本的内核。
(我忘记了我当时查看时的最低依赖了,但是通过 web archive 我看到 2017 年时需要的内核版本最低是 2.6.23)
经过一些搜索,我也看到了类似 How to install Go 1.1 on CentOS 5.9 | Dave Cheney 这样的文章,但同时文章中也提到了一些已知的问题。
所以我不打算继续和它进行斗争。
我想要自己重新实现一个,这样也可以解决上述自动崩溃的问题。
最终我用 Rust 实现了一个类似 node_exporter 的工具,并完成了监控系统的升级和改造。
这就是我真正在生产环境中开始使用 Rust 的旅程。
接下来我介绍一下,为什么我选择 Rust。
为什么选择 Rust
上面我已经介绍了一些背景,在当时最简单的选择应该是 Python,足够简单,生态丰富, 同时,我也有很多年的 Python 开发经验, 我可以快速的构建出我需要的工具。
没有选择 Python 的原因在于:
- 这些机器上并不是都有 Python 环境,并且 Python 的版本也不一样,我被要求尽量不要修改这些机器上的环境;
- 由于我后续可能会进行一些修改,我认为后续的分发可能不太方便;
然后我重新思考了我的目标:
- 可以编译成二进制可执行文件,便于分发和部署,我当时使用了 Ansible 进行统一的部署。
所以比较合适的选项是 C/C++/Rust 。
我有比较多的 C 开发经验和一点 C++ 的经验,对于我的第一个需求而言,上述三种语言都可以比较轻松的满足。
大多数人在对比 Rust 和 C/C++ 的时候,都在对比它们的性能和安全性等方面。
而在我当时的用例中,尽管这些也需要考虑,但我不认为使用其他两种语言实现的结果会比用 Rust 更差。 并且由于我当时刚开始学习 Rust,可能比我用 C 实现要差一些。
不过我想要更多的挑战,尝试一些新鲜的东西,而且在 Prometheus 监控方面,C/C++ 相关的生态不太活跃。 还有一点我觉得 Rust 在未来会有很大的发展。
所以最终我选择了 Rust 。
我是如何学习 Rust 的
Rust 并不简单,而且它和其他语言并不完全相同,所以一些在其他语言中的做法在 Rust 中可能并不适用。
由于我有特定需要解决的问题,需要实现一个 node_exporter 完成监控堆栈的改造, 所以我是通过 Learning-by-doing 的模式进行 Rust 学习的。
我首先快速的浏览了以下内容:
- The Rust Programming Language :这本书很完整,我最初并没有完整的阅读它。而是通过它了解了 Rust 中的主要概念和一些用法。
- Rust By Example:这里有很多例子,通过练习这些例子也可以增加对 Rust 的熟悉程度;
- Rust std lib docs:标准库的文档,快速的浏览,了解一些关键字,模块等。但最初并不需要完整的阅读它。
通过这种方式我很快就实现了一个基础的 node_exporter 版本, 然后进行持续的迭代,并将它应用到了生产环境, 完成了 Prometheus 监控堆栈的建设。
后来,我持续用 Rust 实现了一些小工具,并学习它的最佳实践,学习一些通过 Rust 实现的开源项目,以此来增加我的 Rust 经验。
推荐一些 Rust 的学习资源
现在 Rust 的学习资源有很多,除了我上述列到的那些以外,我推荐如下免费内容:
- Take your first steps with Rust - Training | Microsoft Learn
- rust-lang/rustlings: Small exercises to get you used to reading and writing Rust code!
videos:
总结
这就是我的 Rust 旅程如何开始的,现在它仍然在继续。
尽管我的主要方向是 Cloud Native 和 Kubernetes 相关的技术,并且现在写 Go 语言更多一些, 但我还是会用 Rust 写一些工具,以及在 WebAssembly 中使用 Rust。
后续我也会分享相关的内容,
欢迎订阅我的文章公众号【MoeLove】