日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Dubbo常见面试题与答案

發布時間:2025/3/12 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Dubbo常见面试题与答案 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Dubbo的基礎知識

Dubbo的核心架構是怎樣的?

  • Registry:注冊中心。 負責服務地址的注冊與查找,服務的 Provider 和 Consumer 只在啟動時與注冊中心交互。注冊中心通過長連接感知 Provider 的存在,在 Provider 出現宕機的時候,注冊中心會立即推送相關事件通知 Consumer;

  • Provider:服務提供者。 在它啟動的時候,會向 Registry 進行注冊操作,將自己服務的地址和相關配置信息封裝成 URL 添加到 ZooKeeper 中;

  • Consumer

    :服務消費者。 在它啟動的時候,會向 Registry 進行訂閱操作。訂閱操作會從 ZooKeeper 中獲取 Provider 注冊的 URL,并在 ZooKeeper 中添加相應的監聽器。

    • 獲取到 Provider URL 之后,Consumer 會根據負載均衡算法從多個 Provider 中選擇一個 Provider 并與其建立連接,最后發起對 Provider 的 RPC 調用;
    • 如果 Provider URL 發生變更,Consumer 將會通過之前訂閱過程中在注冊中心添加的監聽器,獲取到最新的 Provider URL 信息,進行相應的調整,比如斷開與宕機 Provider 的連接,并與新的 Provider 建立連接;
    • Consumer 與 Provider 建立的是長連接,且 Consumer 會緩存 Provider 信息,所以一旦連接建立,即使注冊中心宕機,也不會影響已運行的 Provider 和 Consumer;
  • Monitor:監控中心。 用于統計服務的調用次數和調用時間。Provider 和 Consumer 在運行過程中,會在內存中統計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。監控中心在上面的架構圖中并不是必要角色,監控中心宕機不會影響 Provider、Consumer 以及 Registry 的功能,只會丟失監控數據而已。

為什么說Dubbo是基于URL驅動的?

  • URL 在 Dubbo 中被當作是“公共的契約”。一個 URL 可以包含非常多的擴展點參數,URL 作為上下文信息貫穿整個擴展點設計體系;
  • Dubbo 基于 URL驅動的好處:
    • 統一數據格式規范,讓交互變得簡單化;
    • 使用URL作為方法參數,便于參數擴展,新參數只需要以k/v形式追加到URL即可,不需要改變入參或返回值的數據結構;

Dubbo的URL由哪些部分組成?

  • 下面是Provider 注冊到 ZooKeeper 上的 URL 例子:

dubbo://172.17.32.91:20880/org.apache.dubbo.demo.DemoService ?anyhost=true&application=dubbo-demo-api-provider&dubbo=2.0.2 &interface=org.apache.dubbo.demo.DemoService&methods=sayHello,sayHelloAsync&pid=32508&release= &side=provider&timestamp=1593253404714dubbo://172.17.32.91:20880/org.apache.dubbo.demo.DemoService ?anyhost=true&application=dubbo-demo-api-provider&dubbo=2.0.2 &interface=org.apache.dubbo.demo.DemoService&methods=sayHello,sayHelloAsync &pid=32508&release=&side=provider&timestamp=1593253404714

  • protocol:dubbo 協議;
  • host/port:172.17.32.91:20880;
  • path:org.apache.dubbo.demo.DemoService;
  • parameters:參數鍵值對,這里是問號后面的參數。

相較于JDK SPI而言,Dubbo SPI做了哪些改進?

  • JDK SPI 會一次性實例化擴展點所有實現,如果有擴展實現初始化很耗時,但如果沒用上也加載,會很浪費資源,而Dubbo SPI可以按需進行加載,實例化后會進行緩存;
  • Dubbo按照SPI配置文件的用途,將其分為了三個目錄:
    • META-INF/services/:該目錄下的 SPI 配置文件用來兼容 JDK SPI ;
    • META-INF/dubbo/:該目錄用于存放用戶自定義 SPI 配置文件;
    • META-INF/dubbo/internal/:該目錄用于存放 Dubbo 內部使用的 SPI 配置文件。
  • Dubbo 將 SPI 配置文件改成了 KV 格式,key被稱為擴展名,我們可以指定擴展名來查找具體的實現,從而實現按需加載;
  • 擴展名更利于我們排查異常,Dubbo SPI在拋出異常時,會攜帶擴展名信息,而不是簡單提升具體實現類無法加載,提升我們排查問題的效率。

Dubbo的擴展點有哪些分類?

  • 普通擴展類:最基礎的,配置在SPI配置文件中的擴展類實現;
  • 包裝擴展類:Wrapper類是一種裝飾者模式,在構造方法中傳入一個具體擴展接口的實現,屬于Dubbo的自動包裝特性。在ExtensionLoader在加載擴展時,如果發現這個擴展類包含其它擴展點作為構造函數參數,則這個擴展類就會被認定為是Wrapper類;
  • 自適應擴展類:一個擴展接口會有多種實現類,具體使用哪個實現類可以不寫死在配置或代碼中,在運行時,通過傳入URL中的某些參數動態確定,這屬于擴展點的自適應特性。

