支撐微博千億調用的輕量級 RPC 框架 Motan

支撐微博千億調用的輕量級 RPC 框架 Motan

  • 開源協議:Apache
  • 操作系統: Windows Linux OS X
  • 開發語言:Java
  • 項目所有者:weibocom
  • 所屬公司:新浪
  • 收錄時間:2016-04-25
  • 分享:
編輯評級
4

項目詳細介紹

支撐微博千億調用的輕量級 RPC 框架 Motan 正式開源了!項目地址:

https://github.com/weibocom/motan

Motan 是微博技術團隊研發的基于 Java 的輕量級 RPC 框架,已在微博內部大規模應用多年,每天穩定支撐微博上億次的內部調用。Motan 基于微博的高并發和高負載場景優化,在微博多位技術專家在業務場景實踐中的共同打磨下,成為一套簡單、易用、高可用的 RPC 服務框架。

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

Motan 是一套輕量級的 RPC 框架,具有服務治理能力,簡單、易用、高可用。

  • 無侵入集成、簡單易用,通過 Spring 配置方式,無需額外代碼即可集成分布式調用能力

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

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

  • 基于高并發、高負載場景優化,具備 Failover、Failfast 能力,保障 RPC 服務高可用

業界典型 RPC 框架對比

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

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

這類 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 的高可用。

基于高并發、高負載場景的優化,具備在高壓力場景下的高可用能力?;鶞蕼y試情況如下:

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++ 等,未來希望能夠通過這套服務框架解決整體內部依賴調用問題。

  • 技術積累儲備及掌控力;微博具有一批實戰經驗很豐富的技術專家,技術有實力又熟悉微博場景,多位技術專家也對此表現了濃厚的興趣。

于是在團隊多位技術專家的共同努力下,微博輕量級 RPC 框架 Motan 很快誕生了,并快速在微博內部進行應用。

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

標簽:motan  新浪

湖北体彩十一选五玩法 如何分析股票涨跌 广东26选5开奖软件 安徽十五选五开奖结果 贵州快3开奖结果查询全 大乐透500期基本走势图 湖南快乐十分官网分析 青海快3哪里有卖的 000007股票行情 快乐十分山西 福建快三2月推荐