天天看點

面試必背:dubbo精選面試題含答案

作者:德魯小哥講程式設計
私信我 發送:面試題,擷取面試題合集

1、說一下dubbo的調用過程

調用過程圖:

面試必背:dubbo精選面試題含答案

1.Proxy持有一個Invoker對象,使用Invoker調用2.之後通過Cluster進行負載容錯,失敗重試3.調用Directory擷取遠端服務的Invoker清單4.負載均衡使用者配置了路由規則,則根據路由規則過濾擷取到的Invoker清單使用者沒有配置路由規則或配置路由後還有很多節點,則使用LoadBalance方法做負載均衡,選用一個可以調用的Invoker5.經過一個一個過濾器鍊,通常是處理上下文、限流、計數等。6.會使用Client做資料傳輸7.私有化協定的構造(Codec)8.進行序列化9.服務端收到這個Request請求,将其配置設定到ThreadPool中進行處理10.Server來處理這些Request11.根據請求查找對應的Exporter12.之後經過一個服務提供者端的過濾器鍊13.然後找到接口實作并真正的調用,将請求結果傳回**

2、dubbo的工作原理

面試必背:dubbo精選面試題含答案

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

3,Dubbo支援哪些協定?

dubbo:單一長連接配接和 NIO 異步通訊,适合大并發小資料量的服務調用,以及消費者遠大于提供者。傳輸協定 TCP,異步,Hessian 序列化;

rmi:采用 JDK 标準的 rmi 協定實作,傳輸參數和傳回參數對象需要實作 Serializable 接口,使用 java 标準序列化機制,使用阻塞式短連接配接,傳輸資料包大小混合,消費者和提供者個數差不多,可傳檔案,傳輸協定 TCP。 多個短連接配接,TCP 協定傳輸,同步傳輸,适用正常的遠端服務調用和 rmi 互操作。在依賴低版本的 Common-Collections 包,java 序列化存在安全漏洞;

webservice:基于 WebService 的遠端調用協定,內建 CXF 實作,提供和原生 WebService 的互操作。多個短連接配接,基于 HTTP 傳輸,同步傳輸,适用系統內建和跨語言調用;http: 基于 Http 表單送出的遠端調用協定,使用 Spring 的 HttpInvoke 實作。多個短連接配接,傳輸協定 HTTP,傳入參數大小混合,提供者個數多于消費者,需要給應用程式和浏覽器 JS 調用; hessian: 內建 Hessian 服務,基于 HTTP 通訊,采用 Servlet 暴露服務,Dubbo 内嵌 Jetty 作為伺服器時預設實作,提供與 Hession 服務互操作。多個短連接配接,同步 HTTP 傳輸,Hessian 序列化,傳入參數較大,提供者大于消費者,提供者壓力較大,可傳檔案;

memcache: 基于 Memcached 實作的 RPC 協定 Redis: 基于 Redis 實作的 RPC 協定

4,注冊中心挂了,consumer還能不能調用provider?

可以的,啟動 dubbo 時,消費者會從 zookeeper 拉取注冊的生産者的位址接口等資料,緩存在本地。

每次調用時,按照本地存儲的位址進行調用。provider才調用不通

5,怎麼實作動态感覺服務下線的呢?

服務訂閱通常有 pull 和 push 兩種方式:

pull 模式需要用戶端定時向注冊中心拉取配置;

push 模式采用注冊中心主動推送資料給用戶端;

DubboZookeeper注冊中心采用是事件通知與用戶端拉取方式。服務第一次訂閱的時候将會拉取對應目錄下全量資料,然後在訂閱的節點注冊一個 watcher。一旦目錄節點下發生任何資料變化,Zookeeper将會通過 watcher 通知用戶端。用戶端接到通知,将會重新拉取該目錄下全量資料,并重新注冊 watcher。利用這個模式,Dubbo服務就可以就做到服務的動态發現。

注意:Zookeeper提供了“心跳檢測”功能,它會定時向各個服務提供者發送一個請求(實際上建立的是一個 socket 長連接配接),如果長期沒有響應,服務中心就認為該服務提供者已經“挂了”,并将其剔除。

6,說說Dubbo與Spring Cloud的差別?

通信方式:Dubbo使用的是RPC通信,Spring Cloud使用的是HTTP RestFul方式

注冊中心:Dubbo使用Zookeeper(官方推薦),還有Redis、Multicast、Simple注冊中心,但不推薦,

Spring Cloud使用的是Spring Cloud Netflix Eureka

監控:Dubbo使用的是Dubbo-monitor,Spring Cloud使用的是Spring Boot admin

斷路器:Dubbo在斷路器這方面還不完善,Spring Cloud使用的是Spring Cloud Netflix Hystrix

分布式配置、網關服務、服務跟蹤、消息總線、批量任務等

7、dubbo負載均衡怎麼實作?

