你看得上癮的鬥魚,首次開源了自家項目

上個月,鬥魚將基於 Go 語言的微服務框架 Jupiter 開源。作為國內知名的互聯網直播公司,這也是鬥魚首次以公司的名義正式推出開源項目。

近年來,得益於日漸增長的高併發業務需求,微服務架構開始在國內逐漸普及。同時,專為高併發而生的 Go 語言及其相關生態在國內的發展也突飛猛進。目前,市面上主流的微服務架構包括 Spring cloud、Dubbo 等,並且都有團隊為之專門推出了對應的 Go 版本,以充分發揮 Go 在微服務架構中的高併發優勢。

而網絡直播正是一項高併發的業務,鬥魚的分佈式業務模型一直讓我們頗為好奇。為進一步瞭解鬥魚的 Jupiter 與其他主流微服務框架的區別,以及鬥魚內部技術棧的發展,我們第一時間邀請到了鬥魚 Go 團隊研發工程師呂超,一起回顧了 Jupiter 的開源歷程,以及鬥魚近幾年的技術棧變化。

你看得上癮的鬥魚,首次開源了自家項目

Jupiter 的誕生

據悉,Jupiter 脱胎於鬥魚內部的 Golang 微服務框架,經過三年打磨、幾百個服務的線上驗證,並歷經多機房建設、雲化、容器化等多次基礎架構演進。目前,Jupiter 發佈了 0.5.0 版本,基本涵蓋了內部框架的主要功能。但因為內部框架含有許多定製的特性以及一些歷史包袱,許多功能並沒有完整釋放出來。“ 我們也在整理,儘快把這部分功能釋放出來。”

那麼鬥魚在搭建微服務架構的過程中,為什麼不採用現成的微服務框架,而是選擇自己“造輪子”,重新創造了 Jupiter 呢?呂超告訴我們,鬥魚是在 2016 年底開始啓用微服務架構的,也是在當時引入了 Go 技術棧。

Jupiter 也不是一開始就構思好的。“ 剛開始,我們大量使用開源的類庫來攢應用。開源類庫的功能不足,bug 沒法及時修復,我們就二開。為了滿足內部多技術棧通信的需求,我們開始編寫統一的 RPC 框架,逐漸形成了早期的 Jupiter。” 隨着服務規模的增長,基礎架構的演進,Jupiter 也在不斷成長為支持多應用場景、關注開發效率和治理效率,並能從容應對基礎架構演進的微服務框架。

作為一個成長中的開源項目, Jupiter 與市面上的 Spring Cloud、Dubbo 這類成熟的框架相比,並不算完美。“ 在功能上, Jupiter 還有許多不足。但 Jupiter 是 Go 原生的,採用的許多方案也都是 Go 生態裏大家喜聞樂見的,比如 gRPC、ETCD、Prometheus、Jaeger 等。同時,Jupiter 是面向服務治理的框架,對一些模塊的處理比較開放,比如 echo、gin 這些都很容易集成進來,當然也包括各公司自研的 RPC 框架。” 呂超表示,雖然目前的 Jupiter 還不是最完美的框架,但卻是基於鬥魚多年的實際業務經驗積累起來的,是目前最適合鬥魚的微服務架構。

為什麼選擇 Go

Go 語言是由谷歌於 2009 年推出的一門相對比較新的編程語言,因其原生支持高併發的特性,被譽為雲原生時代的容器語言。但 Go 在國內的起步較晚,目前 Go 相關的生態在國內還並不完善,甚至還有很多開發者仍對這門所謂的雲原生時代新語言持觀望態度。在與呂超的交流中我們得知,成立於 2014 年的鬥魚最開始使用的也不是 Go 。

“ 鬥魚 Web 部門一開始使用的是 PHP,一直到 2016 年底,為應對業務規模的快速增長,逐步引入 Go、Java 從而形成了多技術棧的局面。” 呂超介紹説,“ 引入 Go 也是看中了 Go 在高併發應用開發和容器化上的優勢,事實上在隨後兩年的服務化工程中,Golang 確實也展現了這種優勢。”

