主頁 > 後端開發 > 【硬核】Dubbo常見面試題

【硬核】Dubbo常見面試題

2020-10-12 13:17:03 後端開發

有情懷,有干貨,微信搜索【三太子敖丙】關注這個不一樣的程式員,

本文 GitHub https://github.com/JavaFamily 已收錄,有一線大廠面試完整考點、資料以及我的系列文章,

前言

Dubbo 整體介紹的差不多了,今天就開始面試環節了,我會列舉一些常見的 Dubbo 面試題,只會抓著重的,一些太簡單的我就不提了,

不僅僅給你面試題的答案,也會剖析面試官問這個問題的原因,也就是他的內心活動,

想從你這里問出什么?想要什么答案?想挖什么坑給你跳?

開始表演

知道什么是 RPC 么?

一般面試官會以這樣的問題來切入、熱場,畢面試也是循序漸進的程序,所以你也不用太心急一開始就芭芭拉說一堆,要抓住關鍵點簡單闡述先,

而且面試官能從這個問題鑒定出你平日的作業內容會不會連 RPC 都沒接觸過,會不會就只是一條龍的 Spring MVC ?

確實有很多同學沒接觸過 RPC ,也很正常比如一些外包或者一些小專案都接觸不到的,不過平日接觸不到和你不知道這個東西是兩個概念,

能從側面反映出這個人作業之余應該不怎么學習,連 RPC 都不知道,所以怎么都說不過去,基本上要涼涼,對你的初始印象就差了,除非你能從后面有亮眼的表現,

答:RPC 就是 Remote Procedure Call,遠程程序呼叫,它相對應的是本地程序呼叫,

那為什么要有 RPC,HTTP 不好么?

這時候面試官就開始追問了,

這個問題其實很有意思,有些面試官可能自己不太清楚,然后以為自己很清楚,所以問出這個問題,還有一種是真的清楚,問這個問題是為了讓你跳坑里,

因為 RPC 和 HTTP 就不是一個層級的東西,所以嚴格意義上這兩個沒有可比性,也不應該來作比較,而題目問的就是把這兩個作為比較了,

HTTP 只是傳輸協議,協議只是規范了一定的交流格式,而且 RPC 是早于 HTTP 的,所以真要問也是問有 RPC 為什么還要 HTTP,

RPC 對比的是本地程序呼叫,是用來作為分布式系統之間的通信,它可以用 HTTP 來傳輸,也可以基于 TCP 自定義協議傳輸,

所以你要先提出這兩個不是一個層級的東西,沒有可比性,然后再表現一下,可以說 HTTP 協議比較冗余,所以 RPC 大多都是基于 TCP 自定義協議,定制化的才是最適合自己的,

當然也有基于 HTTP 協議的 RPC 框架,畢竟 HTTP 是公開的協議,比較通用,像 HTTP2 已經做了相應的壓縮了,而且系統之間的呼叫都在內網,所以說影響也不會很大,

這波回答下來,面試官會覺得你有點東西,開始對你有點興趣了,要開始深入你了,

說說你對 Dubbo 的了解?

面試官會先問個大點的問題,然后從你的回答中找到一些突破口來深入問,所以這個問題其實挺開放性的,你可以從歷史的發展來答,也可以從整體架構來答,

如果從歷史發展的角度來答,說明你平日里也是挺關注一些開源軟體的,側面也能體現你的對開源的擁抱,

如果從總體架構答,毋庸置疑肯定也是可以的,建議先淺顯的說,等著追問,

歷史發展,這個其實丙之前文章已經提到了:

Dubbo 是阿里巴巴開源的一個基于 Java 的 RPC 框架,中間沉寂了一段時間,但在 2017 年阿里巴巴又重啟了對 Dubbo 維護,

并且在 2018 年和 當當的 Dubbox 進行了合并,進入 Apache 范訓器,在 2019 年畢業正式成為 Apache 頂級專案,

目前 Dubbo 社區主力維護的是 2.6.x 和 2.7.x 兩大版本,2.6.x 版本主要是 bug 修復和少量功能增強為準,是穩定版本,

2.7.5 版本的發布被 Dubbo 認為是里程碑式的版本發布,支持 gRPC,并且性能提升了 30%(這里不了解gRPC 和為什么性能提升的話就別說了,別給自己挖坑),

最新的 3.0 版本往云原生方向上探索著,

注意了,如果對歷史各個版本不太熟,也不知道最新的版本要干啥就別往這方向答了,運氣好點就是面試官自己也不太了解,他可能不會問,運氣背點就追問了,

總體架構,上面也提到了先淺顯的說,等追問,因為面試官如果懂,他肯定會問深入,如果不懂你芭芭拉一堆他無感的,

你就簡單的提一下現在這幾個角色,

