鬥魚開源 Go 微服務框架 Jupiter

2020-12-14 加米谷大數據

文章整理:加米谷大數據

Jupiter 是鬥魚開源的,面向服務治理的 Golang 微服務框架,以開發效率和治理效率為核心目標,從統一開發規範、完善監控埋點、降低開發難度等多個維度來幫助 Gopher 開發高性能、高可靠性的微服務框架。

Jupiter 在鬥魚內部經過三年打磨、幾百個服務的線上驗證,在多種應用場景中適配、歷經多次基礎架構迭代,有效地保障了服務應用的快速迭代、精確監控,並在異地多活、容器雲、混沌工程等基礎建設中,支撐服務的平滑遷移、平穩變更。近期,Jupiter Go v0.5.0 正式發布,與之同步發布的還有治理平臺 Juno。兩者相得益彰,幫助開發者快速落地、並具備服務治理能力的微服務架構。我們致力於將 Go 微服務框架標準化,統一錯誤碼、日誌、監控、註冊、流控的 Schema。做到微服務的各個模塊可觀測、可治理,管理微服務研發側的全套生命周期。以下是 Jupiter 的架構圖。

微服務基礎框架

現代微服務架構是分布式的,業務邏輯被拆分到不同的服務中,服務之間通過 RPC 相互調用。隨著業務規模的增大,服務的數量也隨之增加,當增加到一定程度的時候,開發和運維效率將面臨嚴重挑戰。

鬥魚 Web 服務在服務化過程中為應對這種挑戰,逐步形成了以 Jupiter 為核心的基礎框架和以 Juno 為核心的治理平臺。

Jupiter 是作為面向服務治理的微服務基礎框架,有四個核心關注點:

開發效率: 提升開發效率、加速軟體生命周期的迭代。治理效率: 提升治理效率,實現規模化治理。多場景應用: 識別通用場景,形成公共知識,持續提升團隊開發效率。演進式架構: 保證服務在自建機房、容器雲、網格化等基礎架構變更和基礎設施變更過程中的平滑遷移。開發效率

開發效率是 Web 框架的核心關注點,好的 Web 框架融合了代碼規範、最佳實踐和安全編碼,並能顯著提高編碼效率。如果是自研的框架,還承擔著把組織內部的知識,進行抽象和提取,形成公共知識的責任。

同時,Golang 作為一門「新」語言,生態相對也較「新」,實際使用還將面臨一些「額外」風險:

開源類庫的質量和維護力度參差不齊,如果有 bug 或者不兼容問題,其修復難度較大。Golang 去中心化的依賴管理會導致類庫管理困難,開發人員可以隨意「引入」或「升降級」依賴庫。不同類庫的代碼風格差異大,有一定使用成本。Golang 歷經了多種包管理方式,對國內的開發者而言,儼然一部血淚史。目前 gomod 大有改善,但仍有個別老舊類庫存在問題。Jupiter 是伴隨鬥魚服務化一步步實踐而來,經歷了 go1.7 到 go1.14 既平滑(完美向前兼容)又劇烈(生態、依賴管理)的成長。針對業務的開發效率以及「額外」風險,Jupiter 有一些基本的認識:

以 monorepo 的方式整合核心框架、自研類庫並包裝第三方類庫。長期看,這將極大減少維護成本。利用語言機制如 type alias/type embedding 等,封裝常用的第三方類庫,儘量減少直接引用第三方類庫。這提供了一種緩衝機制,避免依賴被隨意「升降級」,第三方 bug 也可以被方便管控。通過包裝,一些關鍵類庫萬不得已的時候可以切到自研,也可以由自研切換到開源,降低維護成本。統一所有包的使用方式,包括配置驅動、統一錯誤碼、統一日誌埋點、指標埋點等,減少開發人員心智負擔。當然,上述很多問題不能僅僅依賴於基礎框架來解決,並且隨著 Golang 語言和生態的發展,一些問題也在不斷緩解。但核心的需求還在,即通過整合基礎框架,降低風險,提高效率。

除了針對主要開發環境的效率提升外,Jupiter 針對調試、測試、CI 流程等方面也做了一些工作,以提高整個軟體周期的效率。

治理效率

治理效率是微服務架構的關鍵需求。微服務架構中,應用數總是不斷上升,人均應用維護數增加到一定數目以後,維護效率將大幅度下降。如果碰到突發事件,將產生嚴重後果。因此,微服務架構非常強調服務治理能力和應用管理能力。一般來說,微服務治理包括:

