推薦一些值得學習的開源專案和框架

crossoverJie發表於2024-11-21

image.png
今天收到球友的問題,讓推薦一些值得看的開源專案,覺得 netty 這些太複雜了不太好上手。

確實如此,我們日常常用的 Spring、Netty 確實由於發展了多年,看起來比較頭大。

下面我來推薦一些我看過同時覺得不錯的專案(幾乎都是我參與過的),由易到難,其中也會包含 Java 和 Go 的專案,包含主流的中介軟體和雲原生專案。

Java 專案

xxl-job

難度:🌟🌟
推薦指數:🌟🌟🌟

xxl-job 是一個很經典的排程框架,目前在 GitHub 上也有 27k star 的關注,因為功能不復雜所以最近也沒有怎麼更新了。

大家日常都會使用這類排程框架,所以理解難度非常低,加上他的實現也比較簡單,比如:

  • 使用 MySQL 的鎖來簡單粗暴的解決分散式鎖的問題
  • 執行緒池的使用:因為每個任務的排程都需要儘可能的互相不影響,所以裡面大量使用了執行緒池,同時對如何獲取非同步任務結果也有一些最佳實踐。
  • RPC 呼叫:裡面內建了一個 RPC 框架,也是作者編寫的,其中的實現原理也不復雜,建議看看原始碼,可以更好的理解我們在工作中用到 rpc 框架。

cim

難度:🌟🌟🌟
推薦指數:🌟🌟🌟
這裡夾了一點私貨,就是我自己開源的一個分散式即時通訊系統,其實現在來看上一個版本的程式碼寫的挺爛的,不過好在最近釋出了 v2.0.0,提升了不少程式碼質量。

Oct-14-2024 11-09-54-min.gif
它具備 IM 即時通訊的基本功能,同時基於它可以實現:

  • 即時通訊
  • 訊息推送
  • IOT 訊息平臺

透過 cim 你可以學習到分散式系統中:

  • 後設資料是如何存放和同步的。
  • RPC 呼叫如何實現。
  • 長連結系統如何實現。
  • 複雜的分散式系統如何做整合測試等。

詳細的介紹可以檢視專案首頁的 readme,發現有什麼需要最佳化的地方(其實還蠻多 todo 沒有做)都歡迎提交 PR。

PowerJob

難度:🌟🌟🌟
推薦指數:🌟🌟🌟🌟
PowerJob 也是一個排程框架,只是他有後發優勢,結合了市面上其他排程系統的優點同時也新增了一些功能,以下是他功能的官方對比圖:

社群相對於 xxl-job 也更加活躍,目前剛釋出了 5.1.0 版本,同時社群也整理許多學習的文章和資料

image.png

它使用了 Akka 來實現遠端通訊,對這部分內容感興趣的朋友不容錯過,可以看到一些最佳實踐。
其中的程式碼寫的也很規範,一些類的設計很好,可擴充套件性很高,比如常用的執行器都是透過一個
MapProcessor 擴充套件而來的。
image.png
image.png

推薦大家從任務排程那一塊開始看:tech.powerjob.worker.actors.TaskTrackerActor#onReceiveServerScheduleJobReq

Pulsar

難度:🌟🌟🌟🌟
推薦指數:🌟🌟🌟🌟
image.png
Pulsar 是目前主流的雲原生訊息佇列中介軟體,現在使用的公司也非常多,透過他你可以學習到:

  • API 設計:Pulsar 的 client 是直接面向開發者的,在易用性的前提下每次迭代升級還要考慮到相容性。
  • 非同步呼叫:Pulsar 裡幾乎所有的請求都是非同步的,所以大量使用了非同步➕回撥(雖然也有一些坑),可以學到一些高效能程式碼的編寫方式。
  • Netty 的最佳用法:訊息收發的底層網路框架也是 Netty 支撐的,Pulsar 對它做了封裝。
  • 基於 protocol 的多語言客戶端。
    • 因為 Pulsar 的通訊編解碼使用的是 protocol,本身是可以基於它生成各種語言的 API,所以在此基礎上編寫其他語言的客戶端就非常方便。

不過由於 Pulsar 本身的複雜性,上手起來門檻還是不低,推薦先從客戶端的程式碼(Java 和 Go 的都可以)上手。

