MoeLove

我的 Rust 之旅,以及如何学习 Rust

我将在这篇文章中分享我的 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

2023-01-14 01-16-33屏幕截图.png

2023-01-14 01-16-07屏幕截图.png

但是 Rust 的学习曲线比较特殊

pic from Rust User Team Samara - &Meetup1

这让我想要回顾一下自己的 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 的原因在于:

然后我重新思考了我的目标:

所以比较合适的选项是 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 学习的。

我首先快速的浏览了以下内容:

通过这种方式我很快就实现了一个基础的 node_exporter 版本, 然后进行持续的迭代,并将它应用到了生产环境, 完成了 Prometheus 监控堆栈的建设。

后来,我持续用 Rust 实现了一些小工具,并学习它的最佳实践,学习一些通过 Rust 实现的开源项目,以此来增加我的 Rust 经验。

推荐一些 Rust 的学习资源

现在 Rust 的学习资源有很多,除了我上述列到的那些以外,我推荐如下免费内容:

videos:

总结

这就是我的 Rust 旅程如何开始的,现在它仍然在继续。

尽管我的主要方向是 Cloud Native 和 Kubernetes 相关的技术,并且现在写 Go 语言更多一些, 但我还是会用 Rust 写一些工具,以及在 WebAssembly 中使用 Rust。

后续我也会分享相关的内容,


欢迎订阅我的文章公众号【MoeLove】

TheMoeLove

Related Posts

Comments