1. 程式人生 > >Dubbo 學習、面試、總結

Dubbo 學習、面試、總結

摘要:一直都在使用Dubbo,前面也寫了一些Dubbo相關的文章,今天總結一下,僅供參考,如有哪裡不對,請各位友友指正批評!

一:Dubbo介紹和總結系列一:

1、什麼是Dubbo?

Dubbo是阿里巴巴開發用來治理服務的中介軟體,資源排程和治理中心的管理工具。

2、ZooKeeper節點型別?

ZooKeeper節點是有生命週期的,這取決於節點的型別,在ZooKeeper中,節點型別可以分為:

- 永續性節點(PERSISTENT)

是指在節點建立後,就一直存在,直到有刪除操作來主動清除這些節點

- 臨時節點(EPHEMERAL)

臨時節點的生命週期和客戶端繫結。如果客戶端會話失效,那麼這個節點就會自動被清除掉。在臨時節點下面不能建立子節點。

- 持久順序節點(PERSISTENT_SEQUENTIAL)

在永續性節點的基礎上,在ZooKeeper中,每個父節點會為它的第一級子節點維護一份時序,會記錄每個子節點建立的先後順序

- 臨時順序節點(EPHEMERAL_SEQUENTIAL)

可以用來實現分散式鎖,具體可以Google相關分散式鎖的文章

3、Dubbo節點角色說明

- Provider: 暴露服務的提供方(servicee服務層)

- Consumer: 呼叫遠端服務的服務消費方(web表現層)

- Registry: 服務註冊與發現的註冊中心(ZooKeeper)

- Monitor: 統計服務的呼叫次數和呼叫時間的監控中心

- Container: 服務執行的容器(tomcat容器,spring容器)

4、Dubbo的註冊原理(ZooKeeper流程)

- 服務提供者啟動時向/dubbo/com.foo.BarService/providers 目錄下寫入自己的 URL 地址。

- 服務消費者啟動時訂閱/dubbo/com.foo.BarService/providers 目錄下的提供者 URL 地址。

- 並向/dubbo/com.foo.BarService/consumers 目錄下寫入自己的 URL 地址。

- 監控中心啟動時訂閱/dubbo/com.foo.BarService 目錄下的所有提供者和消費者 URL 地址。

5、註冊中心包括

- Multicast 註冊中心不需要啟動任何中心節點,只要廣播地址一樣,就可以互相發現。

- Zookeeper 是 Apacahe Hadoop 的子專案,是一個樹型的目錄服務,支援變更推送,適合作為 Dubbo 服務的註冊中心,工業強度較高,可用於生產環境,並推薦使用

- 基於 Redis 實現的註冊中心

- Simple 註冊中心本身就是一個普通的 Dubbo 服務,可以減少第三方依賴,使整體通訊方式一致。

6、dubbo,zookeeper流程,從生產者到消費者

- 生產者和消費者都要進行dubbo的配置 ,都需要註冊zookeeper主機地址,

- 生產者要配置dubbo使用的協議(預設dubbo)和埠號用來暴露服務,

- 生產者定義介面和實現類,並在配置檔案中進行註冊服務,

- 生產者啟動時會自動把註冊的介面的資訊轉化為一個url,

- 並通過hessian二進位制序列化儲存到zookeeper的節點中

- 消費者在配置檔案中引入要使用的服務介面,

- 消費者啟動時會從zookeeper中獲取與引用的介面匹配的url

- 並把自己的資訊留在zookeeper中

- 服務者和消費者在zookeeper中的資訊都會被監控中心monitor獲取到

- 可以通過monitor服務對zookeeper中的內容進行管理

7、服務的配置

- 服務者 -

<!--【服務者】 給服務起一個名稱,唯一標識,用來監控伺服器呼叫關係,呼叫次數 -->

<dubbo:application name="provider" />

<!-- 使用dubbo官方推薦註冊中心模式註冊物件 -->

<dubbo:registry address="zookeeper://192.168.1.180:2181" />

<!-- 用dubbo協議在20880埠暴露服務 -->

<dubbo:protocol name="dubbo" port="20880" />

<!-- 釋出服務:itemService 註冊物件,通過介面來註冊物件 -->

<!-- 和本地bean一樣實現服務 -->

<bean id="xxx.xxx.xxx.XxxImpl" class="xxx.xxx.xxx.XxxImpl" />

<dubbo:service interface="xxx.xxx.xxx.Ixxx" ref="xxxImpl" />

- 消費者 -

<!-- 【消費者】給服務起一個名稱,唯一標識,用來監控伺服器呼叫關係,呼叫次數 -->

<!-- 消費方應用名,用於計算依賴關係,不是匹配條件,不要與提供方一樣 -->

<dubbo:application name="consumer" />

<!-- 使用multicast廣播註冊中心暴露發現服務地址 -->

<dubbo:registry address="zookeeper://192.168.17.129:2181" />

