先來誇一誇Dubbo
Dubbo 是一個分佈式、高性能、透明化的 RPC 服務框架,提供服務自動註冊、自動發現等高效服務治理方案, 可以和 Spring 框架無縫集成。提供對多種 NIO 框架抽象封裝,包括多種線程模型、序列化、同步轉異步和請求-響應模式的信息交換方式。集羣容錯,包括多協議支持、軟負載均衡、失敗容錯、地址路由、動態配置等集羣支持。
Dubbo框架分了哪些層?分別做什麼?
- 服務接口層(Service):該層是與實際業務邏輯相關的,根據服務提供方和服務消費方的業務設計對應的接口和實現
- 配置層(Config):對外配置接口,以 ServiceConfig 和 ReferenceConfig 爲中心
- 服務代理層(Proxy):服務接口透明代理,生成服務的客戶端 Stub 和服務器端 Skeleton
- 服務註冊層(Registry):封裝服務地址的註冊與發現,以服務 URL 爲中心
- 集羣層(Cluster):封裝多個提供者的路由及負載均衡,並橋接註冊中心,以 Invoker 爲中心
- 監控層(Monitor):RPC 調用次數和調用時間監控
- 遠程調用層(Protocol):封將 RPC 調用,以 Invocation 和 Result 爲中心,擴展接口爲 Protocol、Invoker、Exporter,Dubbo的核心模型,其他模型都是向它靠攏,或轉換成它
- 信息交換層(Exchange):封裝請求響應模式,同步轉異步,以 Request 和 Response 爲中心
- 網絡傳輸層(Transport):抽象 mina 和 netty 爲統一接口,以 Message 爲中心
- 數據序列化層(Serialize):可複用的一些工具,擴展接口爲Serialization、ObjectInput,ObejctOutput和ThreadPool。
Dubbo支持哪些協議?
協議 | 鏈接個數 | 鏈接方式 | 傳輸協議 | 傳輸方式 | 序列化 | 適用場景 |
---|---|---|---|---|---|---|
Dubbo缺省協議 默認協議 |
單連接 | 長連接 | TCP | NIO異步傳輸 | Hessian 二進制序列化 | 小數據大併發 消費者多提供者少 |
RMI協議 | 多連接 | 短連接 | TCP | 同步傳輸 | Java標準二進制序列化 | 採用 JDK 標準的 java.rmi.* 實現 傳輸數據包大小混合 支持文件傳輸 消費者與提供者個數差不多 |
Http協議 | 多連接 | 短連接 | HTTP | 同步傳輸 | 表單序列化 (即 json) | 適用於同時給應用程序和瀏覽器 JS 使用的服務 |
WebService協議 | 多連接 | 短連接 | HTTP | 同步傳輸 | SOAP文本序列化 | 系統集成,跨語言調用 |
Thrift協議 | - | - | - | - | - | 使用較少,Thrift不支持null值 |
Redis協議 | - | - | - | - | - | 使用較少,基於 Redis實現的 RPC 協議 |
Memcached協議 | - | - | - | - | - | 使用較少,基於Memcached實現的 RPC 協議 |
Rest協議 | - | - | - | - | - | 使用較少,於標準的Java REST API,實現的REST調用支持 |
Dubbo有哪些負載均衡策略?
- Random LoadBalance(默認):隨機選取提供者策略,隨機轉發請求,可以加權
- RoundRobin LoadBalance:輪循選取提供者策略,請求平均分佈
- LeastActive LoadBalance:最少活躍調用策略,可以讓慢提供者接收更少的請求
- ConstantHash LoadBalance:一致性 Hash 策略,相同參數請求總是發到同一提供者,一臺機器宕機,可以基於虛擬節點,分攤至其他提供者
Dubbo服務註冊發現與調用流程
- Provider 註冊服務地址(Provider(服務提供者)連接註冊中心,將本機 IP、端口、應用信息和提供服務信息發送至註冊中心存儲)
- Consumer 訂閱服務地址(連接註冊中心 ,發送應用信息、獲取服務提供者的地址,並緩存下來。注:xml配置文件中有個check屬性默認爲true,也就是當啓動時檢查沒有提供者就報錯,設置爲false則不檢查)
- 推送服務地址列表(當服務提供者發生變化時推送給對應的訂閱者)
- 發起遠程調用(如有多個服務提供者根據路由策略/負載均衡策略 確定調用的服務提供者地址,如果調用失敗,換一個地址嘗試再次調用。注:xml配置文件中retries屬性爲重試次數,默認爲:2次)
- 推送調用次數給Monitor(監控器會記錄各個消費者與服務提供者的接口調用次數)
dubbbo admin 會監聽所有的服務提供者與消費者,並管理他們,通過dubbo admin 可以自定義配置路由規則。
Dubbo除了正常參數傳輸,還可以具體怎麼把數據帶給下游?
RpcContext.getContext().setAttachment()。配合dubbo Filter 實現誇系統日誌鏈路追蹤