服務註冊與發現: 服務註冊、負載均衡等可觀測性: 拓撲關係、指標、日誌、鏈路等流量管理: 流量特徵識別、流量導向等,以及基於此的灰度、藍綠髮布、A/B Test 等細分應用安全策略: 訪問控制、限流熔斷等生命周期: 發布、下線管理,版本控制等微服務治理是一項基礎能力,需要代碼規範、治理平臺、基礎框架甚至組織架構等多個方面協作,才能達到比較好的效果。

我們近期還會將治理平臺 juno 開源部分微服務治理能力,未來還將整理和開源更多的治理能力,並與社區共建,進一步完善微服務治理。這部分,我們將在單獨的文檔中進行更詳細說明。

在基礎框架的部分,我們認為基礎框架是溝通業務與治理平臺的關鍵,一定程度上也定義了服務治理流程。在 Jupiter 中,針對服務治理,有幾個關鍵點:

增強核心模塊可觀測性:完善的日誌、指標、鏈路埋點,並形成規範,從而實現報表、報警直出。統一錯誤碼: 規範的錯誤碼和錯誤收斂機制,能夠極大的提升錯誤定位和排查速度。攔截器支持: 針對 http/grpc 的 server/client 以及 redis/mysql/mongo/rocketmq 等 IO,全部支持攔截器機制,以進一步支持更豐富的治理策略。安全策略內置: 主要模塊內置限流熔斷、訪問控制、慢查詢監測等安全策略。流量路由和管理: 提供多種負載均衡和流量路由策略,以及針對 A/B Test、影子流量等細分場景的流量策略。多應用場景

支持多應用場景前,需要準確的識別應用場景,而識別的過程就是一個規範代碼、探索實踐的過程。應用場景的定義可以很寬泛,這裡舉幾個例子簡單說明:

緩存策略。緩存的策略有很多種,在 Web 開發領域也經常使用。我們注意到業務實現中,經常會有數據過期時,一個請求穿透、多個請求原地 block 的場景。通過引入滑動窗口和半衰期,讓一個請求穿透、多個請求正常返回,從而實現更高效的緩存策略。與 Java Dubbo 流量互通。dubbo 支持 gRPC 協議,因此在協議層,dubbo 與 grpc-go 是可以流量互通的。Jupiter 通過增加一個基於接口 (dubbo 的默認註冊方式) 的服務註冊鍵,從而實現服務註冊與發現層面上的流量互通。類似的例子在 Jupiter 中還有很多,如任務編排、流程編排、redis 的並發 pipeline、在線壓測的 mysql 影子流量等。

應用場景的識別是形成公共知識、加速團隊開發效率的重要手段。

演進式架構

Web 開發和運維技術在不斷的發展,短短幾年已湧現出了非常多的計算形態,如雲計算、邊緣計算、容器化、網格化、Serverless 等。服務保障技術方面,異地多活、混沌工程也在不斷發展。語言棧方面,很多公司也在從早期單一的 PHP、Java 棧擴大到多語言棧並存的局面,特別是近年來 Golang 因在容器化和運維效率上的優勢,越來越多的被應用到 Web 服務開發。但每次技術迭代,享受效率提升的同時,也在不斷經歷應用改造和遷移的痛苦。

從應用的角度來看,面對的是一個不斷變化的外部環境,新的問題不斷產生。以鬥魚 Web 服務部為例,可以通過一個時間線管中窺豹:

應用開始服務化: 這個階段開始構建大量的基礎治理平臺,包括發布中心、監控中心、註冊中心及各個管理細分平臺。 同時,一些新的基礎設施開始引入,如 etcd,prometheus、jaeger 等。語言棧從單一的 PHP 擴展為 Golang、Java、PHP 的多語言棧。API 規範、服務互通在這個階段凸顯。多機房建設: 流量管控、服務質量、安全策略的要求凸顯。容器化: 傳統基於 IP/Port 的治理方式、流量管理和分發、服務監控需要做出相應改變。Service Mesh: 基於 SDK 的服務註冊、發現,監控需要適配。總體上,基礎架構的變更將對整個治理體系產生影響,特別是治理平臺。正視變化,並前瞻性和針對性的優化,將有助於減少外部環境變化對業務邏輯的影響,並享受整個生態進步帶來的效率提升。

治理後臺展示

關於治理平臺開源 Juno,這裡放上幾張截圖供大家了解。