<!-- 生成遠端服務代理,可以和本地bean一樣使用itemService -->

<dubbo:reference id="xxx" interface="xxx.xxx.xxx.Ixxx" timeout="1000000" retries="2"/>

二:Dubbo介紹和總結系列二:

1、預設使用的是什麼通訊框架,還有別的選擇嗎?

預設也推薦使用netty框架,還有mina。

2、服務呼叫是阻塞的嗎?

預設是阻塞的,可以非同步呼叫,沒有返回值的可以這麼做。

3、一般使用什麼註冊中心?還有別的選擇嗎?

推薦使用zookeeper註冊中心,還有redis等不推薦。

4、預設使用什麼序列化框架,你知道的還有哪些?

預設使用Hessian序列化,還有Duddo、FastJson、Java自帶序列化。

5、服務提供者能實現失效踢出是什麼原理?

服務失效踢出基於zookeeper的臨時節點原理。

6、服務上線怎麼不影響舊版本?

採用多版本開發,不影響舊版本。

7、如何解決服務呼叫鏈過長的問題?

可以結合zipkin實現分散式服務追蹤。

8、說說核心的配置有哪些?

核心配置有

 dubbo:service/

dubbo:reference/

dubbo:protocol/

dubbo:registry/

dubbo:application/

dubbo:provider/

dubbo:consumer/

dubbo:method/
9、dubbo推薦用什麼協議?

預設使用dubbo協議。

10、同一個服務多個註冊的情況下可以直連某一個服務嗎?

可以直連,修改配置即可,也可以通過telnet直接某個服務。

11、Dubbo叢集容錯怎麼做?

讀操作建議使用Failover失敗自動切換,預設重試兩次其他伺服器。寫操作建議使用Failfast快速失敗,發一次呼叫失敗就立即報錯。

12、dubbo和dubbox之間的區別?

dubbox是噹噹網基於dubbo上做了一些擴充套件,如加了服務可restful呼叫,更新了開源元件等。

13、你還了解別的分散式框架嗎?

別的還有spring的spring cloud,facebook的thrift,twitter的finagle,sina的motan等。

14、dubbo中zookeeper做註冊中心,如果註冊中心叢集都掛掉,那釋出者和訂閱者還能通訊嗎?

可以的,zookeeper的資訊會快取到本地作為一個快取檔案,並且轉換成properties物件方便使用。

 <!-- 使用zookeeper註冊中心暴露服務地址 subscribe 預設:true 是否向此註冊中心訂閱服務,如果設為false,將只註冊,不訂閱 check 預設:true 註冊中心不存在時,是否報錯 -->

<dubbo:registry protocol="zookeeper" address="${dubbo.registry.address}" file="${dubbo.registry.file}" check="false"/>

dubbo.registry.address=172.16.1.130:2181,172.16.1.133:2181,172.16.1.120:2181 dubbo.registry.file=/root/.dubbo/pay/dubbo.cache 

15、專案中有使用過多執行緒嗎?有的話講講你在哪裡用到了多執行緒?

<!-- 生產者配置 生產者 遠端預設呼叫3次 引數 retries="2" async="true" 非同步返回結果 預設是同步 timeout="10000" 毫秒 用dubbo協議在20882埠暴露服務 固定執行緒池 10 啟動時建立執行緒,不關閉,一直持有 負載均衡策略 輪詢 -->

<dubbo:provider timeout="10000" threads="10" threadpool="fixed" loadbalance="roundrobin"/>

16、Zookeeper的Java客戶端你使用過哪些?

 三:Dubbo介紹和總結系列三:

1、瞭解Dubbo麼?

Dubbo是阿里巴巴開源的基於 Java 的高效能 RPC 分散式服務框架,現已成為 Apache 基金會孵化專案。 官網:http://dubbo.apache.org

2、為什麼要用Dubbo?

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

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

下面這張圖可以很清楚的詮釋,最重要的一點是,分散式架構可以承受更大規模的併發流量。

下面是 Dubbo 的服務治理圖。

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裡面有哪幾種節點角色?

8、畫一畫服務註冊與發現的流程圖

該圖來自 Dubbo 官網,供你參考,如果你說你熟悉 Dubbo, 面試官經常會讓你畫這個圖,記好了。

9、Dubbo預設使用什麼註冊中心,還有別的選擇嗎?

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

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

1)Spring 配置方式

2)Java API 配置方式


11、Dubbo 核心的配置有哪些?

我曾經面試就遇到過面試官讓你寫這些配置,我也是蒙逼。。

配置之間的關係見下圖。

12、在 Provider 上可以配置的 Consumer 端的屬性有哪些?

1)timeout:方法呼叫超時
2)retries:失敗重試次數,預設重試 2 次
3)loadbalance:負載均衡演算法,預設隨機
4)actives 消費者端,最大併發呼叫限制

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

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

14、Dubbo推薦使用什麼序列化框架,你知道的還有哪些?

