看得上瘾的斗鱼,首次开源了自家项目 Jupiter !
來(lái)源:開源中國(guó)
前言
Jupiter 的誕生
為什么選擇 Go
與其它微服務(wù)框架的區(qū)別
微服務(wù)架構(gòu)的意義
擁抱開源的斗魚
關(guān)于未來(lái)
上個(gè)月,斗魚將基于 Go 語(yǔ)言的微服務(wù)框架 Jupiter 開源。作為國(guó)內(nèi)知名的互聯(lián)網(wǎng)直播公司,這也是斗魚首次以公司的名義正式推出開源項(xiàng)目。
近年來(lái),得益于日漸增長(zhǎng)的高并發(fā)業(yè)務(wù)需求,微服務(wù)架構(gòu)開始在國(guó)內(nèi)逐漸普及。同時(shí),專為高并發(fā)而生的 Go 語(yǔ)言及其相關(guān)生態(tài)在國(guó)內(nèi)的發(fā)展也突飛猛進(jìn)。目前,市面上主流的微服務(wù)架構(gòu)包括 Spring cloud、Dubbo 等,并且都有團(tuán)隊(duì)為之專門推出了對(duì)應(yīng)的 Go 版本,以充分發(fā)揮 Go 在微服務(wù)架構(gòu)中的高并發(fā)優(yōu)勢(shì)。
而網(wǎng)絡(luò)直播正是一項(xiàng)高并發(fā)的業(yè)務(wù),斗魚的分布式業(yè)務(wù)模型一直讓我們頗為好奇。為進(jìn)一步了解斗魚的 Jupiter 與其他主流微服務(wù)框架的區(qū)別,以及斗魚內(nèi)部技術(shù)棧的發(fā)展,我們第一時(shí)間邀請(qǐng)到了斗魚 Go 團(tuán)隊(duì)研發(fā)工程師呂超,一起回顧了 Jupiter 的開源歷程,以及斗魚近幾年的技術(shù)棧變化。
Jupiter 的誕生
據(jù)悉,Jupiter 脫胎于斗魚內(nèi)部的 Golang 微服務(wù)框架,經(jīng)過(guò)三年打磨、幾百個(gè)服務(wù)的線上驗(yàn)證,并歷經(jīng)多機(jī)房建設(shè)、云化、容器化等多次基礎(chǔ)架構(gòu)演進(jìn)。目前,Jupiter 發(fā)布了 0.5.0 版本,基本涵蓋了內(nèi)部框架的主要功能。但因?yàn)閮?nèi)部框架含有許多定制的特性以及一些歷史包袱,許多功能并沒有完整釋放出來(lái)。“ 我們也在整理,盡快把這部分功能釋放出來(lái)。”
那么斗魚在搭建微服務(wù)架構(gòu)的過(guò)程中,為什么不采用現(xiàn)成的微服務(wù)框架,而是選擇自己“造輪子”,重新創(chuàng)造了 Jupiter 呢?呂超告訴我們,斗魚是在 2016 年底開始啟用微服務(wù)架構(gòu)的,也是在當(dāng)時(shí)引入了 Go 技術(shù)棧。
Jupiter 也不是一開始就構(gòu)思好的。“ 剛開始,我們大量使用開源的類庫(kù)來(lái)攢應(yīng)用。開源類庫(kù)的功能不足,bug 沒法及時(shí)修復(fù),我們就二開。為了滿足內(nèi)部多技術(shù)棧通信的需求,我們開始編寫統(tǒng)一的 RPC 框架,逐漸形成了早期的 Jupiter。” 隨著服務(wù)規(guī)模的增長(zhǎng),基礎(chǔ)架構(gòu)的演進(jìn),Jupiter 也在不斷成長(zhǎng)為支持多應(yīng)用場(chǎng)景、關(guān)注開發(fā)效率和治理效率,并能從容應(yīng)對(duì)基礎(chǔ)架構(gòu)演進(jìn)的微服務(wù)框架。
作為一個(gè)成長(zhǎng)中的開源項(xiàng)目, Jupiter 與市面上的 Spring Cloud、Dubbo 這類成熟的框架相比,并不算完美。“ 在功能上, Jupiter 還有許多不足。但 Jupiter 是 Go 原生的,采用的許多方案也都是 Go 生態(tài)里大家喜聞樂(lè)見的,比如 gRPC、ETCD、Prometheus、Jaeger 等。同時(shí),Jupiter 是面向服務(wù)治理的框架,對(duì)一些模塊的處理比較開放,比如 echo、gin 這些都很容易集成進(jìn)來(lái),當(dāng)然也包括各公司自研的 RPC 框架。” 呂超表示,雖然目前的 Jupiter 還不是最完美的框架,但卻是基于斗魚多年的實(shí)際業(yè)務(wù)經(jīng)驗(yàn)積累起來(lái)的,是目前最適合斗魚的微服務(wù)架構(gòu)。
為什么選擇 Go
Go 語(yǔ)言是由谷歌于 2009 年推出的一門相對(duì)比較新的編程語(yǔ)言,因其原生支持高并發(fā)的特性,被譽(yù)為云原生時(shí)代的容器語(yǔ)言。但 Go 在國(guó)內(nèi)的起步較晚,目前 Go 相關(guān)的生態(tài)在國(guó)內(nèi)還并不完善,甚至還有很多開發(fā)者仍對(duì)這門所謂的云原生時(shí)代新語(yǔ)言持觀望態(tài)度。在與呂超的交流中我們得知,成立于 2014 年的斗魚最開始使用的也不是 Go 。
“ 斗魚 Web 部門一開始使用的是 PHP,一直到 2016 年底,為應(yīng)對(duì)業(yè)務(wù)規(guī)模的快速增長(zhǎng),逐步引入 Go、Java 從而形成了多技術(shù)棧的局面。” 呂超介紹說(shuō),“ 引入 Go 也是看中了 Go 在高并發(fā)應(yīng)用開發(fā)和容器化上的優(yōu)勢(shì),事實(shí)上在隨后兩年的服務(wù)化工程中,Golang 確實(shí)也展現(xiàn)了這種優(yōu)勢(shì)。”
然而遷移到 Go 的過(guò)程并不容易。據(jù)呂超回憶,“ 由弱類型語(yǔ)言轉(zhuǎn)向強(qiáng)類型語(yǔ)言,類庫(kù)的匱乏,以及 Go 在包管理功能上的混亂都給我們?cè)斐闪瞬簧俚睦щy。但 Go 語(yǔ)言機(jī)制比較簡(jiǎn)單和直觀,沒有那么多花里胡哨的東西,這也帶來(lái)一個(gè)潛在優(yōu)勢(shì)就是 Go 應(yīng)用的重構(gòu)和迭代成本是非常低的,這一定程度上降低了遷移的難度。”
也正是為了提高 Go 應(yīng)用的開發(fā)效率,斗魚的團(tuán)隊(duì)開發(fā)了 Jupiter 。“ 隨著應(yīng)用規(guī)模的增大,Jupiter 也非常關(guān)注治理效率。服務(wù)化做的差不多的時(shí)候,也開始承擔(dān)多機(jī)房建設(shè)、云化、容器化、混沌工程等基礎(chǔ)建設(shè)的一些工作,以保障業(yè)務(wù)邏輯與這些基建的無(wú)縫對(duì)接。當(dāng)然這里更多的是需要治理平臺(tái)和運(yùn)維的 PaaS 平臺(tái)的支持,幸運(yùn)的是,我們的服務(wù)治理平臺(tái) Juno 也開源了。通過(guò) Jupiter 和 Juno,可以實(shí)現(xiàn)比較完整的服務(wù)治理體驗(yàn)。”
與其它微服務(wù)框架的區(qū)別
由于 Go 語(yǔ)言支持高并發(fā)特性,一些已經(jīng)比較成熟的微服務(wù)架構(gòu)也在近期推出了 Golang 重構(gòu)版本,比如我們前段時(shí)間報(bào)道的 Dubbo Go 。呂超表示,他們的團(tuán)隊(duì)也一直在關(guān)注 Dubbo Go 這個(gè)項(xiàng)目,同時(shí)也很樂(lè)見 Golang 生態(tài)里有這樣優(yōu)秀的 RPC 框架。實(shí)際上,Jupiter 與 Dubbo Go 等這些優(yōu)秀的 RPC 框架相比,更多的是一種互補(bǔ)的關(guān)系。
首先,相比于 RPC 框架,Jupiter 更側(cè)重于微服務(wù)治理。斗魚內(nèi)部的 Jupiter 深度定制了 echo, gRPC 框架,并支持公司內(nèi)部自研的 RPC 框架。一方面是為了解決公司內(nèi)部多技術(shù)棧 (php/Go/java/cpp) 的數(shù)據(jù)通信,另一方面也是為了解決早期一些開源框架功能不足的問(wèn)題。
但是隨著公司內(nèi)部 RPC 框架的整合,以及開源框架的持續(xù)完善,這兩個(gè)問(wèn)題得到了很大的緩解。“ 所以我們也在逐步簡(jiǎn)化 RPC 框架,專注于服務(wù)治理。開源的 Jupiter 也延續(xù)了這個(gè)理念,通過(guò)簡(jiǎn)單的適配,gin/Goframe 等優(yōu)秀框架都可以很方便的集成進(jìn)來(lái),這里的適配主要指一些基于管理和治理需要的必要封裝。”
其次,Jupiter 不只是一個(gè) RPC 框架。Jupiter 關(guān)注的是應(yīng)用的服務(wù)治理,除了 RPC,應(yīng)用還有緩存、存儲(chǔ)、消息隊(duì)列、任務(wù)編排等。這些都是需要治理的,除了可觀測(cè)性的三駕馬車: 日志埋點(diǎn)、指標(biāo)采集、鏈路追蹤外,Jupiter 還支持統(tǒng)一錯(cuò)誤碼、在線profiling、開發(fā)模式、動(dòng)態(tài)配置等基礎(chǔ)功能,治理精度更高,維度更豐富。
我們知道,微服務(wù)架構(gòu)中的一個(gè)關(guān)鍵點(diǎn)是服務(wù)之間的通信,特別是多技術(shù)棧場(chǎng)景下的跨語(yǔ)言通信。在斗魚內(nèi)部,Java 團(tuán)隊(duì)采用的就是 Dubbo 框架,為了實(shí)現(xiàn) Go 應(yīng)用與 Java 應(yīng)用通信,團(tuán)隊(duì)采用了一種折中的辦法是:
Java 團(tuán)隊(duì)的 Dubbo 框架采用 Dubbo-gRPC 作為通信協(xié)議,實(shí)現(xiàn)通信協(xié)議上的互通。
Go 團(tuán)隊(duì)的 Jupiter 框架通過(guò)多注冊(cè)鍵的方式,支持 Dubbo 基于接口的注冊(cè)協(xié)議,實(shí)現(xiàn)服務(wù)注冊(cè)和發(fā)現(xiàn)上的互通。
“ 這個(gè)方法雖然能用,但不那么優(yōu)雅。真正要解決問(wèn)題,還是需要打通服務(wù)注冊(cè)協(xié)議。我們注意到了 Dubbo 和 Dubbo Go 基于應(yīng)用注冊(cè)方面的進(jìn)展,我們對(duì)此非常期待,也在研究怎么把 Jupiter 和 Dubbo Go 做一個(gè)結(jié)合,從而優(yōu)雅的與 Dubbo 互通。” 呂超表示,讓 Jupiter 與 Dubbo 架構(gòu)更好的互通,是團(tuán)隊(duì)下一步要努力解決的問(wèn)題。
微服務(wù)架構(gòu)的意義
分布式的微服務(wù)架構(gòu)從誕生之日起就受到不少爭(zhēng)議,網(wǎng)上也有人認(rèn)為很多企業(yè)繼續(xù)沿用統(tǒng)一部署的傳統(tǒng)架構(gòu)即可,無(wú)需盲目追求新技術(shù)。呂超結(jié)合斗魚的業(yè)務(wù)經(jīng)驗(yàn),分享了他對(duì)于微服務(wù)架構(gòu)應(yīng)用前景的看法:“ 我覺得技術(shù)架構(gòu)都是一個(gè)演進(jìn)過(guò)程,遵從康威定律:組織架構(gòu)決定技術(shù)架構(gòu)。”
斗魚是隨著業(yè)務(wù)的發(fā)展,組織架構(gòu)的變遷,導(dǎo)致原有的單體應(yīng)用架構(gòu)在維護(hù)和治理上存在一定問(wèn)題,因此逐步遷移到微服務(wù)。微服務(wù)幫斗魚解決了以下問(wèn)題:
服務(wù)的可維護(hù):子系統(tǒng)的內(nèi)聚性,明確了子系統(tǒng)的職責(zé)和邊界,可以有效降低各個(gè)系統(tǒng)的溝通成本和對(duì)接成本,架構(gòu)上可以更加合理高效
服務(wù)的高可用:子系統(tǒng)的 SLA 劃分,根據(jù)不同 SLA 等級(jí),能夠?qū)诵姆?wù)做優(yōu)化和災(zāi)備,提升服務(wù)可用性
服務(wù)的可伸縮:子系統(tǒng)的 QPS 劃分,根據(jù)不同 QPS 量級(jí),能夠?qū)Ψ?wù)的容量進(jìn)行估算,服務(wù)做到可伸縮
總的來(lái)說(shuō),微服務(wù)在業(yè)務(wù)規(guī)模、組織架構(gòu)達(dá)到一定程度的時(shí)候,有很多不錯(cuò)的維護(hù)和治理優(yōu)勢(shì)。“ 換言之,**不是我們選擇將單體換成微服務(wù),而是業(yè)務(wù)發(fā)展到一定程度需要微服務(wù)。**評(píng)價(jià)一個(gè)企業(yè)是否需要微服務(wù)架構(gòu)有個(gè)最簡(jiǎn)單的方式,就是兩個(gè)披薩的理論。如果維護(hù)一個(gè)單體應(yīng)用代碼,超過(guò)了兩個(gè)披薩的團(tuán)隊(duì),就有可能人數(shù)太多導(dǎo)致溝通問(wèn)題,這個(gè)時(shí)候,我們可能就需要做一些拆分。”
擁抱開源的斗魚
國(guó)內(nèi)大廠擁抱開源的例子不在少數(shù)。作為一家國(guó)內(nèi)知名的網(wǎng)絡(luò)直播平臺(tái),斗魚在開源界尚屬新面孔。我們請(qǐng)呂超為我們分享了斗魚的技術(shù)團(tuán)隊(duì)對(duì)于開源的看法。
“ 在開源 Jupiter 之前,我的許多同事也都在不同程度的參與到開源社區(qū),貢獻(xiàn)代碼。早期參與開源社區(qū)的目的,主要是因?yàn)橐驗(yàn)閮?nèi)部需要,我們二開了很多開源類庫(kù)。如果及時(shí)的把改動(dòng)反饋到社區(qū),能極大減輕我們的維護(hù)成本。隨著參與次數(shù)的增多,逐漸產(chǎn)生了開源的想法。同時(shí),Go 原生的面向微服務(wù)治理的集成方案比較匱乏。非原生的、從其他語(yǔ)言生態(tài)搬過(guò)來(lái)的框架又有一定的理解成本。種種原因促使我們考慮把微服務(wù)框架 Jupiter 和治理平臺(tái) Juno 同時(shí)開源,為微服務(wù)架構(gòu)方案貢獻(xiàn)一點(diǎn)點(diǎn)力。”
通過(guò)開源 Jupiter,呂超和他的團(tuán)隊(duì)全面的梳理了基礎(chǔ)框架的架構(gòu)設(shè)計(jì),總結(jié)了服務(wù)治理的經(jīng)驗(yàn),“ 這對(duì)未來(lái)我們內(nèi)部的服務(wù)架構(gòu)和治理體系都有非常大的幫助。” 同時(shí),開源社區(qū)的積極反饋也給斗魚的團(tuán)隊(duì)帶來(lái)了很多有價(jià)值的意見和建議。
“ 貢獻(xiàn)者的反饋也還是比較多的,有討論服務(wù)治理方案的、有詢問(wèn)架構(gòu)設(shè)計(jì)的,甚至還有討論到具體某行代碼的。作為一個(gè)剛剛開源的新項(xiàng)目,這些反饋對(duì)我們都無(wú)比寶貴。” 距離項(xiàng)目開源短短半個(gè)月的時(shí)間,目前 Jupiter 已經(jīng)獲得了 1066 個(gè) Star 。同時(shí),隨著 Jupiter 社區(qū)的持續(xù)完善,以及與其它開源社區(qū)的互動(dòng),呂超相信這一定會(huì)讓 Jupiter 和斗魚內(nèi)部的治理體系更加健壯。
“ 之前更多的是個(gè)人參與,項(xiàng)目也比較分散。借著這次開源的機(jī)會(huì),我們會(huì)整合一些開發(fā)資源,瞄準(zhǔn)我們正在使用或?qū)⒁褂玫囊恍╅_源項(xiàng)目,參與進(jìn)去。然后,推動(dòng)這些項(xiàng)目在我們內(nèi)部的使用,形成一個(gè)良性的互動(dòng)。”
呂超總結(jié)了自己對(duì)參與開源的看法。從個(gè)人的角度來(lái)講,參與開源能有效提升個(gè)人的代碼質(zhì)量。從公司的角度來(lái)講,能更有效的利用共享資源提升效率。總體上,是一件非常有益的事情。
關(guān)于未來(lái)
斗魚未來(lái)是否還會(huì)開源更多的項(xiàng)目?
呂超向我們透露,目前團(tuán)隊(duì)計(jì)劃是圍繞微服務(wù)框架 Jupiter 和服務(wù)治理平臺(tái) Juno,持續(xù)的推動(dòng)開源。過(guò)去兩年,斗魚內(nèi)部積累了許多類庫(kù),比如基于內(nèi)存的對(duì)象存儲(chǔ) bigmap,高并發(fā)的 redis 客戶端 redix,對(duì)全鏈路壓測(cè)的支持等,因?yàn)楹幸恍﹥?nèi)部定制的特性,暫時(shí)沒有開源。但之后團(tuán)隊(duì)會(huì)進(jìn)一步整理,逐步通過(guò) Jupiter 把這些內(nèi)部的項(xiàng)目釋放出來(lái)。
“ 作為 Jupiter 配套的后臺(tái)系統(tǒng) Juno,我們后續(xù)計(jì)劃會(huì)持續(xù)完善配置中心、注冊(cè)中心、監(jiān)控中心、治理中心等等,Juno 不僅會(huì)兼容 Jupiter,也會(huì)兼容其他開源的框架,為 Go 微服務(wù)生態(tài)添磚加瓦。”
剛到公司沒人帶怎么辦?
面試官問(wèn):List 如何一邊遍歷,一邊刪除?
點(diǎn)贊功能,用 MySQL 還是 Redis ?
程序員,為什么建議你寫好代碼的同時(shí)做好項(xiàng)目管理?
作為字節(jié)跳動(dòng)的研發(fā)面試官,有些話我不得不說(shuō)
40個(gè)Java多線程問(wèn)題詳解復(fù)習(xí)
非常強(qiáng)悍的 RabbitMQ 總結(jié),寫得真好!
Elasticsearch在各大互聯(lián)網(wǎng)公司大量真實(shí)的應(yīng)用案例!
相信自己,沒有做不到的,只有想不到的
在這里獲得的不僅僅是技術(shù)!
喜歡就給個(gè)“在看”
總結(jié)
以上是生活随笔為你收集整理的看得上瘾的斗鱼,首次开源了自家项目 Jupiter !的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: att汇编教程 linux,ATT 汇编
- 下一篇: python 重定向 ctf_3.CTF