RPC
概覽
RPC - Remote Procedure Call 遠程服務調用
- 在分佈式計算,遠程過程調用是一個計算機通信協議
- 分佈式服務
- 服務治理的另一條路
- 跨進程數據交互
- 其他跨進程數據交互方式
- http/https
- WebService
- MQ
- RESTful
- RPC是一種服務器-客戶端(Client/Server)模式
- 面向對象編程中,亦可稱作遠端呼叫或遠端方法呼叫
- 常見的實現框架
- Apache Dubbo(Alibaba 開源)
- Java RMI
- google gRpc
- Apache Thrift(Facebook 開源)
- Twitter Finagle
一次 RPC 調用過程(同步)
角色
- 服務提供方(producer/server)
- 服務消費方 (comsumer/client)
- comsumer 以本地調用方式調用服務
comsumer stub
(客戶端代理)接到調用請求,將請求信息進行封裝(服務名、方法名、請求參數、等等)成消息體
(通過特定協議
進行編碼,序列化協議
,Hessian、protobuf、kryo、fastjson、gson、fst等等)comsumer stub
找到producer
的服務地址(ip、port)(本地記錄、廣播、註冊中心
)comsumer stub
將消息體
發送到服務端(特定網絡通訊協議
,如 Netty、http等)server stub
(服務端代理)收到消息,進行解碼(與上面的協議要一致)server stub
根據解碼信息,調用本地服務(本地方法)- 本地服務將執行結果返回給
server stub
server stub
對結果進行封裝(進行編碼), 然後發送給消費方(通訊協議)comsumer stub
解碼消息- comsumer 像調用本地方法一樣
調用遠程服務
,獲取到了返回結果
其中 2~9 步驟爲 RPC 框架的職責,業務方只需要完成 1 和 10
Dubbo
- http://dubbo.apache.org/zh-cn/index.html
- apache dubbo 相關倉庫
- https://github.com/alibaba/spring-cloud-alibaba
快速啓動
https://github.com/alibaba/spring-cloud-alibaba
架構
config 配置層
:對外配置接口,以 ServiceConfig, ReferenceConfig 爲中心,可以直接初始化配置類,也可以通過 spring 解析配置生成配置類proxy 服務代理層
:服務接口透明代理,生成服務的客戶端 Stub 和服務器端 Skeleton, 以 ServiceProxy 爲中心,擴展接口爲 ProxyFactoryregistry 註冊中心層
:封裝服務地址的註冊與發現,以服務 URL 爲中心,擴展接口爲 RegistryFactory, Registry, RegistryServicecluster 路由層
:封裝多個提供者的路由及負載均衡,並橋接註冊中心,以 Invoker 爲中心,擴展接口爲 Cluster, Directory, Router, LoadBalancemonitor 監控層
:RPC 調用次數和調用時間監控,以 Statistics 爲中心,擴展接口爲 MonitorFactory, Monitor, MonitorServiceprotocol 遠程調用層
:封裝 RPC 調用,以 Invocation, Result 爲中心,擴展接口爲 Protocol, Invoker, Exporterexchange 信息交換層
:封裝請求響應模式,同步轉異步,以 Request, Response 爲中心,擴展接口爲 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServertransport 網絡傳輸層
:抽象 mina 和 netty 爲統一接口,以 Message 爲中心,擴展接口爲 Channel, Transporter, Client, Server, Codecserialize 數據序列化層
:可複用的一些工具,擴展接口爲 Serialization, ObjectInput, ObjectOutput, ThreadPool
– http://dubbo.apache.org/zh-cn/docs/dev/design.html
模塊
-
dubbo-common 公共邏輯模塊:包括 Util 類和通用模型。
-
dubbo-remoting 遠程通訊模塊:相當於 Dubbo 協議的實現,如果 RPC 用 RMI協議則不需要使用此包。
-
dubbo-rpc 遠程調用模塊:抽象各種協議,以及動態代理,只包含一對一的調用,不關心集羣的管理。
-
dubbo-cluster 集羣模塊:將多個服務提供方僞裝爲一個提供方,包括:負載均衡, 容錯,路由等,集羣的地址列表可以是靜態配置的,也可以是由註冊中心下發。
-
dubbo-registry 註冊中心模塊:基於註冊中心下發地址的集羣方式,以及對各種註冊中心的抽象。
-
dubbo-monitor 監控模塊:統計服務調用次數,調用時間的,調用鏈跟蹤的服務。
-
dubbo-config 配置模塊:是 Dubbo 對外的 API,用戶通過 Config 使用Dubbo,隱藏 Dubbo 所有細節。
-
dubbo-container 容器模塊:是一個 Standlone 的容器,以簡單的 Main 加載 Spring 啓動,因爲服務通常不需要 Tomcat/JBoss 等 Web 容器的特性,沒必要用 Web 容器去加載服務。
-
dubbo-filter 過濾器
-
dubbo-serialization 序列化
-
dubbo-metadata 元數據
-
dubbo-plugin 插件
-
dubbo-distribution 分佈式
-
dubbo-configcenter 配置中心
-
dubbo-compatible 兼容(2.5.x 升級到 2.6.x 、2.7.x)