推薦使用Hessian序列化,還有Duddo、FastJson、Java自帶序列化。

15、Dubbo預設使用的是什麼通訊框架,還有別的選擇嗎?

Dubbo 預設使用 Netty 框架,也是推薦的選擇,另外內容還整合有Mina、Grizzly。

16、Dubbo有哪幾種叢集容錯方案,預設是哪種?

17、Dubbo有哪幾種負載均衡策略,預設是哪種?

18、註冊了多個同一樣的服務,如果測試指定的某一個服務呢?

可以配置環境點對點直連,繞過註冊中心,將以服務介面為單位,忽略註冊中心的提供者列表。

19、Dubbo支援服務多協議嗎?

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

20、當一個服務介面有多種實現時怎麼做?

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

21、服務上線怎麼相容舊版本?

可以用版本號(version)過渡,多個不同版本的服務註冊到註冊中心,版本號不同的服務相互間不引用。這個和服務分組的概念有一點類似。

22、Dubbo可以對結果進行快取嗎?

可以,Dubbo 提供了宣告式快取,用於加速熱門資料的訪問速度,以減少使用者加快取的工作量。

23、Dubbo服務之間的呼叫是阻塞的嗎?

預設是同步等待結果阻塞的,支援非同步呼叫。
Dubbo 是基於 NIO 的非阻塞實現並行呼叫,客戶端不需要啟動多執行緒即可完成並行呼叫多個遠端服務,相對多執行緒開銷較小,非同步呼叫會返回一個 Future 物件。
非同步呼叫流程圖如下。

24、Dubbo支援分散式事務嗎?

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

25、Dubbo telnet 命令能做什麼?

dubbo 通過 telnet 命令來進行服務治理,具體使用看這篇文章《dubbo服務除錯管理實用命令》。
telnet localhost 8090

26、Dubbo支援服務降級嗎?

Dubbo 2.2.0 以上版本支援。

27、Dubbo如何優雅停機?

Dubbo 是通過 JDK 的 ShutdownHook 來完成優雅停機的,所以如果使用 kill -9 PID 等強制關閉指令,是不會執行優雅停機的,只有通過 kill PID 時,才會執行。

28、服務提供者能實現失效踢出是什麼原理?

服務失效踢出基於 Zookeeper 的臨時節點原理。

29、如何解決服務呼叫鏈過長的問題?

Dubbo 可以使用 Pinpoint 和 Apache Skywalking(Incubator) 實現分散式服務追蹤,當然還有其他很多方案。

30、服務讀寫推薦的容錯策略是怎樣的?

讀操作建議使用 Failover 失敗自動切換,預設重試兩次其他伺服器。

寫操作建議使用 Failfast 快速失敗,發一次呼叫失敗就立即報錯。

31、Dubbo必須依賴的包有哪些?

Dubbo 必須依賴 JDK,其他為可選。

32、Dubbo的管理控制檯能做什麼?

管理控制檯主要包含:路由規則,動態配置,服務降級,訪問控制,權重調整,負載均衡,等管理功能。

33、說說 Dubbo 服務暴露的過程。

Dubbo 會在 Spring 例項化完 bean 之後,在重新整理容器最後一步釋出 ContextRefreshEvent 事件的時候,通知實現了 ApplicationListener 的 ServiceBean 類進行回撥 onApplicationEvent 事件方法,Dubbo 會在這個方法中呼叫 ServiceBean 父類 ServiceConfig 的 export 方法,而該方法真正實現了服務的(非同步或者非非同步)釋出。

34、Dubbo 停止維護了嗎?

2014 年開始停止維護過幾年,17 年開始重新維護,並進入了 Apache 專案。

35、Dubbo 和 Dubbox 有什麼區別?

Dubbox 是繼 Dubbo 停止維護後,噹噹網基於 Dubbo 做的一個擴充套件專案,如加了服務可 Restful 呼叫,更新了開源元件等。

36、你還了解別的分散式框架嗎?

別的還有 Spring cloud、Facebook 的 Thrift、Twitter 的 Finagle、Sina的Motan 等。

37、Dubbo 能整合 Spring Boot 嗎?

可以的,專案地址如下。
https://github.com/apache/incubator-dubbo-spring-boot-project

38、在使用過程中都遇到了些什麼問題?

Dubbo 的設計目的是為了滿足高併發小資料量的 rpc 呼叫,在大資料量下的效能表現並不好,建議使用 rmi 或 http 協議。

39、你讀過 Dubbo 的原始碼嗎?

要了解 Dubbo 就必須看其原始碼,瞭解其原理,花點時間看下吧,網上也有很多教程。

40、你覺得用 Dubbo 好還是 Spring Cloud 好?

擴充套件性的問題,沒有好壞,只有適合不適合,不過我好像更傾向於使用 Dubbo, Spring Cloud 版本升級太快,元件更新替換太頻繁,配置太繁瑣,還有很多我覺得是沒有 Dubbo 順手的地方……