StarRocks

難度:🌟🌟🌟🌟🌟
推薦指數:🌟🌟🌟🌟
image.png

StarRocks 也是我最近才接觸到的 OLAP 資料庫專案,以前對這個領域的積累幾乎為零,所以也是從頭學習。

好在這段時間因為有需求也給它提交了幾個 PR,逐漸熟悉起來了。
image.png

我接觸下來這些開源專案,發現 StarRocks 這類資料庫專案是最有前(錢)景的,畢竟和資料打交道的產品公司的付費意願會更高一些。

不過該專案確實對新手不太友好,最好是已經接觸過大資料領域再學習會更合適一些,但也不要怕,我就是一個純小白,沒基礎就跟著程式碼 debug,反正都是 Java 寫的總能看懂。

這裡推薦先看看我之前寫的本地搭建開發環境,這樣就可以在 idea 裡 debug 了。

OpenTelemetry

難度:🌟🌟🌟🌟
推薦指數:🌟🌟🌟🌟🌟

OpenTelemetry 現在作為雲原生可觀測性的事實標準,現在已經逐步成為各大公司必備的技術棧了。

透過一個 javaagent 就可以自動採集應用的 trace、metrics、logs 等資料,這裡先推薦 opentelemetry-java-instrumentation,因為我們日常使用最多的就是基於這個專案打包出來的 javaagent,透過它可以學習到:

  • 如何編寫任意函式的攔截器
  • trace 資訊是如何線上程和程序之間傳遞的
  • 一些常用框架是如何執行的
    • 比如你需要了解 gRPC 的原理,就可以檢視 OpenTelemetry 是如何對他埋點的,從而知曉他的核心原理。
  • 優雅的 API 設計

image.png
同時 OpenTelemetry 算是我看過最優雅的程式碼之一了,非常建議大家都看看。

如果對 OpenTelemetry 還不太熟悉,可以先看看我之前寫過的文章

Go(雲原生專案)

cprobe

難度:🌟🌟🌟
推薦指數:🌟🌟🌟

cprobe 屬於可觀測性專案,他的目的是可以把各種 exporter 都整合在一起,比如 kafka_exporter, nginx_exporter, mysql_exporter 等。

同時還做了上層抽象,可以統一管理各種監控物件的配置,這樣就可以部署一個程序監控所有的應用了。

透過這個專案可以學到:

  • 監控體系的基礎知識,比如 Prometheus 和 metrics 等
  • Go 語言的基本用法

我之前寫過一篇 手把手教你為開源專案貢獻程式碼就是以 cprobe 為例來介紹的。

VictoriaLogs

難度:🌟🌟🌟🌟
推薦指數:🌟🌟🌟🌟

這是一個屬於 VictoriaMetrics 的一個子專案,透過這個名字應該會知道他主要用於處理日誌,可以把他理解為 ElasticSearch 的簡易版,雖然功能簡單了但資源消耗也會比 ES 低很多,具體可以看下面的壓測圖:

image.png

透過這個專案可以學到:

  • 資料在磁碟中是如何儲存和查詢的
  • Go 語言中關於 goroutinechannel 的一些最佳實踐
    目前的版本還比較早,所以程式碼都不太複雜,建議大家可以從查詢的入口開始看起

總結

以上都是我正經接觸過的專案,如果是想長期耕耘同時搞錢的話,推薦 StarRocks,目前也很火。

如果只是想提升在 Java 領域的水平,那推薦 Pulsar 和 OpenTelemetry,都有很多程式碼最佳實踐。

如果想要入坑雲原生和 Go 專案,那 cprobe 是比較合適的。

當然不管是哪個專案最主要的還是堅持,很多專案如果只是偶爾看一下很容易忘記,起碼要做到真正執行起來然後 debug 過程式碼。

參考連結:

  • https://www.yuque.com/powerjob/guidence/wu2e93
  • https://github.com/VictoriaMetrics/VictoriaMetrics/blob/master/lib/logstorage/storage_search.go
  • https://crossoverjie.top/tags/OpenTelemetry/
  • https://crossoverjie.top/2024/10/09/ob/StarRocks-dev-env-build/

相關文章