節點 角色說明
Consumer 需要呼叫遠程服務的服務消費方
Registry 注冊中心
Provider 服務提供方
Container 服務運行的容器
Monitor 監控中心

比如, Dubbo 總體分了以上這么幾個角色,分別的作用是xxxx,

這里停頓下看下面試官的反應,如果沒搭話,就繼續說大致的流程,

首先服務提供者 Provider 啟動然后向注冊中心注冊自己所能提供的服務,

服務消費者 Consumer 啟動向注冊中心訂閱自己所需的服務,然后注冊中心將提供者元資訊通知給 Consumer, 之后 Consumer 因為已經從注冊中心獲取提供者的地址,因此可以通過負載均衡選擇一個 Provider 直接呼叫 ,

之后服務提供方元資料變更的話注冊中心會把變更推送給服務消費者,

服務提供者和消費者都會在記憶體中記錄著呼叫的次數和時間,然后定時的發送統計資料到監控中心,

到這基本上就差不多了,如果之前看過丙的 Dubbo 系列文章的話,那就算看過原始碼了,肯定對一系列程序很清晰了,所以在適當的時機可以說自己看過 Dubbo 原始碼,

眾所周知,看過原始碼肯定是加分項,所以這點是要提的,

面試官一聽,好家伙看過原始碼是吧,來說說,

接下來就開始連擊了,

看過原始碼,那說下服務暴露的流程?

服務的暴露起始于 Spring IOC 容器重繪完畢之后,會根據配置引陣列裝成 URL, 然后根據 URL 的引數來進行本地或者遠程呼叫,

會通過 proxyFactory.getInvoker,利用 javassist 來進行動態代理,封裝真的實作類,然后再通過 URL 引數選擇對應的協議來進行 protocol.export,默認是 Dubbo 協議,

在第一次暴露的時候會呼叫 createServer 來創建 Server,默認是 NettyServer,

然后將 export 得到的 exporter 存入一個 Map 中,供之后的遠程呼叫查找,然后會向注冊中心注冊提供者的資訊,

基本上就是這么個流程,說了這些差不多了,太細的誰都記住不,

看過原始碼,那說下服務引入的流程?

服務的引入時機有兩種,第一種是餓漢式,第二種是懶漢式,

餓漢式就是加載完畢就會引入,懶漢式是只有當這個服務被注入到其他類中時啟動引入流程,默認是懶漢式,

會先根據配置引陣列裝成 URL ,一般而言我們都會配置的注冊中心,所以會構建 RegistryDirectory 向注冊中心注冊消費者的資訊,并且訂閱提供者、配置、路由等節點,

得知提供者的資訊之后會進入 Dubbo 協議的引入,會創建 Invoker ,期間會包含 NettyClient,來進行遠程通信,最后通過 Cluster 來包裝 Invoker,默認是 FailoverCluster,最侄訓傳代理類,

說這么多差不多了,關鍵的點都提到了,

切忌不要太過細,不要把你知道的都說了,這樣會抓不住重點,比如上面的流程你要插入,引入的三種方式:本地引入、直連遠程引入、通過注冊中心引入,

然后再分別說本地引入怎樣的,芭芭拉的就會很亂,所以面試的時候是需要刪減的,要直擊重點,

其實真實說的應該比我上面說的還要精簡點才行,我是怕大家不太清楚說的稍微詳細了一些,

看過原始碼,那說下服務呼叫的流程?

呼叫某個介面的方法會呼叫之前生成的代理類,然后會從 cluster 中經過路由的過濾、負載均衡機制選擇一個 invoker 發起遠程呼叫,此時會記錄此請求和請求的 ID 等待服務端的回應,

服務端接受請求之后會通過引數找到之前暴露存盤的 map,得到相應的 exporter ,然后最終呼叫真正的實作類,再組裝好結果回傳,這個回應會帶上之前請求的 ID,

消費者收到這個回應之后會通過 ID 去找之前記錄的請求,然后找到請求之后將回應塞到對應的 Future 中,喚醒等待的執行緒,最后消費者得到回應,一個流程完畢,

關鍵的就是 cluster、路由、負載均衡,然后 Dubbo 默認是異步的,所以請求和回應是如何對應上的,

之后可能還會追問 Dubbo 異步轉同步如何實作的之類的,在丙之前文章里面都說了,忘記的同學可以回去看看,

知道什么是 SPI 嘛?

這又是一個方向了,從上面的回答中,不論是從 Dubbo 協議,還是 cluster ,什么 export 方法等等無處不是 SPI 的影子,所以如果是問 Dubbo 方面的問題,問 SPI 是毋庸置疑的,因為原始碼里 SPI 無處不在,而且 SPI 也是 Dubbo 可擴展性的基石,

所以這個題目沒什么套路,直接答就行,

