看得上瘾的斗鱼,首次开源了自家项目 Jupiter !
來源:開源中國
前言
Jupiter 的誕生
為什么選擇 Go
與其它微服務框架的區別
微服務架構的意義
擁抱開源的斗魚
關于未來
上個月,斗魚將基于 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 微服務生態添磚加瓦。”
剛到公司沒人帶怎么辦?
面試官問:List 如何一邊遍歷,一邊刪除?
點贊功能,用 MySQL 還是 Redis ?
程序員,為什么建議你寫好代碼的同時做好項目管理?
作為字節跳動的研發面試官,有些話我不得不說
40個Java多線程問題詳解復習
非常強悍的 RabbitMQ 總結,寫得真好!
Elasticsearch在各大互聯網公司大量真實的應用案例!
相信自己,沒有做不到的,只有想不到的
在這里獲得的不僅僅是技術!
喜歡就給個“在看”
總結
以上是生活随笔為你收集整理的看得上瘾的斗鱼,首次开源了自家项目 Jupiter !的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: att汇编教程 linux,ATT 汇编
- 下一篇: python 重定向 ctf_3.CTF