天天看點

[微服務]-Dubbo 基礎面試題-快來學習!

1、Dubbo是什麼?

Dubbo是阿裡巴巴開源的基于 Java 的高性能 RPC 分布式服務架構,現已成為 Apache 基金會孵化項目。

dubbo是一個分布式架構,遠端服務調用的分布式架構,其核心部分包含:

叢集容錯:提供基于接口方法的透明遠端過程調用,包括多協定支援,以及軟負載均衡,失敗容錯,位址路由,動态配置等叢集支援。

遠端通訊:提供對多種長連接配接的NIO架構抽象封裝,包括多種線程模型,序列化,以及“請求-響應”模式的資訊交換方式。

自動發現:基于注冊中心目錄服務,使消費提供方能動态的查找服務提供方,使位址透明,使服務提供方可以平滑增加或減少機器。

2、為什麼要用Dubbo?

因為是阿裡開源項目,國内很多網際網路公司都在用,已經經過很多線上考驗。内部使用了 Netty、Zookeeper,保證了高性能高可用性。

使用 Dubbo 可以将核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,可用于提高業務複用靈活擴充,使前端應用能更快速的響應多變的市場需求。

透明化的遠端方法調用,就像調用本地方法一樣調用遠端方法,隻需要簡單配置,沒有任何API入侵。軟負載均衡及容錯機制,可以在内網替代F5等硬體負載均衡器。降低成本,減少單點。服務自動注冊與發現,不在需要寫死服務提供方位址,注冊中心基于接口名查詢服務提供者的IP位址,并且能夠平滑添加或删除服務提供者。

3、Dubbo 和 Spring Cloud 有什麼差別?

兩個沒關聯,如果硬要說差別,有以下幾點。

1)通信方式不同

Dubbo 使用的是 RPC 通信,而 Spring Cloud 使用的是 HTTP RESTFul 方式。

2)組成部分不同

4、dubbo都支援什麼協定,推薦用哪種?

  • dubbo://(推薦)
  • rmi://
  • hessian://
  • http://
  • webservice://
  • thrift://
  • memcached://
  • redis://
  • rest://

5、Dubbo需要 Web 容器嗎?

不需要,如果硬要用 Web 容器,隻會增加複雜性,也浪費資源。

6、Dubbo内置了哪幾種服務容器?

  • Spring Container
  • Jetty Container
  • Log4j Container

Dubbo 的服務容器隻是一個簡單的 Main 方法,并加載一個簡單的 Spring 容器,用于暴露服務。

7、Dubbo預設使用什麼注冊中心,還有别的選擇嗎?

推薦使用 Zookeeper 作為注冊中心,還有 Redis、Multicast、Simple 注冊中心,但不推薦。

8、Dubbo有哪幾種配置方式?

  • Spring 配置方式
  • Java API 配置方式

9、Dubbo啟動時如果依賴的服務不可用會怎樣?

Dubbo 預設會在啟動時檢查依賴的服務是否可用,不可用時會抛出異常,阻止 Spring 初始化完成,預設 check="true",可以通過 check="false" 關閉檢查。

10、Dubbo支援服務多協定嗎?

Dubbo 允許配置多協定,在不同服務上支援不同協定或者同一服務上同時支援多種協定。

11、當一個服務接口有多種實作時怎麼做?

當一個接口有多種實作時,可以用 group 屬性來分組,服務提供方和消費方都指定同一個 group 即可。

12、Dubbo支援分布式事務嗎?

目前暫時不支援,後續可能采用基于 JTA/XA 規範實作,如以圖所示。

13、Dubbo 能內建 Spring Boot 嗎?

可以的,項目位址如下。

https://github.com/apache/incubator-dubbo-spring-boot-project

14.Dubbo的好處?

  • 透明化的遠端方法調用,就像調用本地方法一樣調用遠端方法,隻需簡單配置,沒有任何API侵入。
  • 軟負載均衡及容錯機制,可在内網替代F5等硬體負載均衡器,降低成本,減少單點。
  • 服務自動注冊與發現,不再需要寫死服務提供方位址,注冊中心基于接口名查詢服務提供者的IP位址,并且能夠平滑添加或删除服務提供者。(下面講解)
  • Dubbo采用全Spring配置方式,透明化接入應用,對應用沒有任何API侵入,隻需用Spring加載Dubbo的配置即可,Dubbo基于Spring的Schema擴充進行加載。

15.dubbo架構圖如下所示:

講解他的架構圖之前,我們先普及下幾個概念。

節點角色說明:

  • Provider(生産者): 暴露服務的服務提供方。
  • Consumer(消費者): 調用遠端服務的服務消費方。

如圖,我們可以簡單了解為web1234需要調用service1234的服務,是以web1234是消費者,service1234是生産者。

[微服務]-Dubbo 基礎面試題-快來學習!

你看着暈不暈?暈不暈?暈不暈?反正我是暈了,萬一分布式得更多呢?,是以我們需要他:

Registry(注冊中心): 服務注冊與發現的注冊中心。dubbo推薦的是zookeeper。什麼是zookeeper?zookeeper是用于分布式中一緻性處理的架構。簡單的講,zookeeper就是個中介,賣樓的(生産者)把樓盤資訊放在中介(注冊中心)那裡,想買樓的(消費者)去中介那裡獲得樓盤資源清單。于是,我們的圖變成了這樣:

[微服務]-Dubbo 基礎面試題-快來學習!

是不是好很多了?還不夠, 我們還需要個監控中心(幹嘛用的?當然是監控用的,調用失敗怎麼辦?挂了怎麼辦?):Monitor: 統計服務的調用次調和調用時間的監控中心。(不畫圖了)

然後,Provider放在容器裡運作,就叫做Container服務運作容器。(不畫圖了)

最終dubbo架構,如圖(從0開始看起):

[微服務]-Dubbo 基礎面試題-快來學習!

自己腦海裡按照上圖走了一遍後,看看自己想的是不是和下面說明一樣。

  • 服務容器負責啟動,加載,運作服務提供者。
  • 服務提供者(生産者)在啟動時,向注冊中心注冊自己提供的服務。
  • 服務消費者在啟動時,向注冊中心訂閱自己所需的服務。
  • 注冊中心傳回服務提供者位址清單給消費者,如果有變更,注冊中心将基于長連接配接推送變更資料給消費者。
  • 服務消費者,從提供者位址清單中,基于軟負載均衡算法,選一台提供者進行調用,如果調用失敗,再選另一台調用。
  • 服務消費者和提供者,在記憶體中累計調用次數和調用時間,定時每分鐘發送一次統計資料到監控