跳转到主要内容

我将分享我的Rust之旅,我如何学习Rust以及一些免费的Rust学习资源。

Rust已经变得越来越流行。通过StackOverflow 2022开发者调查,我们可以看到许多人对Rust感兴趣。

Rust已经是第七年成为最受欢迎的语言,87%的开发者表示他们希望继续使用它。

Rust还与Python联系在一起,成为最受欢迎的技术,TypeScript运行速度很快

最需要的

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++,而且足够安全。但我没有学习和使用它

回到5年前,我曾领导公司的基础设施向云原生堆栈的转型。

我需要构建一个完全基于普罗米修斯的监控堆栈,以替换该公司拥有超过10年历史的一套监控软件。以及其他一些监控软件,如Nagios、Zabbix和Graphite。

是的,你没看错,我们使用了很多监控软件。这有几个原因:

  • 单一软件不能满足所有需求
  • 团队分散,大多数时候,引入新软件只是为了满足特定需求,而不是为了解决问题

总之,这里有一些历史原因。

而且,从我上面提到的内容来看,我们有一套自主开发的监控软件,已有超过10年的历史,正如你所看到的,我们的基础设施迭代缓慢。

因为我们有物理数据中心,这也导致服务器中的许多旧机器没有更新。(这是我后来使用Rust的原因之一)

我首先在一个新推出的小型数据中心更换了监控堆栈,大约有400台机器,效果很好。使用Prometheus完成对这个小型数据中心中所有服务器及其上运行的各种服务的监控。Grafana中也为其创建了仪表板,并通过Alertmanager创建了警报通知。

后来,我在两个数据中心推动了这些转换,总体上比较顺利,包括Kubernetes的监控也在这个过程中完成。

但当它在最后一个数据中心实施时,我面临着最大的挑战。

node_exporter无法在某些计算机上启动,某些计算机在运行一段时间后自动崩溃。

我开始调查这个问题。对于自动崩溃问题,我通过添加重新启动脚本临时修复了它。

我主要关心node_exporter无法启动的原因。我发现这部分机器的操作系统是CentOS 5,内核是2.6.18。

我发现社区中已经存在类似的问题:https://github.com/prometheus/node_exporter/issues/691

同时,我还注意到Go文档明确指出不支持CentOS 5,并且需要至少2.6.32或更高版本的内核。

(我检查时忘记了最小依赖项,但通过web存档,我发现2017年所需的最小内核版本是2.6.23)

经过一些搜索,我还看到了类似于如何在CentOS 5.9上安装Go 1.1的内容,但同时,文章中也提到了一些已知问题。

所以我不打算继续战斗。

我想自己重新实现一个,这也可以解决上述自动崩溃问题。

最后,我使用Rust实现了一个类似于node_exporter的工具,并完成了监控系统的升级和转换。

这就是我从Rust生产开始的旅程。

接下来,让我介绍一下为什么选择Rust。

为什么选择Rust

我已经介绍了上面的一些背景。那时,最简单的选择应该是Python,它足够简单,生态丰富。同时,我也有多年的Python开发经验,我可以快速构建所需的工具。

不选择Python的原因有:

  • 并非所有这些机器都有Python环境,Python的版本也不同。我被要求尽量不要修改这些机器上的环境;
  • 由于我稍后可能会做一些修改,我认为后续的分发可能不方便;

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

  • 可以编译成二进制可执行文件,以便于分发和部署。我使用Ansible进行统一部署。

因此,更合适的选项是C/C++/Rust。

我有更多的C开发经验和一点C++经验。对于我的第一个要求,上面三种语言可以很容易地满足。

当大多数人比较Rust和C/C++时,他们是在比较它们的性能和安全性。

在我当时的用例中,我不认为其他两种语言的结果会比Rust更糟糕,尽管这些也是考虑因素。由于当时我刚刚开始学习Rust,它可能比我的C实现更糟糕。

但我想要更多的挑战,尝试一些新的东西,就普罗米修斯监测而言,C/C++相关的生态系统并不十分活跃。另一点我认为Rust在未来会有很大的发展。

所以最后我选择了Rust。

我是如何学习Rust的

Rust并不简单,它与其他语言也不完全相同,因此在其他语言中工作的一些实践可能在Rust中不起作用。

由于我有一个需要解决的特定问题,我需要实现node_exporter来完成监视堆栈的转换。所以我通过边做边学的模式学习了Rust。

我首先快速查看了以下内容:

  • 《Rust编程语言》:这本书非常完整,我一开始没有完全读完。相反,使用它来理解Rust中的主要概念和一些用法。
  • Rust By Example:这里有很多示例,您也可以通过练习这些示例来增加对Rust的熟悉程度;
  • Rust-std-lib-docs:标准库的文档,快速概述,了解一些关键字、模块等。但最初不需要完整阅读。

通过这种方式,我很快实现了一个基本的node_exporter版本。然后继续迭代并将其应用于生产环境,并完成Prometheus监控堆栈的构建。

后来,我继续在Rust中实现一些小工具,学习了它的最佳实践,并学习了一些在Rust实现的开源项目,以增加我的Rust体验。

推荐一些Rust学习资源

Rust现在有很多学习资源。除了上面列出的内容,我还推荐以下免费内容:

视频:

总结

这就是我的Rust之旅是如何开始的,并且还在继续。

虽然我专注于云原生和Kubernetes相关的技术,现在我编写了更多的Go语言,但我仍然使用Rust编写了一些工具,并在WebAssembly中使用Rust。

今后,我还会分享相关内容。如果你对我的文章感兴趣,欢迎订阅我的通讯!

文章链接