然而遷移到 Go 的過程並不容易。據呂超回憶,“ 由弱類型語言轉向強類型語言,類庫的匱乏,以及 Go 在包管理功能上的混亂都給我們造成了不少的困難。但 Go 語言機制比較簡單和直觀,沒有那麼多花裏胡哨的東西,這也帶來一個潛在優勢就是 Go 應用的重構和迭代成本是非常低的,這一定程度上降低了遷移的難度。”

也正是為了提高 Go 應用的開發效率,鬥魚的團隊開發了 Jupiter 。“ 隨着應用規模的增大,Jupiter 也非常關注治理效率。服務化做的差不多的時候,也開始承擔多機房建設、雲化、容器化、混沌工程等基礎建設的一些工作,以保障業務邏輯與這些基建的無縫對接。當然這裏更多的是需要治理平台和運維的 PaaS 平台的支持,幸運的是,我們的服務治理平台 Juno 也開源了。通過 Jupiter 和 Juno,可以實現比較完整的服務治理體驗。”

與其它微服務框架的區別

由於 Go 語言支持高併發特性,一些已經比較成熟的微服務架構也在近期推出了 Golang 重構版本,比如我們前段時間報道的 Dubbo Go 。呂超表示,他們的團隊也一直在關注 Dubbo Go 這個項目,同時也很樂見 Golang 生態裏有這樣優秀的 RPC 框架。實際上,Jupiter 與 Dubbo Go 等這些優秀的 RPC 框架相比,更多的是一種互補的關係。

首先,相比於 RPC 框架,Jupiter 更側重於微服務治理。鬥魚內部的 Jupiter 深度定製了 echo, gRPC 框架,並支持公司內部自研的 RPC 框架。一方面是為了解決公司內部多技術棧 (php/Go/java/cpp) 的數據通信,另一方面也是為了解決早期一些開源框架功能不足的問題。

但是隨着公司內部 RPC 框架的整合,以及開源框架的持續完善,這兩個問題得到了很大的緩解。“ 所以我們也在逐步簡化 RPC 框架,專注於服務治理。開源的 Jupiter 也延續了這個理念,通過簡單的適配,gin/Goframe 等優秀框架都可以很方便的集成進來,這裏的適配主要指一些基於管理和治理需要的必要封裝。”

其次,Jupiter 不只是一個 RPC 框架。Jupiter 關注的是應用的服務治理,除了 RPC,應用還有緩存、存儲、消息隊列、任務編排等。這些都是需要治理的,除了可觀測性的三駕馬車: 日誌埋點、指標採集、鏈路追蹤外,Jupiter 還支持統一錯誤碼、在線profiling、開發模式、動態配置等基礎功能,治理精度更高,維度更豐富。

我們知道,微服務架構中的一個關鍵點是服務之間的通信,特別是多技術棧場景下的跨語言通信。在鬥魚內部,Java 團隊採用的就是 Dubbo 框架,為了實現 Go 應用與 Java 應用通信,團隊採用了一種折中的辦法是:

Java 團隊的 Dubbo 框架採用 Dubbo-gRPC 作為通信協議,實現通信協議上的互通。

Go 團隊的 Jupiter 框架通過多註冊鍵的方式,支持 Dubbo 基於接口的註冊協議,實現服務註冊和發現上的互通。

“ 這個方法雖然能用,但不那麼優雅。真正要解決問題,還是需要打通服務註冊協議。我們注意到了 Dubbo 和 Dubbo Go 基於應用註冊方面的進展,我們對此非常期待,也在研究怎麼把 Jupiter 和 Dubbo Go 做一個結合,從而優雅的與 Dubbo 互通。” 呂超表示,讓 Jupiter 與 Dubbo 架構更好的互通,是團隊下一步要努力解決的問題。

微服務架構的意義

分佈式的微服務架構從誕生之日起就受到不少爭議,網上也有人認為很多企業繼續沿用統一部署的傳統架構即可,無需盲目追求新技術。呂超結合鬥魚的業務經驗,分享了他對於微服務架構應用前景的看法:“ 我覺得技術架構都是一個演進過程,遵從康威定律:組織架構決定技術架構。”

鬥魚是隨着業務的發展,組織架構的變遷,導致原有的單體應用架構在維護和治理上存在一定問題,因此逐步遷移到微服務。微服務幫鬥魚解決了以下問題:

服務的可維護:子系統的內聚性,明確了子系統的職責和邊界,可以有效降低各個系統的溝通成本和對接成本,架構上可以更加合理高效

