我的 Rust 之旅,以及如何學(xué)習(xí) Rust
Rust 越來越受歡迎。通過 2022 年 StackOverflow 開發(fā)者調(diào)查,我們可以看到很多人對 Rust 感興趣。
Rust 已經(jīng)連續(xù) 7 年成為最受喜愛的編程語言,87% 的開發(fā)者表示他們想繼續(xù)使用 Rust。
Rust 也與 Python 并列成為最受期待的技術(shù),TypeScript 緊隨其后。
最受期待
圖片
最受喜愛 vs 最令人憎惡
圖片
但 Rust 有一定的學(xué)習(xí)曲線。
這讓我想分享我的 Rust 學(xué)習(xí)之旅,為什么選擇 Rust, 以及如何學(xué)習(xí) Rust。
接觸 Rust
我在 Rust 剛剛發(fā)布的時候就聽說過它,我的印象是它是一種系統(tǒng)編程語言,可以替代 C/C++, 而且足夠安全。但是我當(dāng)時并沒有真正學(xué)習(xí)和使用它 (我只寫過 "Hello World"!)。
回到 5 年前,我正在領(lǐng)導(dǎo)公司基礎(chǔ)設(shè)施向云原生架構(gòu)的轉(zhuǎn)型。
我需要構(gòu)建一個完全基于 Prometheus 的監(jiān)控棧,來替換公司內(nèi)部使用了 10 多年歷史的一些監(jiān)控軟件,如 Nagios、Zabbix 和 Graphite。
是的,你沒有看錯,我們使用了很多監(jiān)控軟件。這主要出于幾個原因:
- 單一的軟件無法滿足所有需求
- 團(tuán)隊分散,大多數(shù)時候引入新軟件只是為了滿足特定需求,而不是解決問題
總之,這是一些歷史原因。
從我之前提到的情況來看,我們有一套自研的監(jiān)控軟件,歷史超過 10 年,可以看出,我們的基礎(chǔ)設(shè)施迭代速度很慢。
因為我們有自己的物理數(shù)據(jù)中心,這也導(dǎo)致了很多舊機(jī)器在我們的服務(wù)器上沒有更新過。(這也是我后來使用 Rust 的一個原因)
我首先在一個新啟用的小數(shù)據(jù)中心 (約 400 臺機(jī)器) 替換了監(jiān)控棧,效果很好。使用 Prometheus 完成了該小數(shù)據(jù)中心所有服務(wù)器及其運行的各種服務(wù)的監(jiān)控。我們還在 Grafana 上創(chuàng)建了儀表板,并通過 Alertmanager 創(chuàng)建了告警通知。
后來,我在兩個數(shù)據(jù)中心推廣了這種轉(zhuǎn)型,整體來說比較順利,包括 Kubernetes 的監(jiān)控也是在這個過程中完成的。
但是當(dāng)它實施在最后一個數(shù)據(jù)中心時,我遇到了最大的挑戰(zhàn)。
node_exporter 無法在某些機(jī)器上啟動,一些機(jī)器在運行一段時間后會自動崩潰。
我開始調(diào)查這個問題。對于自動崩潰的問題,我暫時通過添加一個重啟腳本來修復(fù)了。
我主要關(guān)注的是為什么 node_exporter 無法啟動。我發(fā)現(xiàn)這部分機(jī)器的操作系統(tǒng)是 CentOS 5, 內(nèi)核是 2.6.18。
我發(fā)現(xiàn)社區(qū)中已經(jīng)有類似的問題: https://github.com/prometheus/node_exporter/issues/691
與此同時,我也注意到 Go 文檔明確指出 CentOS 5 不受支持,需要 2.6.32 或更高版本的內(nèi)核。
(我忘了在我當(dāng)時排查問題時,所需要的依賴的最低版本,但通過 Web archive[1],我看到 2017 年需要的最低內(nèi)核版本是 2.6.23)
經(jīng)過一些搜索,我也看到了類似 "如何在 CentOS 5.9 上安裝 Go 1.1" 的內(nèi)容,但同時也提到了一些已知的問題。
所以我不打算繼續(xù)在這里浪費時間。
我想自己換個技術(shù)棧重新實現(xiàn)一個類似 node_exporter 的工具,也就很自然的可以解決上述自動崩潰的問題了。
經(jīng)過一番權(quán)衡,最終,我使用 Rust 實現(xiàn)了一個類似 node_exporter 的工具,并完成了監(jiān)控系統(tǒng)的升級和轉(zhuǎn)型。
這就是我開始在生產(chǎn)環(huán)境中使用 Rust 的起點。
接下來,讓我介紹為什么我選擇 Rust。
圖片
為什么選擇 Rust
我上面介紹了一些背景。當(dāng)時最簡單的選擇應(yīng)該是 Python, 它足夠簡單,生態(tài)也很豐富。與此同時,我在 Python 開發(fā)也有多年經(jīng)驗,我可以快速構(gòu)建所需的工具。
當(dāng)時我不選擇 Python 的原因是:
- 并非所有這些機(jī)器都有 Python 環(huán)境,Python 版本也不盡相同。我被要求盡量不要修改這些機(jī)器上的環(huán)境;
- 因為我可能會對我開發(fā)的新工具做一些修改,所以后續(xù)的分發(fā)可能不太方便;
然后我重新思考了我的目標(biāo):
- 可以編譯成二進(jìn)制可執(zhí)行文件,方便分發(fā)和部署。我使用 Ansible 進(jìn)行統(tǒng)一部署。
所以更合適的選擇是 C/C++/Rust。
我在 C 開發(fā)上有更多經(jīng)驗,C++ 也有一些經(jīng)驗。對于我的第一個需求,上述三種語言都可以很輕松地實現(xiàn)。
當(dāng)大多數(shù)人比較 Rust 和 C/C++ 時,他們在比較它們的性能和安全性。
而在當(dāng)時我的用例中,我認(rèn)為在其他兩種語言中的結(jié)果不會比 Rust 差,盡管這也是一個考慮因素。而且當(dāng)時我剛開始學(xué)習(xí) Rust, 我的 C 實現(xiàn)可能會比 Rust 更好。
但我想挑戰(zhàn)自己,嘗試一些新事物,而且就 Prometheus 監(jiān)控而言,C/C++ 相關(guān)的生態(tài)并不太活躍。另一點是我認(rèn)為 Rust 將有很大的發(fā)展前景。
所以最終我選擇了 Rust。
我是如何學(xué)習(xí) Rust 的
Rust 并不簡單,它與其他語言也有一些不同,所以在其他語言中有效的一些做法在 Rust 中可能無法奏效。
由于我有一個具體的問題需要解決,我需要實現(xiàn)一個 node_exporter 來完成監(jiān)控棧的轉(zhuǎn)型。所以我是通過 "邊學(xué)邊做" 的方式來學(xué)習(xí) Rust 的。
我首先快速瀏覽了以下內(nèi)容:
- The Rust Programming Language[2]: 這本書非常完整,我一開始并沒有完全讀完。取而代之的是,使用它來理解 Rust 的主要概念和一些用法。
- Rust By Example[3]: 這里有很多示例,你也可以通過練習(xí)這些示例來增加對 Rust 的熟悉度;
- Rust std lib docs[4]: 標(biāo)準(zhǔn)庫文檔,快速概覽,了解一些關(guān)鍵詞、模塊等。但最初沒必要完整閱讀。
通過這種方式,我很快就實現(xiàn)了一個基本的 node_exporter 版本。然后繼續(xù)迭代并應(yīng)用到生產(chǎn)環(huán)境,完成了 Prometheus 監(jiān)控棧的構(gòu)建。
后來,我繼續(xù)在 Rust 中實現(xiàn)了一些小工具,學(xué)習(xí)了它的最佳實踐,并學(xué)習(xí)了一些用 Rust 實現(xiàn)的開源項目,以增加我的 Rust 經(jīng)驗。
推薦一些 Rust 學(xué)習(xí)資源
現(xiàn)在有很多 Rust 的學(xué)習(xí)資源。除了我前面列出的,我還推薦以下免費內(nèi)容:
- Take your first steps with Rust - Training | Microsoft Learn[5]
- rust-lang/rustlings: 一些小練習(xí),讓你適應(yīng)閱讀和編寫 Rust 代碼!
視頻:
- Rust Crash Course | Rustlang - YouTube[6]
- Rust Tutorial - YouTube[7]
- Rust for Beginners - YouTube[8]
總結(jié)
這就是我的 Rust 學(xué)習(xí)之旅的開始,它一直在繼續(xù)。
盡管我仍然持續(xù)的關(guān)注云原生和 Kubernetes 相關(guān)的技術(shù),并且我寫 Go 語言更多,但我也仍然會用 Rust 編寫一些工具,并在 WebAssembly 中使用 Rust。
參考資料
[1]Web archive: https://web.archive.org/web/20170916192117/https://github.com/golang/go/wiki/MinimumRequirements
[2]The Rust Programming Language: https://doc.rust-lang.org/stable/book/
[3]Rust By Example: https://doc.rust-lang.org/rust-by-example/
[4]Rust std lib docs: https://doc.rust-lang.org/std/index.html
[5]Microsoft Learn Rust path: https://learn.microsoft.com/en-us/training/paths/rust-first-steps/
[6]Rust Crash Course: https://www.youtube.com/watch?v=zF34dRivLOw&utm_source=blog.moelove.info&utm_medium=content
[7]Rust Tutorial: https://www.youtube.com/watch?v=T_KrYLW4jw8&list=PLzMcBGfZo4-nyLTlSRBvo0zjSnCnqjHYQ&utm_source=blog.moelove.info&utm_medium=content
[8]Rust for Beginners: https://www.youtube.com/playlist?list=PLlrxD0HtieHjbTjrchBwOVks_sr8EVW1x&utm_source=blog.moelove.info&utm_medium=content