持續輸出面試題系列之Dubbo篇

開篇介紹

你們好,我是Java最全面試題庫的提褲姐,今天這篇是JavaEE面試題系列的第九篇,主要總結了Dubbo相關的問題;在後續,會沿着第一篇開篇的知識線路一直總結下去,作到日更!若是我能作到百日百更,但願你也能夠跟着百日百刷,一百天養成一個好習慣。java

Dubbo是什麼?

Dubbo 是一個分佈式、高性能、透明化的 RPC 服務框架,提供服務自動註冊自動發現等高效服務治理方案。mysql

Dubbo 的總體架構設計有哪些分層?

  • 接口服務層(Service):該層與業務邏輯相關,根據 provider 和 consumer 的業務設計對應的接口和實現
  • 配置層(Config):對外配置接口,以 ServiceConfig 和 ReferenceConfig 爲中心
  • 服務代理層(Proxy):服務接口透明代理,生成服務的客戶端 Stub 和 服務端的 Skeleton,以 ServiceProxy 爲中心,擴展接口爲 ProxyFactory
  • 服務註冊層(Registry):封裝服務地址的註冊和發現,以服務 URL 爲中心,擴展接口爲 RegistryFactory、Registry、RegistryService
  • 路由層(Cluster):封裝多個提供者的路由和負載均衡,並橋接註冊中心,以Invoker 爲中心,擴展接口爲 Cluster、Directory、Router和LoadBlancce
  • 監控層(Monitor):RPC調用次數和調用時間監控,以 Statistics 爲中心,擴展接口爲 MonitorFactory、Monitor和MonitorService
  • 遠程調用層(Protocal):封裝 RPC 調用,以 Invocation 和 Result 爲中心,擴展接口爲 Protocal、Invoker和Exporter
  • 信息交換層(Exchange):封裝請求響應模式,同步轉異步。以 Request 和 Response 爲中心,擴展接口爲 Exchanger、ExchangeChannel、ExchangeClient和ExchangeServer
  • 網絡傳輸層(Transport):抽象 mina 和 netty 爲統一接口,以 Message 爲中心,擴展接口爲Channel、Transporter、Client、Server和Codec
  • 數據序列化層(Serialize):可複用的一些工具,擴展接口爲Serialization、 ObjectInput、ObjectOutput和ThreadPool

Dubbo有哪些協議?

  • dubbo://
  • rmi://
  • hessian://
  • http://
  • webservice://
  • thrift://
  • memcached://
  • redis://
  • rest://

Dubbo配置有哪些?

  • dubbo:service 服務提供者暴露服務配置
  • dubbo:reference 服務消費者引用服務配置
  • dubbo:protocol 服務提供者協議配置
  • dubbo:registry 註冊中心配置
  • dubbo:monitor 監控中心配置
  • dubbo:application 應用信息配置
  • dubbo:module 模塊信息配置
  • dubbo:provider 服務提供者缺省值配置
  • dubbo:consumer 服務消費者缺省值配置
  • dubbo:method 方法級配置
  • dubbo:argument 方法參數配置
  • dubbo:parameter 選項參數配置
  • dubbo:config-center 配置中心

Dubbo 的鏈接方式有哪些?

Dubbo 的客戶端和服務端有三種鏈接方式,分別是:web

  • 廣播
  • 直連
  • 使用 zookeeper 註冊中心

說說Dubbo暴露過程?