服務的高可用:子系統的 SLA 劃分,根據不同 SLA 等級,能夠對核心服務做優化和災備,提升服務可用性

服務的可伸縮:子系統的 QPS 劃分,根據不同 QPS 量級,能夠對服務的容量進行估算,服務做到可伸縮

總的來説,微服務在業務規模、組織架構達到一定程度的時候,有很多不錯的維護和治理優勢。“ 換言之,不是我們選擇將單體換成微服務,而是業務發展到一定程度需要微服務。評價一個企業是否需要微服務架構有個最簡單的方式,就是兩個披薩的理論。如果維護一個單體應用代碼,超過了兩個披薩的團隊,就有可能人數太多導致溝通問題,這個時候,我們可能就需要做一些拆分。”

擁抱開源的鬥魚

國內大廠擁抱開源的例子不在少數。作為一家國內知名的網絡直播平台,鬥魚在開源界尚屬新面孔。我們請呂超為我們分享了鬥魚的技術團隊對於開源的看法。

“ 在開源 Jupiter 之前,我的許多同事也都在不同程度的參與到開源社區,貢獻代碼。早期參與開源社區的目的,主要是因為因為內部需要,我們二開了很多開源類庫。如果及時的把改動反饋到社區,能極大減輕我們的維護成本。隨着參與次數的增多,逐漸產生了開源的想法。同時,Go 原生的面向微服務治理的集成方案比較匱乏。非原生的、從其他語言生態搬過來的框架又有一定的理解成本。種種原因促使我們考慮把微服務框架 Jupiter 和治理平台 Juno 同時開源,為微服務架構方案貢獻一點點力。”

通過開源 Jupiter,呂超和他的團隊全面的梳理了基礎框架的架構設計,總結了服務治理的經驗,“ 這對未來我們內部的服務架構和治理體系都有非常大的幫助。” 同時,開源社區的積極反饋也給鬥魚的團隊帶來了很多有價值的意見和建議。

“ 貢獻者的反饋也還是比較多的,有討論服務治理方案的、有詢問架構設計的,甚至還有討論到具體某行代碼的。作為一個剛剛開源的新項目,這些反饋對我們都無比寶貴。” 距離項目開源短短半個月的時間,目前 Jupiter 已經獲得了 1066 個 Star 。同時,隨着 Jupiter 社區的持續完善,以及與其它開源社區的互動,呂超相信這一定會讓 Jupiter 和鬥魚內部的治理體系更加健壯。

“ 之前更多的是個人蔘與,項目也比較分散。藉着這次開源的機會,我們會整合一些開發資源,瞄準我們正在使用或將要使用的一些開源項目,參與進去。然後,推動這些項目在我們內部的使用,形成一個良性的互動。”

呂超總結了自己對參與開源的看法。從個人的角度來講,參與開源能有效提升個人的代碼質量。從公司的角度來講,能更有效的利用共享資源提升效率。總體上,是一件非常有益的事情。

關於未來

鬥魚未來是否還會開源更多的項目?

呂超向我們透露,目前團隊計劃是圍繞微服務框架 Jupiter 和服務治理平台 Juno,持續的推動開源。過去兩年,鬥魚內部積累了許多類庫,比如基於內存的對象存儲 bigmap,高併發的 redis 客户端 redix,對全鏈路壓測的支持等,因為含有一些內部定製的特性,暫時沒有開源。但之後團隊會進一步整理,逐步通過 Jupiter 把這些內部的項目釋放出來。

“ 作為 Jupiter 配套的後台系統 Juno,我們後續計劃會持續完善配置中心、註冊中心、監控中心、治理中心等等,Juno 不僅會兼容 Jupiter,也會兼容其他開源的框架,為 Go 微服務生態添磚加瓦。”

【來源:開源中國】

聲明:轉載此文是出於傳遞更多信息之目的。若有來源標註錯誤或侵犯了您的合法權益,請作者持權屬證明與本網聯繫,我們將及時更正、刪除,謝謝。 郵箱地址:[email protected]

版權聲明:本文源自 網絡, 於,由 楠木軒 整理發佈,共 4711 字。

轉載請註明: 你看得上癮的鬥魚,首次開源了自家項目 - 楠木軒