微博輕量級RPC框架Motan

 

Motan 是微博技術團隊研發的基於 Java 的輕量級 RPC 框架,已在微博內部大規模應用多年,天天穩定支撐微博上億次的內部調用。Motan 基於微博的高併發和高負載場景優化,成爲一套簡單、易用、高可用的 RPC 服務框架。html

  Motan 功能特色:簡單、易用、高可用git

  無侵入集成、簡單易用,經過 Spring 配置方式,無需額外代碼便可集成分佈式調用能力。github

  集成服務發現和服務治理能力,靈活支持多種配置管理組件,如 Consul、ZooKeeper 等。架構

  支持自定義動態負載均衡、跨機房流量調整等高級服務調度能力。併發

  基於高併發、高負載場景優化,具有 Failover、Failfast 能力,保障 RPC 服務高可用。app

  業界典型 RPC 框架對比負載均衡

  目前,業界 RPC 框架大體分爲兩類,一種是偏重服務治理,另外一種側重跨語言調用。框架

  服務治理型的 RPC 框架典型的是 Dubbo 和 DubboX。Dubbo 是阿里開源的分佈式服務框架,實現高性能的 RPC 調用同時提供了豐富的管理功能,是一款應用普遍的優秀的 RPC 框架,但如今較少維護更新。DubboX 是由噹噹在基於 Dubbo 框架擴展的一個 RPC 框架,支持 REST 風格的遠程調用、Kryo/FST 序列化,增長了一些新的 feature。dom

  這類 RPC 框架的特色是功能豐富,提供高性能的遠程調用、服務發現及服務治理能力,適用於大型服務的服務解耦及服務治理,對於特定語言(Java)的項目能夠實現透明化接入。缺點是語言耦合度較高,跨語言支持難度較大。異步

  跨語言調用型的 RPC 框架有 Thrift、gRPC、Hessian、Hprose 等。這類 RPC 框架側重於服務的跨語言調用,可以支持大部分的語言進行語言無關的調用,很是適合多語言調用場景。但這類框架沒有服務發現相關機制,實際使用時須要代理層進行請求轉發和負載均衡策略控制。

  微博的 Motan RPC 傾向於服務治理型,跨語言方面正在嘗試與 PHP 的調用集成。與 Dubbo 系列相比在功能上或許不是那麼全,擴展實現也沒有那麼多,但 Motan 更注重簡單、易用以及在高併發高可用場景的使用。

  Motan 是基於 Java 的高性能輕量級 RPC 框架,其具有實用的服務治理功能和 RPC 協議擴展能力。服務發現靈活支持多種配置管理組件,基於高併發高負載場景的高可用策略優化,良好的 SPI(Service Provider Interface)擴展,詳細的調用統計,靈活支持多種 RPC 傳輸協議,在使用上,無縫支持Spring 配置方式,經過簡單靈活的配置便可快速接入使用。

  Motan 的架構及模塊設計

  架構設計,分爲服務提供方(RPC Server)、服務調用方(RPC Client)、註冊中心(Registry)三個角色,Server 向 Registry 註冊聲明所提供的服務;Client 向 Registry 訂閱指定服務,與 Registry 返回的服務列表的 Server 創建鏈接,進行 RPC 服務調用。Client 經過 Registry 感知 Server 的狀態變動。三者的交互關係以下圖:

  服務模塊化設計方便靈活擴展,Motan 主要包括 register、transport、serialize、protocol、cluster 等,各個模塊都是支持經過SPI 進行擴展,各個模塊的交互圖以下:

  register 模塊

  用來和註冊中心進行交互,包括註冊服務、訂閱服務、服務變動通知、服務心跳發送等功能;Server 端會在系統初始化時經過 register 模塊註冊服務,Client 端在系統初始化時會經過 register 模塊訂閱到具體提供服務的 Server 列表,當 Server 列表發生變動時也由 register 模塊通知 Client。

  protocol 模塊

  用來進行 RPC 服務的描述和 RPC 服務的配置管理,這一層還能夠添加不一樣功能的 filter 用來完成統計、併發限制等功能。

  serialize 模塊將 RPC 請求中的參數、結果等對象進行序列化與反序列化,即進行對象與字節流的互相轉換;默認使用對 Java 更友好的 hessian2 進行序列化。

  transport 模塊用來進行遠程通訊,默認使用 Netty NIO 的 TCP 長連接方式。

  cluster 模塊

  Client 端使用的模塊,cluster 是一組可用的 Server 在邏輯上的封裝,包含若干能夠提供 RPC 服務的 Server,實際請求時會根據不一樣的高可用與負載均衡策略選擇一個可用的 Server 發起遠程調用。

  在進行 RPC 請求時,Client 經過代理機制調用 cluster 模塊,cluster 根據配置的 HA 和 LoadBalance 選出一個可用的 Server,經過 serialize 模塊把RPC 請求轉換爲字節流,而後經過 transport 模塊發送到 Server 端。

  服務配置化加強了 Motan 的易用性,Motan 框架中將功能模塊抽象爲四個可配置的元素,分別爲:

  protocol:服務通訊協議。服務提供方與消費方進行遠程調用的協議,默認爲 Motan 協議,使用 hessian2 進行序列化,Netty 做爲 Endpoint 以及使用Motan 自定義的協議編碼方式。 registry:註冊中心。服務提供方將服務信息(包含 IP、端口、服務策略等信息)註冊到註冊中心,服務消費方經過註冊中心發現服務。當服務發生變動,註冊中心負責通知各個消費方。 service:服務提供方提供的服務。使用方將核心業務抽取出來,做爲獨立的服務。經過暴露服務並將服務註冊至註冊中心,從而使調用方調用。 referer:服務消費方對服務的引用,即服務調用方。

  Motan 推薦使用 Spring 配置 RPC 服務,目前 Motan 擴展了 6 個自定義 Spring XML 標籤 motan:protocol motan:registry motan:basicService

  motan:service motan:basicReferer motan:referer

  高可用方面是 Motan 的一大特色,支持多種服務治理和高可用機制,包括:

  靈活多樣的集羣負載均衡策略,支持 ActiveWeight/Random/RoundRobin/LocalFirst/Consistent 等 6 種策略,並支持自定義擴展; 自動集成 Failover、Failfast 容錯策略,實現故障節點自動摘除,自動探測恢復,有效進行服務故障隔離,遠離服務卡死及雪崩; 鏈接池自定義控制,根據業務場景靈活配置; 支持多機房間調用流量壓縮、動態流量調整,實現真正的跨 IDC 的高可用。

  基於高併發、高負載場景的優化,具有在高壓力場景下的高可用能力。

  基準測試狀況以下:

  Server 端:併發多個 Client,鏈接數 50、併發數 100 的場景

  空包請求:單 Server TPS 18W

  1K String 請求:單 Server TPS 8.4W

  5K String 請求:單 Server TPS 2W

  Client端:(場景對比圖以下)

  Motan 提供了基礎性能測試框架,歡迎使用者進行性能評估,源碼請參考 motan benchmark 文檔:

  https://github.com/weibocom/motan/tree/master/motan-benchmark

  Motan 使用及易用性方面,Motan 使用 Spring 進行配置,業務代碼無需修改,工程依賴只涉及核心 5 個模塊,且能夠按需依賴。關於在項目中使用Motan 框架的具體步驟,可參考快速入門文檔:https://github.com/weibocom/motan/blob/master/docs/wiki/zh_quickstart.md

  是否重複造輪子

  在 RPC 框架的選擇上,如上面針對各類 RPC 框架的對比,當前業界可供選擇並持續維護的優秀 RPC 框架並很少。同時鑑於微博的內部調用量很是大,而且會有不少定製化的場景,要作到平滑的遷移到這些 RPC 框架也須要作很多定製化的改造,最終微博決定自主研發。主要從如下幾個方面考慮:

  框架的性能和可用性須要定製化;

  微博內部調用量級很是大,業界不多相似場景的應用經驗能夠借鑑,須要針對高併發和複雜邏輯場景定製優化。 好比Motan 的 Failover 和 Failfast 機制等儘可能作到平滑的遷移;

  線上業務遷移須要保障業務改造儘可能少,支持可快速回退,這個必須有有效的機制保障。好比 Motan 的 inJvm 機制等將來多語言兼容接入訴求;

  微博總體技術體系包括 Java 和 PHP,還有部分 Erlang、C++ 等,將來但願可以經過這套服務框架解決總體內部依賴調用問題。 技術積累儲備及掌控力。

  Motan 的發展及開源

  Motan 當前在微博內部已經普遍應用,天天支撐着上億的內部調用,這個過程也是一個持續改進優化的過程。從服務發現、服務容錯、快速失敗、故障降級等多方面,針對複雜業務架構及高併發場景進行不斷的定製優化改進。隨着虛擬化技術的興起,彈性調度成爲成熟技術框架不可或缺的能力,新的Motan 框架技術負責人也適時對其增長了數據流量壓縮、動態流量調整、多註冊中心支持等功能、讓 Motan 可以適應時代的變化。

  爲了方便其餘團隊的複用,針對 Motan 核心功能進行抽離和封裝,去除掉微博自身依賴,造成今天的 Motan 開源版本,但願能發揮開源社區的力量,進一步發展和發揮 Motan 的價值。

  Motan 的期待

  在這惟快不破的互聯網時代,軟件的開發速度已經達到了史無前例的高度。這得益於軟件已有模塊的大規模複用。在過去的幾年裏,開源軟件無疑在這方面作出了巨大的貢獻。

  微博技術團隊表示,受益於開源社區,同時也但願可以爲開源社區貢獻本身的力量。 Motan 是通過微博大規模實踐的輕量級 RPC 框架,但願將來能有更多優秀的開源人一塊兒進一步完善優化。也期待更多的公司能夠享受 Motan 這個輕量級 RPC 框架帶來的非通常的感受。

  Motan 項目地址: https://github.com/weibocom/motan

  Q&A

  1. Motan 和業界已有的 RPC 框架,好比 Dubbo 相比有什麼優點?

  Dubbo 功能上比較豐富,與 Dubbo 的分層來對比,Motan 的模塊層次要更簡單一些,沒有 exchange 和 directory 等。從壓測的結果來看,在微博的業務場景下 Motan 的性能比 Dubbo 要好一些。

  2. 如今的版本能用於生產環境嗎?

  目前 Motan 支持了微博的絕大部分底層核心業務,目前看來比較穩定。可是不排除會有一些使用環境不一致形成的問題,建議最好測試一下再應用到生產環境。

  3. Motan 支持跨語言調用嗎?

  目前暫時只支持 Java 應用,針對 PHP YAR 框架的支持已經在開發中,將來會支持更多語言。

  4. 開源版 Motan 與微博內部的版本功能同樣嗎?

  開源版 Motan 包含了內部版本中的大部分功能,主要是去除了一些內部的依賴組件相關的功能。

  5. Motan 支持異步調用嗎?如何實現?

  Motan 的請求在傳輸層面爲異步調用,不須要額外配置。

  6. 我在使用 Motan 時遇到了問題,應該去哪裏提問?

  能夠在 Github 裏提交[Issue]: https://github.com/weibocom/motan/issues

相關文章
相關標籤/搜索