SPI 是 Service Provider Interface,主要用于框架中,框架定義好介面,不同的使用者有不同的需求,因此需要有不同的實作,而 SPI 就通過定義一個特定的位置,Java SPI 約定在 Classpath 下的 META-INF/services/ 目錄里創建一個以服務介面命名的檔案,然后檔案里面記錄的是此 jar 包提供的具體實作類的全限定名

所以就可以通過介面找到對應的檔案,獲取具體的實作類然后加載即可,做到了靈活的替換具體的實作類,

為什么 Dubbo 不用 JDK 的 SPI,而是要自己實作?

問這個問題就是看你有沒有深入的了解,或者自己思考過,不是死板的看原始碼,或者看一些知識點,

很多點是要思考的,不是書上說什么就是什么,你要知道這樣做的理由,有什么好處和壞處,這很容易看出一個人是死記硬背還是有自己的思考,

答:因為 Java SPI 在查找擴展實作類的時候遍歷 SPI 的組態檔并且將實作類全部實體化,假設一個實作類初始化程序比較消耗資源且耗時,但是你的代碼里面又用不上它,這就產生了資源的浪費,

因此 Dubbo 就自己實作了一個 SPI,給每個實作類配了個名字,通過名字去檔案里面找到對應的實作類全限定名然后加載實體化,按需加載,

這答出來就加分了,面試官心里在拍手了,不錯不錯有點東西,

Dubbo 為什么默認用 Javassist

上面你回答 Dubbo 用 Javassist 動態代理,所以很可能會問你為什么要用這個代理,可能還會引申出 JDK 的動態代理、ASM、CGLIB,

所以這也是個注意點,如果你不太清楚的話上面的回答就不要扯到動態代理了,如果清楚的話那肯定得提,來誘導面試官來問你動態代理方面的問題,這很關鍵,

面試官是需要誘導的,畢竟他也想知道你優秀的方面到底有多優秀,你也取長補短,雙贏雙贏,

來回答下為什么用 Javassist,很簡單,就是快,且位元組碼生成方便

ASM 比 Javassist 更快,但是沒有快一個數量級,而Javassist 只需用字串拼接就可以生成位元組碼,而 ASM 需要手工生成,成本較高,比較麻煩,

如果讓你設計一個 RPC 框架,如何設計?

面試官都很喜歡問這類問題,來考驗候選人的設計能力,和平日有無全方面的了解過一個框架,

如果你平時沒有思考,沒有往這方面想過答出來的東西就會沒有條理性,會顯得雜亂無章,不過你也不用慌張,不用想的很全面,答的很細致,沒有必要,面試官要的是那些關鍵的重點,

你可以從底層向上開始說起

首先需要實作高性能的網路傳輸,可以采用 Netty 來實作,不用自己重復造輪子,然后需要自定義協議,畢竟遠程互動都需要遵循一定的協議,然后還需要定義好序列化協議,網路的傳輸畢竟都是二進制流傳輸的,

然后可以搞一套描述服務的語言,即 IDL(Interface description language),讓所有的服務都用 IDL 定義,再由框架轉換為特定編程語言的介面,這樣就能跨語言了,

此時最近基本的功能已經有了,但是只是最基礎的,工業級的話首先得易用,所以框架需要把上述的細節對使用者進行屏蔽,讓他們感覺不到本地呼叫和遠程呼叫的區別,所以需要代理實作,

然后還需要實作集群功能,因此的要服務發現、注冊等功能,所以需要注冊中心,當然細節還是需要屏蔽的,

最后還需要一個完善的監控機制,埋點上報呼叫情況等等,便于運維,

這樣一個 RPC 框架的雛形就差不多了,

最后

Dubbo 系列就到此結束了,其實還是有很多細節的,如果要寫肯定還是有很多可以寫的,

不過整體脈絡都理清楚了,之后的修行還是得靠大家自己多多努力,

面試題肯定不止這一些,面試題是問不完的,真實的面試肯定是抓住你回答的點來深挖,所以我也模擬不了,我只能告訴你大致關鍵點,和揣摩一下面試官的心理活動,

當面試官問你的時候你可以試著去揣摩,看看他到底想要問什么,這很關鍵

面試的時候不要慌,你和面試官是平等的,而且面試官不一定你厲害,還有面試有時候就是看運氣了,面試失敗了也不要氣餒,換一家就好了,有時候就是氣場不和,這很正常,

加油,

我是敖丙,你知道的越多,你不知道的越多,感謝各位人才的:點贊收藏評論,我們下期見!


文章持續更新,可以微信搜一搜「 三太子敖丙 」第一時間閱讀,回復【資料】有我準備的一線大廠面試資料和簡歷模板,本文 GitHub https://github.com/JavaFamily 已經收錄,有大廠面試完整考點,歡迎Star,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/168998.html

標籤:其他

上一篇:第 10 章 物件的實體化記憶體布局與訪問定位

下一篇:Git操作常用的命令都在這里了。

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more