RPC架構主要組成:
- 通信架構
- 通信協定
- 序列化和反序列化格式
1 分類
RPC架構主要分為:
1.1 綁定語言平台
1.1.1 Dubbo
國内最早開源的RPC架構,由阿裡巴巴公司開發并于2011年末對外開源,僅支援Java
架構
- Consumer 服務消費者
- Provider 服務提供者
- Registry 注冊中心
- Monitor是監控系統
互動流程
- Consumer通過Registry擷取到Provider節點
- 再通過Dubbo的用戶端SDK與Provider建立連接配接,并發起調用
- Provider通過Dubbo的服務端SDK接收到Consumer請求
- 處理後再把結果傳回給Consumer
服務消費者、提供者都需引入Dubbo的SDK才來完成RPC調用,因為Dubbo是用Java實作,是以要求服務消費者、提供者也都必須用Java。
主要實作
- 預設采用Netty作為通信架構
- 除了支援私有的Dubbo協定外,還支援RMI、Hession、HTTP、Thrift
- 支援多種序列化格式,比如Dubbo、Hession、JSON、Kryo、FST
1.1.2 Motan
微網誌内部使用的RPC架構,于2016年對外開源,僅支援Java。
與Dubbo類似,都要在Client端(服務消費者)和Server端(服務提供者)引入SDK
register
和注冊中心互動,包括注冊服務、訂閱服務、服務變更通知、服務心跳發送等功能。Server端會在系統初始化時通過register子產品注冊服務,Client端會在系統初始化時通過register子產品訂閱到具體提供服務的Server清單,當Server清單發生變更時也由register子產品通知Client。
protocol
用來進行RPC服務的描述和RPC服務的配置管理,這一層還可以添加不同功能的filter用來完成統計、并發限制等功能。
serialize
将RPC請求中的參數、結果等對象進行序列化與反序列化,即進行對象與位元組流的互相轉換,預設使用對Java更友好的Hessian 2進行序列化。
transport
用來進行遠端通信,預設使用Netty NIO的TCP長連結方式。
cluster
Client端使用的子產品,cluster是一組可用的Server在邏輯上的封裝,包含若幹可以提供RPC服務的Server,實際請求時會根據不同的高可用與負載均衡政策選擇一個可用的Server發起遠端調用。