后端面試題(一):什么是 Dubbo?它有哪些核心功能?
普通人
Dubbo 是以高性能 RPC 框架,它提供了分布式架構(gòu)下的服務之間通信方案,使 得開發(fā)者可以不需要關(guān)心網(wǎng)絡通信的細節(jié)。通過該框架可以使得遠程服務調(diào)用方 式和本地服務調(diào)用方式一樣簡單
高手
Dubbo 是一款高性能、輕量級的開源 RPC 框架。由 10 層模式構(gòu)成,整個分層 依賴由上至下。 通過這張圖我們也可以將 Dubbo 理解為三層模式:

第一層的 Business 業(yè)務邏輯層由我們自己來提供接口和實現(xiàn)還有一些配置信息。
第二層的 RPC 調(diào)用的核心層負責封裝和實現(xiàn)整個 RPC 的調(diào)用過程、負載均衡、 集群容錯、代理等核心功能。?
Remoting 則是對網(wǎng)絡傳輸協(xié)議和數(shù)據(jù)轉(zhuǎn)換的封裝。?
?Dubbo 官方文檔的介紹,Dubbo 提供了六大核心能力?
面向接口代理的高性能 RPC 調(diào)用。
智能容錯和負載均衡。
服務自動注冊和發(fā)現(xiàn)。?
高度可擴展能力。?
運行期流量調(diào)度。?
可視化的服務治理與運維。
面試官:既然說到 Dubbo 的功能,請詳細說說 Dubbo 負載均衡的幾種策略?
高手:
Dubbo 有五種負載策略:?
第一種是加權(quán)隨機:假設(shè)我們有一組服務器 servers = [A, B, C],他們對應的權(quán) 重為 weights = [5, 3, 2],權(quán)重總和為 10?,F(xiàn)在把這些權(quán)重值平鋪在一維坐標值 上,[0, 5) 區(qū)間屬于服務器 A,[5, 8) 區(qū)間屬于服務器 B,[8, 10) 區(qū)間屬于服 務器 C。
接下來通過隨機數(shù)生成器生成一個范圍在 [0, 10) 之間的隨機數(shù),然后 計算這個隨機數(shù)會落到哪個區(qū)間上就可以了。?
第二種是最小活躍數(shù):每個服務提供者對應一個活躍數(shù) active,初始情況下, 所有服務提供者活躍數(shù)均為 0。
每收到一個請求,活躍數(shù)加 1,完成請求后則將 活躍數(shù)減 1。
在服務運行一段時間后,性能好的服務提供者處理請求的速度更快, 因此活躍數(shù)下降的也越快,此時這樣的服務提供者能夠優(yōu)先獲取到新的服務請求。
第三種是一致性 hash:通過 hash 算法,把 provider 的 invoke 和隨機節(jié)點生成 hash,并將這個 hash 投射到 [0, 2^32 - 1] 的圓環(huán)上,查詢的時候根據(jù) key 進 行 md5 然后進行 hash,得到第一個節(jié)點的值大于等于當前 hash 的 invoker。?
第四種是加權(quán)輪詢:比如服務器 A、B、C 權(quán)重比為 5:2:1,那么在 8 次請求中, 服務器 A 將收到其中的 5 次請求,服務器 B 會收到其中的 2 次請求,服務器 C 則收到其中的 1 次請求。
?
第五種是最短響應時間權(quán)重隨機: 計算目標服務的請求的響應時間,根據(jù)響應 時間最短的服務,配置更高的權(quán)重進行隨機訪問。
面試官:Dubbo 的工作原理是什么樣的??
高手:

1.服務啟動的時候,provider 和 consumer 根據(jù)配置信息,連接到注冊中心 register,分別向注冊中心注冊和訂閱服務?
2.register 根據(jù)服務訂閱關(guān)系,返回 provider 信息到 consumer,同時 consumer 會把 provider 信息緩存到本地。如果信息有變更,consumer 會收到來自 register 的推送?
3.consumer 生成代理對象,同時根據(jù)負載均衡策略,選擇一臺 provider,同時 定時向 monitor 記錄接口的調(diào)用次數(shù)和時間信息?
4.拿到代理對象之后,consumer 通過代理對象發(fā)起接口調(diào)用?
5.provider 收到請求后對數(shù)據(jù)進行反序列化,然后通過代理調(diào)用具體的接口實現(xiàn) 面試官:最后在說說 Dubbo 與 Spring Cloud 的區(qū)別吧!
Dubbo 是 SOA 時代的產(chǎn)物,它的關(guān)注點主要在于服務的調(diào)用,流量分發(fā)、流 量監(jiān)控和熔斷。而 Spring Cloud 誕生于微服務架構(gòu)時代,考慮的是微服務治理 的方方面面,另外由于依托了 Spirng、Spirng Boot 的優(yōu)勢之上,兩個框架在 開始目標就不一致,Dubbo 定位服務治理、Spirng Cloud 是一個生態(tài)。
兩者最大的區(qū)別是 Dubbo 底層是使用 Netty 這樣的 NIO 框架,是基于 TCP 協(xié)議傳輸?shù)?,配合?Hession 序列化完成 RPC 通信。而 SpringCloud 是基 于 Http 協(xié)議+Rest 接口調(diào)用遠程過程的通信,相對來說,Http 請求會有更大 的報文,占的帶寬也會更多。但是 REST 相比 RPC 更為靈活,服務提供方和調(diào) 用方的依賴只依靠一紙契約,不存在代碼級別的強依賴。