一、ServiceConfig 類拿到對外提供服務的實際類 ref(如:HelloWorldImpl)
二、經過 ProxyFactory 類的 getInvoker 方法使用 ref 生成一個 AbstractProxyInvoker 實例,到這一步就完成具體服務到 Invoker 的轉化
三、接下來就是 Invoker 轉換到 Exporter 的過程:面試

  • ProxyFactory 是動態代理,用來建立 Invoker 對象,實現代理使用 JavassistProxyFactory和 JdkProxyFactory。
  • Invoker 是一個服務對象實例,Dubbo 框架的實體域。它能夠是一個本地的實現,一個遠程的實現或一個集羣的實現,能夠向它發起 Invoker 調用。
  • Protocol 是服務域,負責 Invoker 的生命週期管理,是 Invoker 暴露和引用的主要功能入口,對應該類的 export和 refer方法。
  • Exporter 是根據不一樣協議暴露 Invoker 進行封裝的類,它會根據不一樣的協議頭進行識別(好比:registry://和 dubbo://),調用對應 XXXProtocol的 export()方法。

Dubbo有哪些均衡負載的方法?

一、隨機模式。按權重設置隨機機率。在一個截面上碰撞的機率較高,但調用越大分佈越均勻
二、輪詢模式。按公約後的權重設置輪詢比例。但存在響應慢的服務提供者會累積請求
三、最少活躍調用數。響應快的提供者接受越多請求,響應慢的接受越少請求
四、一致hash。根據服務提供者ip設置hash環,攜帶相同的參數老是發送的同一個服務提供者,若服務掛了,則會基於虛擬節點平攤到其餘提供者上redis

Dubbo有哪些集羣容錯方案?

一、Failover Cluster:失敗重試 當服務消費方調用服務提供者失敗後自動切換到其餘服務提供者服務器進行重試
二、Failfast Cluster:快速失敗 當服務消費方調用服務提供者失敗後,當即報錯,也就是隻調用一次。一般這種模式用於非冪等性的寫操做。
三、Failsafe Cluster:失敗安全 當服務消費者調用服務出現異常時,直接忽略異常。這種模式一般用於寫入審計日誌等操做。
四、Failback Cluster:失敗自動恢復 當服務消費端用服務出現異常後,在後臺記錄失敗的請求,並按照必定的策略後期再進行重試。這種模式一般用於消息通知操做。
五、Forking Cluster:並行調用 當消費方調用一個接口方法後,Dubbo Client會並行調用多個服務提供者的服務,只要一個成功即返回。這種模式一般用於實時性要求較高的讀操做,但須要浪費更多服務資源
六、Broadcast Cluster:廣播調用 當消費者調用一個接口方法後,Dubbo Client會逐個調用全部服務提供者,任意一臺調用異常則此次調用就標誌失敗。這種模式一般用於通知全部提供者更新緩存或日誌等本地資源信息。sql

jdk SPI和dubbo SPI的區別?

jdk SPI SPI :
全稱爲 (Service Provider Interface) ,是JDK內置的一種服務提供發現機制。SPI是一種動態替換髮現的機制, 好比有個接口,想運行時動態的給它添加實現,你只須要添加一個實現。咱們常常遇到的就是java.sql.Driver接口,其餘不一樣廠商能夠針對同一接口作出不一樣的實現,mysql和postgresql都有不一樣的實現提供給用戶,而Java的SPI機制能夠爲某個接口尋找服務實現。
在jdk6裏面引進的一個新的特性ServiceLoader,從官方的文檔來講,它主要是用來裝載一系列的service provider。並且ServiceLoader能夠經過service provider的配置文件來裝載指定的service provider。當服務的提供者,提供了服務接口的一種實現以後,咱們只須要在jar包的META-INF/services/目錄裏同時建立一個以服務接口命名的文件。該文件裏就是實現該服務接口的具體實現類。而當外部程序裝配這個模塊的時候,就能經過該jar包META-INF/services/裏的配置文件找到具體的實現類名,並裝載實例化,完成模塊的注入緩存

dubbo SPI:
Dubbo對JDK SPI進行了擴展,對服務提供者配置文件中的內容進行了改造,由原來的提供者類的全限定名列表改爲了KV形式的列表,這也致使了Dubbo中沒法直接使用JDK ServiceLoader,因此,與之對應的,在Dubbo中有ExtensionLoader,ExtensionLoader是擴展點載入器,用於載入Dubbo中的各類可配置組件安全

  • Duboo SPI能夠根據接口類名和key值獲取具體一個實現
  • 能夠對擴展類實例的屬性進行依賴注入,即IOC
  • 能夠採用裝飾器模式實現AOP功能

Dubbo服務註冊與發現的流程?

  • Provider(提供者)綁定指定端口並啓動服務
  • 指供者鏈接註冊中心,併發本機IP、端口、應用信息和提供服務信息發送至註冊中心存儲
  • Consumer(消費者),鏈接註冊中心 ,併發送應用信息、所求服務信息至註冊中心
  • 註冊中心根據消費者所求服務信息匹配對應的提供者列表發送至Consumer 應用緩存。
  • Consumer 在發起遠程調用時基於緩存的消費者列表擇其一發起調用。
  • Provider 狀態變動會實時通知註冊中心、在由註冊中心實時推送至Consumer

Dubbo中 zookeeper作註冊中心,若是註冊中心集羣都掛掉,發佈者和訂閱者之間還能通訊麼?

能夠通訊;
啓動 dubbo時,消費者會從zk拉取註冊的生產者的地址接口等數據,緩存在本地。每次調用時,按照本地存儲的地址進行調用;
註冊中心對等集羣,任意一臺宕機後,將會切換到另外一臺註冊中心;所有宕機後,服務的提供者和消費者仍能經過本地緩存通信。服務提供者無狀態,任一臺宕機後,不影響使用;服務提供者所有宕機,服務消費者會沒法使用,並沒有限次重連等待服務者恢復;掛掉是沒關係的,但前提是你沒有增長新的服務,若是你要調用新的服務,則是不能辦到的。服務器

相關文章
相關標籤/搜索