[鬥魚] 沒人比我更懂微服務--Go 微服務框架 Jupiter
[鬥魚] 沒人比我更懂微服務--Go 微服務框架 Jupiter
作者:aerox@ 鬥魚
專案開源地址:https://github.com/douyu/jupiter
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、jager 等。
• 語言棧從單一的 PHP 擴充套件為 Golang、Java、PHP 的多語言棧。API 規範、服務互通在這個階段凸顯。
• 多機房建設: 流量管控、服務質量、安全策略的要求凸顯。
• 容器化: 傳統基於 IP/Port 的治理方式、流量管理和分發、服務監控需要做出相應改變。
• Service Mesh: 基於 SDK 的服務註冊、發現,監控需要適配。
總體上,基礎架構的變更將對整個治理體系產生影響,特別是治理平臺。正視變化,並前瞻性和針對性的優化,將有助於減少外部環境變化對業務邏輯的影響,並享受整個生態進步帶來的效率提升。
結語
以上是 Jupiter 對微服務架構實踐的一些核心關注點和功能的介紹。詳細的介紹,歡迎大家訪問https://github.com/douyu/jupiter來了解。
Jupiter Go 正在快速迭代,v0.5.0 包含了基本的架構骨架,更多的功能也在逐步整理,並將儘快開源出來。我們非常歡迎感興趣的開發者參與貢獻,一起來豐富 Jupiter 的功能、推動未來版本的演進。
最後我們這裡有個小活動,在 6 月 8 日 24 點前,可以在我們地址https://github.com/douyu/jupiter,提有關 jupiter 或者微服務的建議和意見,我們會挑選有建設性的 issue,發放我們的鬥魚周邊禮物。
加入我們
釘釘
微信
治理後臺展示
鑑於治理平臺開源 Juno 還在做開源前的整理準備,這裡放上幾張截圖供大家提前瞭解。
- 加微信實戰群請加微信(註明:實戰群):gocnio
相關文章
- Java微服務 vs Go微服務,究竟誰更強!?Java微服務Go
- go-zero:微服務框架Go微服務框架
- go微服務Go微服務
- go 微服務Go微服務
- 雲原生 go-zero 微服務框架Go微服務框架
- go proto 微服務Go微服務
- Go微服務架構系列--gin框架(上)Go微服務架構框架
- go-zero:開箱即用的微服務框架Go微服務框架
- 雲原生微服務框架之go-zero微服務框架Go
- 曉黑板 go-zero 微服務框架介紹Go微服務框架
- Go-chassis 微服務開發框架系列(一)Go微服務框架
- go-zero微服務框架的靜態檔案服務Go微服務框架
- 淺析微服務框架微服務框架
- go-kit微服務:限流Go微服務
- 二.Go微服務--令牌桶Go微服務
- go微服務系列之一Go微服務
- go微服務系列之三Go微服務
- Go微服務開發指南Go微服務
- dotnet core微服務框架Jimu ~ 會員授權微服務微服務框架
- dotnet core微服務框架Jimu ~ 會員註冊微服務微服務框架
- 微服務框架-dubbo整合nacos框架微服務框架
- Go chassis 微服務開發框架實戰系列(二)Go微服務框架
- Go語言微服務開發框架實踐-go chassis(中篇)Go微服務框架
- Go語言微服務開發框架實踐-go chassis(上篇)Go微服務框架
- go微服務系列(三) - 服務呼叫(http)Go微服務HTTP
- go-kit微服務:服務熔斷Go微服務
- GO 微服務周邊服務持續整合Go微服務
- 微服務:更愉快還是更嘈雜?微服務
- 微服務分散式事務Saga框架微服務分散式框架
- go微服務框架go-micro深度學習(二) 入門例子Go微服務框架深度學習
- Go微服務框架go-kratos實戰01:quickstart 快速開始Go微服務框架UI
- go-kit 微服務實踐Go微服務
- go-kit微服務:HTTP RESTGo微服務HTTPREST
- Podinfo,迷你的 Go 微服務模板Go微服務
- 開箱即用的微服務框架 Go-zero(進階篇)微服務框架Go
- 首次直播揭祕 Dubbo Ecosystem:從微服務框架到微服務生態微服務框架
- 微服務系列 2:微服務化框架的模型和治理能力設計微服務框架模型
- 微服務02 Kafka訊息佇列, Dubbo, Springcloud微服務框架, Nacos微服務Kafka佇列SpringGCCloud框架