相關焦點

  • 鬥魚將基於 Go 語言的微服務框架 Jupiter 正式開源
    今年6 月 1 日,鬥魚將基於 Go 語言的微服務框架 Jupiter 正式開源。據悉,Jupiter 脫胎於鬥魚內部的 Golang 微服務框架,歷經多機房建設、雲化、容器化等多次基礎架構演進,基本涵蓋了內部框架的主要功能。
  • 鬥魚將基於Go語言的微服務框架Jupiter正式開源
    鬥魚將基於Go語言的微服務框架Jupiter正式開源 來源:IT之家 • 2020-08-06 17:19:42 今年6 月 1 日,鬥魚將基於 Go 語言的微服務框架 Jupiter 正式開源。
  • 基於Go 語言,鬥魚發布首個開源框架 Jupiter
    IT之家8月6日消息 今年6 月 1 日,鬥魚將基於 Go 語言的微服務框架 Jupiter 正式開源。據悉,Jupiter 脫胎於鬥魚內部的 Golang 微服務框架,歷經多機房建設、雲化、容器化等多次基礎架構演進,基本涵蓋了內部框架的主要功能。
  • 鬥魚發布首個開源框架Jupiter
    鬥魚首個開源項目來了。2020年6月1日,鬥魚將基於Go語言的微服務框架Jupiter正式開源,這也奠定了鬥魚在國內GO語言開發領域的技術領先地位。據悉,Jupiter脫胎於鬥魚內部的Golang微服務框架,歷經多機房建設、雲化、容器化等多次基礎架構演進,基本涵蓋了內部框架的主要功能。經過了三年打磨,超過30名鬥魚技術人員的不斷優化下,Jupiter已經完成了10個大版本和99個小版本的迭代。而在超過500個業務場景的實際驗證後,鬥魚最終決定將這套微服務框架正式開源。
  • 雲原生 go-zero 微服務框架
    0. go-zero 介紹go-zero 是一個集成了各種工程實踐的 web 和 rpc 框架。通過彈性設計保障了大並發服務端的穩定性,經受了充分的實戰檢驗。使用 go-zero 的好處:輕鬆獲得支撐千萬日活服務的穩定性內建級聯超時控制、限流、自適應熔斷、自適應降載等微服務治理能力,無需配置和額外代碼微服務治理中間件可無縫集成到其它現有框架使用
  • Go 每日一庫之雲原生 go-zero 微服務框架
    0. go-zero 介紹go-zero 是一個集成了各種工程實踐的 web 和 rpc 框架。通過彈性設計保障了大並發服務端的穩定性,經受了充分的實戰檢驗。使用 go-zero 的好處:輕鬆獲得支撐千萬日活服務的穩定性內建級聯超時控制、限流、自適應熔斷、自適應降載等微服務治理能力,無需配置和額外代碼微服務治理中間件可無縫集成到其它現有框架使用極簡的 API 描述,一鍵生成各端代碼自動校驗客戶端請求參數合法性大量微服務治理和並發工具包
  • 可支撐千萬日活,這個Golang框架讓你快速構建高並發微服務
    項目作者:kevwan開源許可協議項目簡介go-zero 是一個集成了各種工程實踐的 web 和 rpc 框架。通過彈性設計保障了大並發服務端的穩定性,經受了充分的實戰檢驗。高性能面向故障編程,彈性設計內建服務發現
  • 開源之殤 華為開源微服務框架servicecomb go語言大範圍抄襲
    從理察·馬修·斯託曼到林納斯·託瓦茲,外國技術社區孕育出一種開源文化。憑藉自由、開放和共享的精神理念,它不僅改變了傳統的軟體開發模式,而且對社會和人們產生深遠的影響。如今,外國的開源已經蓬勃發展,孕育出許多傑出的開源項目、開源社區和優秀的開源人才。
  • MixGo V1.0 發布,混合型高性能 Go 框架
    骨架內置了 gin 作為伺服器,gin 嚴格來講並不是框架,而是一個 server 庫,只提供了伺服器相關的功能,請求處理,中間件,視圖渲染等。 與 beego 等其他 go 框架不同的是,mix-go 的依賴庫全部是獨立倉庫,當你只想使用某一個庫時,可以直接使用語義化版本號,而不是 commitid 版本號。
  • 《2020 年微服務領域開源數位化報告》說了啥?
    國產微服務框架表現搶眼,阿里扛起微服務大旗會議首日正式發布了由 X-Lab 開放實驗室編撰的《 2020 年微服務領域開源數位化報告》,報告顯示:Spring 作為 Java 微服務框架事實標準本項目旨在通過建立一份建立在微服務領域的相對完整、可以反覆進行推演的數據報告(報告、數據、算法均開源),分析微服務框架項目以及 Spring Cloud 項目的 GitHub 開發者行為日誌,通過多維度數據分析的視⻆,來觀察微服務領域的開源現狀、進展 趨勢、演化特徵等問題。
  • go-admin 開源後臺管理系統
    go-admin是一個go語言開發的後臺管理系統,該系統以角色為基礎的權限管理設計(RBAC),完成了系統管理模塊功能的開發(其他示例模塊後續加上),採用前後端分離實現方式,服務端基於go開源gin框架,前端開源框架vue-element-admin。使用Swagger 2.0自動生成API文檔。
  • Go語言Gin框架的優秀應用案例,開源Web項目骨架了解一下
    它是一個類似於 martini 但擁有更好性能的 API 框架, 優於 httprouter,速度提高了近 40 倍。今天為大家介紹的這款開源項目就是基於 Gin 框架的 Web 項目模板,歡迎大家使用和學習。
  • 老王學習go語言——2.1 微服務
    慣例還是把書名放在前面《go語言高並發與微服務實戰》 朱榮鑫 黃迪璇 張天這一章最主要還是普及微服務的知識,介紹SpringCloud和Dubbo以及基於Go語言實現的Go kit 和Go Micro,最後有一部分是DDD(領域驅動開發)和微服務設計原則的相關內容。
  • Go語言Gin框架的優秀應用案例,開源Web項目骨架了解一下
    Gin 是一個用 Go (Golang) 編寫的 HTTP web 框架。 它是一個類似於 martini 但擁有更好性能的 API 框架, 優於 httprouter,速度提高了近 40 倍。今天為大家介紹的這款開源項目就是基於 Gin 框架的 Web 項目模板,歡迎大家使用和學習。
  • Go實戰--微框架(Goji+Mongodb構建微服務)
    生命不止,繼續 go go go!!!今天跟大家分享一個web微框架Goji.文檔地址:https://godoc.org/goji.io獲取:goGoji是一個用Go語言寫的Web微框架。Goji的設計理念是簡單、可組合性、自由。
  • 網易雲輕舟微服務深度解讀:基於開源,強於開源
    (網易考拉技術專家 程漢)作為網易雲的內部客戶,網易考拉也是業界微服務實踐的先行者,據網易考拉技術專家程漢介紹,在他最初加入考拉時只有10個左右的服務,核心服務有4-5個,大部分的業務變更都集中在這幾個服務,相當於幾十個人去開發同一個服務
  • 支持多語言的微服務框架Tars-Go
    2020年3月,Linux基金會正式宣布旗下的TARS開源項目將成立TARS基金會。典型的代表有 gRPC、Thrift 等,他們很好地解決了服務間通信的問題,大部分也支持多語言,但使用這類框架時需要自己去解決服務治理問題。◈ 帶服務治理但支持單一語言的框架 。
  • Beego:簡約 & 強大並存的 Go 應用框架
    引言:Beego 是一個快速開發 Go 應用的 HTTP 框架,他可以用來快速開發 API、Web 及後端服務等各種應用,是一個 RESTful 的框架,主要設計靈感來源於 tornado、sinatra 和 flask 這三個框架,但是結合了 Go 本身的一些特性(interface、struct 嵌入等)而設計的一個框架。目錄:1.
  • IT挑戰高薪必備Go語言常識-Go WEB框架
    如果你只是想寫一個自己用的小網站,或許你不需要框架,但如果你是要開發一個投入生產運營的WEB服務端,那你最好用一個成熟的WEB框架,那樣會少走很多彎路。Beego:Beego是一個快速開發Go應用的http框架,Beego可以用來快速開發API、Web、後端服務等各種應用,是一個RESTFul的框架,主要設計靈感來源於tornado、sinatra、flask這三個框架,並結合了Go本身的一些特性(interface、struct繼承等)而設計的一個框架。Beego是基於各個獨立的模塊之上構建的,是一個高度解耦的框架。
  • Mix PHP V2.2 發布,與 go-micro 深度集成的 PHP 微服務開發框架
    微服務框架 🆕微服務開發本次版本更新主要是增加微服務開發相關的組件與開發骨架,從上一次 Mix V2.1 非常激進的切換為單線程協程後 [為何從 Reactor+Manager+Worker 多進程改為單線程協程],Mix V2.2 在微服務方面也非常激進的選擇了和其他 Swoole 框架截然不同的路徑:與 go-micro 微服務生態深度集成