Dubbo的@Adaptive注解與@Activate注解的區別是什么?

  • @Adaptive稱為自適應擴展點注解。自適應擴展指的是,一個擴展接口往往會有多種實現類,因為Dubbo是基于URL驅動,所以在運行時,通過傳入URL中的某些參數來動態控制具體實現;
    • @Adaptive可以修飾類級別與方法級別:
      • 修飾方法級別時,Dubbo初始化擴展點時會自動生成和編譯一個動態的Adaptive類,是一種動態代理的模式,方法里會有一些抽象的通用邏輯,根據解析URL得到的信息,找到并調用真正的實現類;
      • 修飾類級別時,省略了生成動態代理類的過程,由該類中決定具體實現,可理解為是一種靜態代理的模式。另外對于同一個擴展點,類級別的Adaptive只能有一個。
  • @Activate稱為自動激活擴展點注解。主要使用在有多個擴展點實現、需要同時根據不同條件被激活的場景中,如Filter需要多個同時激活,因為每個Filter實現的是不同的功能;
    • @Activate的參數:
參數名效果
String[] group()URL中的分組如果匹配則激活
String[] value()URL中如果包含該key值,則會激活
String[] before()填寫擴展點列表,表示哪些擴展點要在本擴展點之前激活
String[] after()表示哪些擴展點需要在本擴展點之后激活
int order()排序信息

服務通信

如何設計一個rpc框架?

  • 主要的模塊:
    • protocol:簡易版 RPC 框架的自定義協議;
    • serialization:提供了自定義協議對應的序列化、反序列化的相關工具類;
    • codec:提供了自定義協議對應的編碼器和解碼器;
    • transport:基于 Netty 提供了底層網絡通信的功能,其中會使用到 codec 包中定義編碼器和解碼器,以及 serialization 包中的序列化器和反序列化器;
    • registry:基于 ZooKeeper 和 Curator 實現了簡易版本的注冊中心功能;
    • proxy:使用 JDK 動態代理實現了一層代理。

一次rpc請求的流程是怎樣的?

  • Client 首先會調用本地的代理,也就是圖中的 Proxy;
  • Client 端 Proxy 會按照協議(Protocol),將調用中傳入的數據序列化成字節流;
  • 之后 Client 會通過網絡,將字節數據發送到 Server 端;
  • Server 端接收到字節數據之后,會按照協議進行反序列化,得到相應的請求信息;
  • Server 端 Proxy 會根據序列化后的請求信息,調用相應的業務邏輯;
  • Server 端業務邏輯的返回值,也會按照上述邏輯返回給 Client 端。

序列化的意義是什么?

  • 簡單來說,序列化是把對象的狀態信息轉化為可存儲或傳輸的形式過程,也就是把對象轉化為字節序列的過程稱為對象的序列化。反序列化是序列化的逆向過程,把字節數組反序列化為對象。