用戶端使用MockClusterInvoker對象調用遠端服務。預設情況下,MockClusterInvoker對象将調用遠端服務的任務委托給FailoverClusterInvoker。FailoverClusterInvoker通過select方法選擇合适的服務。select方法的入參包括負載均衡對象,InvokerWrapper對象集合等,其中每個服務對應一個InvokerWrapper對象,InvokerWrapper對象是對遠端調用服務的包裝類。

8、dobbo泛化調用過程原理?

9、dubbo逾時時間怎麼設定?

dubbo服務逾時時間有xml和注解兩種方式進行實作配置逾時功能。在配置範圍上分為全部逾時配置、接口類上逾時配置、以及接口方法上逾時配置。同類型上的配置消費端優先提供着端,靠近原則方法配置優先于接口類全局配置優先級最低。是以dubbo的逾時時間優先級為:消費者Method>提供者method>消費者Reference>提供者Service>消費者全局配置provider>提供者全局配置consumer。

10、服務調用是阻塞的嗎?

預設是阻塞的,可以異步調用,沒有傳回值的可以這麼做。

11、dubbo安全機制方面如何解決?

dubbo 通過 token 令牌防止使用者繞過注冊中心直連,然後在注冊中心管理授權,dubbo 提供了黑白名單,控制服務所允許的調用方。

12、Dubbo SPI 和 Java SPI 差別?

JDK 标準的 SPI 會一次性加載所有的擴充實作,如果有的擴充很耗時,但也沒用上,很浪費資源。是以隻希望加載某個的實作,就不現實了

DUBBO SPI:

1、 對 Dubbo 進行擴充,不需要改動 Dubbo 的源碼

2、 延遲加載,可以一次隻加載自己想要加載的擴充實作。

3、 增加了對擴充點 IOC 和 AOP 的支援,一個擴充點可以直接 setter 注入其它擴充點。

4、 Dubbo 的擴充機制能很好的支援第三方 IoC 容器,預設支援 Spring Bean。

13、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

14、Dubbo 的使用場景有哪些?

1、 透明化的遠端方法調用:就像調用本地方法一樣調用遠端方法,隻需簡單配置,沒有任何API侵入。

2、 軟負載均衡及容錯機制:可在内網替代 F5 等硬體負載均衡器,降低成本,減少單點。

3、 服務自動注冊與發現:不再需要寫死服務提供方位址,注冊中心基于接口名查詢服務提供者的IP位址,并且能夠平滑添加或删除服務提供者。

15、Dubbo服務降級,失敗重試怎麼做?

可以通過dubbo:reference 中設定mock="return null"。mock的值也可以修改為true,然後在跟接口同一個路徑下實作一個Mock類,命名規則是"接口名稱+Mock"字尾。然後在Mock類裡實作自己的降級邏輯。

16、dubbo支援哪些系列化方式?

  1. hessian2:跨語言的高效二進制序列化方式。但這裡實際不是原生的hessian2序列化,而是阿裡修改過的,它是dubbo RPC預設啟用的序列化方式。
  2. avro:将資料結構或對象轉化成便于存儲或傳輸的格式。Avro設計之初就用來支援資料密集型應用,适合于遠端或本地大規模資料的存儲和交換。
  1. fastjson:一個Java語言編寫的高性能功能完善的JSON庫。它采用一種“假定有序快速比對”的算法,把JSON Parse的性能提升到極緻,是目前Java語言中最快的JSON庫。Fastjson接口簡單易用,已經被廣泛使用在緩存序列化、協定互動、Web輸出、Android用戶端等多種應用場景。
  1. fst:重新實作的 Java 快速對象序列化的開發包。序列化速度更快(2-10倍)、體積更小,而且相容 JDK 原生的序列化。
  2. gson:一個簡單的基于Java的庫,用于将Java對象序列化為JSON,反之亦然。 它是由Google開發的一個開源庫。
  1. jdk:JDK自帶序列化。
  2. kryo:一個快速高效的Java對象圖形序列化架構,主要特點是性能、高效和易用。該項目用來序列化對象到檔案、資料庫或者網絡。
  3. protobuf: Google 的語言中立、平台中立、可擴充的結構化資料序列化機制。
  4. protostuff:一個 java 序列化庫,内置支援向前向後相容性(模式演變)和驗證。

來自:https://blog.csdn.net/qq_43437874/article/details/120178606

17、dubbo注冊發現流程?

1、首先服務的提供者啟動服務到注冊中心注冊,包括各種ip端口資訊,Dubbo會同時注冊該項目提供的遠端調用的方法

2、服務的消費者(使用者)注冊到注冊中心,訂閱發現

3、當有新的遠端調用方法注冊到注冊中心時,注冊中心會通知服務的消費者有哪些新的方法,如何調用

4、RPC調用:服務的調用者就無需知道ip和端口号,隻需要服務名稱就可以調用到服務提供者的方法

私信我 發送:面試題,擷取面試題合集

繼續閱讀