高級JAVA面試題詳解(五)——Dubbo(分層、協議、負載均衡策略、服務註冊與發現)

先來誇一誇Dubbo

Dubbo 是一個分佈式、高性能、透明化的 RPC 服務框架,提供服務自動註冊、自動發現等高效服務治理方案, 可以和 Spring 框架無縫集成。提供對多種 NIO 框架抽象封裝,包括多種線程模型、序列化、同步轉異步和請求-響應模式的信息交換方式。集羣容錯,包括多協議支持、軟負載均衡、失敗容錯、地址路由、動態配置等集羣支持。

Dubbo框架分了哪些層?分別做什麼?

  1. 服務接口層(Service):該層是與實際業務邏輯相關的,根據服務提供方和服務消費方的業務設計對應的接口和實現
  2. 配置層(Config):對外配置接口,以 ServiceConfig 和 ReferenceConfig 爲中心
  3. 服務代理層(Proxy):服務接口透明代理,生成服務的客戶端 Stub 和服務器端 Skeleton
  4. 服務註冊層(Registry):封裝服務地址的註冊與發現,以服務 URL 爲中心
  5. 集羣層(Cluster):封裝多個提供者的路由及負載均衡,並橋接註冊中心,以 Invoker 爲中心
  6. 監控層(Monitor):RPC 調用次數和調用時間監控
  7. 遠程調用層(Protocol):封將 RPC 調用,以 Invocation 和 Result 爲中心,擴展接口爲 Protocol、Invoker、Exporter,Dubbo的核心模型,其他模型都是向它靠攏,或轉換成它
  8. 信息交換層(Exchange):封裝請求響應模式,同步轉異步,以 Request 和 Response 爲中心
  9. 網絡傳輸層(Transport):抽象 mina 和 netty 爲統一接口,以 Message 爲中心
  10. 數據序列化層(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服務註冊發現與調用流程

服務提供方和服務消費方之間的調用關係

  1. Provider 註冊服務地址(Provider(服務提供者)連接註冊中心,將本機 IP、端口、應用信息和提供服務信息發送至註冊中心存儲)
  2. Consumer 訂閱服務地址(連接註冊中心 ,發送應用信息、獲取服務提供者的地址,並緩存下來。注:xml配置文件中有個check屬性默認爲true,也就是當啓動時檢查沒有提供者就報錯,設置爲false則不檢查)
  3. 推送服務地址列表(當服務提供者發生變化時推送給對應的訂閱者)
  4. 發起遠程調用(如有多個服務提供者根據路由策略/負載均衡策略 確定調用的服務提供者地址,如果調用失敗,換一個地址嘗試再次調用。注:xml配置文件中retries屬性爲重試次數,默認爲:2次)
  5. 推送調用次數給Monitor(監控器會記錄各個消費者與服務提供者的接口調用次數)

dubbbo admin 會監聽所有的服務提供者與消費者,並管理他們,通過dubbo admin 可以自定義配置路由規則。

Dubbo除了正常參數傳輸,還可以具體怎麼把數據帶給下游?

RpcContext.getContext().setAttachment()。配合dubbo Filter 實現誇系統日誌鏈路追蹤

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章