Dubbo服務發布的流程是怎樣的?

  • dubbo的service本質是一個被Spring管理的ServiceBean,ServiceBean實現了眾多Spring提供的接口;
    • afterPropertiesSet:解析配置;
    • onApplicationEvent:執行發布流程;
  • 服務發布流程:
  • 基于Spring進行配置解析,將配置屬性轉換成ServiceBean對象;
  • 各種判斷校驗邏輯,保證信息的安全;
  • 組裝URL(registry://、dubbo://、injvm://);
  • 構建invoker對象;
  • RegistryProtocol.export(向注冊中心注冊URL);
  • 各種wrapper的增強(gos、listener、filter鏈);
  • DubboProtocol.export(發布服務);
  • 啟動一個NettyServer。
  • Dubbo服務引用的流程是怎樣的?

    • Dubbo 的 consumer 會通過 ReferenceBean 實現服務引用;
    • Dubbo 服務引用的時機有兩個:
      • 第一個是在 Spring 容器調用 ReferenceBean 的 afterPropertiesSet 方法時引用服務;
      • 第二個是在 ReferenceBean 對應的服務被注入到其他類中時引用,而入口都是getObject方法。
    • 服務引用流程:
  • 生成遠程服務的代理;
  • 通過注冊中心獲得目標服務的url地址;
  • 實現遠程網絡通信;
  • 實現負載均衡;
  • 實現集群容錯。
  • Dubbo的Invoker是什么?

    • Invoker 是Dubbo 的核心模型,其它模型都向它靠攏,或轉換成它,它代表一個可執行體,可向它發起 invoke 調用,它有可能是一個本地的實現,也可能是一個遠程的實現,也可能一個集群實現;
    • 在服務提供方,Invoker 用于調用服務提供類。在服務消費方,Invoker 用于執行遠程調用。Invoker 是由 Protocol 實現類構建而來。

    在Dubbo中Proxy 和 Wrapper的作用是什么?

    • Consumer 端的 Proxy 底層屏蔽了復雜的網絡交互、集群策略以及 Dubbo 內部的 Invoker 等概念,提供給上層使用的是業務接口;
    • Provider 端的 Wrapper 是將個性化的業務接口實現,統一轉換成 Dubbo 內部的 Invoker 接口實現;
    • 正是由于 Proxy 和 Wrapper 這兩個組件的存在,Dubbo 才能實現內部接口和業務接口的無縫轉換。

    集群

    Dubbo的Directory(服務目錄)是什么?

    • Directory中存儲了一些和服務提供者有關的信息,通過Directory,服務消費者可獲取到服務提供者的信息,比如 ip、端口、服務協議等。通過這些信息,服務消費者就可通過 Netty 等客戶端進行遠程調用。
    • 一個服務集群中,provider的數量是會動態變更的,Directory從注冊中心獲取provider的配置信息后,會為每條配置生成對應的Invoker對象,因此Directory 可以看成是一組Invoker 的集合,它會隨著注冊中心的變化而動態調整。

    Dubbo Cluster的作用是什么?

    • 在Dubbo體系中,集群模塊是服務提供者和服務消費者的中間層,為服務消費者屏蔽了服務提供者的情況,這樣服務消費者就可以專心處理遠程調用相關事宜。比如發請求,接受服務提供者返回的數據等;
    • 集群 Cluster 用途是將多個服務提供者合并為一個 Cluster Invoker,并將這個 Invoker 暴露給服務消費者。這樣一來,服務消費者只需通過這個 Invoker 進行遠程調用即可,至于具體調用哪個服務提供者,以及調用失敗后如何處理等問題,現在都交給集群模塊去處理。

    Dubbo Cluster的工作流程是怎樣的?

    • 第一個階段:服務消費者初始化期間,集群 Cluster 實現類為服務消費者創建 Cluster Invoker 實例;
    • 第二個階段:
      • 服務消費者進行遠程調用時,Cluster Invoker 首先會調用 Directory 的 list 方法列舉 Invoker 列表;
      • 然后調用 Router 的 route 方法進行路由,過濾掉不符合路由規則的 Invoker(例如黑名單過濾);
      • 當Cluster Invoker 拿到 Directory 返回的 Invoker 列表后,它會通過 LoadBalance 從 Invoker 列表中選擇一個 Invoker,通過這個Invoker實例進行遠程調用。

    Dubbo有哪些集群容錯策略?

    名稱簡介
    Failover失敗自動切換:當出現請求失敗時,會重試其它服務器??梢酝ㄟ^retries設置重試次數,默認為2次。該方式是dubbo默認的容錯機制,適用于讀操作或冪等的寫操作。
    Failfast快速失敗:當請求失敗后,快速返回異常結果,不做任何重試。適用于非冪等接口。
    Failsafe失敗安全:當請求出現異常時,直接忽略異常。適用于佛系調用場景,即不關心調用是否成功,也不想影響外層的調用,例如不重要的日志同步等。
    Failback失敗自動恢復:請求失敗后,會自動記錄在失敗隊列中,并由一個定時線程池定時重試。適用于一些異步請求或最終一致性的請求。
    Forking并行調用:同時調用多個相同的服務,只要有一個返回,則立即返回結果,可通過forks設置并行數。適用于某些對實時性要求極高的調用上,但也會浪費更多的資源。
    Broadcast廣播調用:廣播調用所有可用的服務,任意一個節點報錯則報錯。適用于服務測試。
    Available最簡單的調用:請求不會做負載均衡,遍歷所有服務列表,找到第一個可用的節點,直接請求并返回,如果沒有可用節點則拋出異常。

    Dubbo有哪些負載均衡策略?

    算法名稱說明
    Random LoadBalance隨機可以按權重設置隨機概率,調用量越大分布月均勻
    RoundRobin LoadBalance輪詢可以根據權重設置輪詢比例。
    LeastActive LoadBalance最少活躍調用數根據活躍度進行分配調用,使慢的提供者收到更少的請求,如果活躍數相同則隨機調用,活躍數是指調用前后的計數差。
    ConsistentHash LoadBalance一致性Hash相同參數的請求總是發到同一提供者,當某臺提供者掛掉時,基于虛擬節點,相應的請求會平攤到其它提供者,不會引起劇烈變動。

    限流、熔斷、降級

    Dubbo是如何實現限流的?

    • 通過Dubbo Service注解的executes屬性配置最大并行數;
    • 限流的具體邏輯由ExecuteLimitFilter實現,本質是基于信號量控制并發數;

    Dubbo中如何實現熔斷?

    • Dubbo沒有提供自動熔斷策略;

    Dubbo是否支持降級?

    • 可以通過Reference注解中的mock屬性返回默認值。

    性能調優

    如何根據參數對Dubbo進行調優?

    • Schema 配置參考手冊 | Apache Dubbo

    總結

    以上是生活随笔為你收集整理的Dubbo常见面试题与答案的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。