Dubbo面試題
springcloud和Dobbo有什么區(qū)別
說(shuō)真的,這兩個(gè)東西沒(méi)有可比性,Dubbo最開(kāi)始是一個(gè)可擴(kuò)展的RPC調(diào)用框架,在Dubbo里一次調(diào)用涉及到的服
務(wù)路由、負(fù)載均衡、序列化機(jī)制、網(wǎng)絡(luò)傳輸協(xié)議等等都是可以擴(kuò)展的,具體的性能取決于所選用的組件,同樣
Spring Cloud也類似,所以我們不能站在性能的角度來(lái)對(duì)比兩個(gè)框架。
其次,作為框架,要對(duì)比我們也應(yīng)該對(duì)比這個(gè)框架的可擴(kuò)展性,Dubbo的可擴(kuò)展性是不要比Spring Cloud好的。
而Spring Cloud目前的優(yōu)勢(shì)是組件比較齊全,比如有服務(wù)網(wǎng)關(guān)、分布式配置中心、服務(wù)跟蹤等等,而這些Dubbo
暫時(shí)還沒(méi)有,但是在Dubbo生態(tài)里是準(zhǔn)備加上的。
Dubbo2.7有什么新功能
\1. 動(dòng)態(tài)配置中心(confifigcenter)
\2. 元數(shù)據(jù)中心
\3. 條件路由支持應(yīng)用
\4. 標(biāo)簽路由
Dubbo支持哪些通信協(xié)議,分別適用于哪些場(chǎng)景
\1. dubbo://,框架的默認(rèn)協(xié)議,采用單一長(zhǎng)連接和 NIO 異步通訊,適合于小數(shù)據(jù)量大并發(fā)的服務(wù)調(diào)用。
\2. http://,使用短連接同步傳輸,使用數(shù)據(jù)量不確定,并且需要在js或?yàn)g覽器中使用。
http長(zhǎng)連接和短連接
Http1.0,不支持長(zhǎng)連接
Http1.1,默認(rèn)為長(zhǎng)連接,Connection=keep-alive
但是,說(shuō)Http長(zhǎng)連接并不準(zhǔn)確,因?yàn)閔ttp是應(yīng)用層協(xié)議,tcp才是傳輸層協(xié)議,只有傳輸層才能說(shuō)建立連接與關(guān)閉
連接。
那么,長(zhǎng)連接有什么好處,長(zhǎng)連接就是可以保持連接,那當(dāng)我打開(kāi)一個(gè)網(wǎng)頁(yè)后,實(shí)際上我通常要過(guò)會(huì)才有可能去
請(qǐng)求其他東西,其實(shí)并不需要這個(gè)連接一直保持在這,從這個(gè)角度看,似乎使用短連接比較合適。
長(zhǎng)連接,實(shí)際上是指tcp長(zhǎng)連接,那么http可以在這個(gè)連接的基礎(chǔ)上發(fā)送多次http請(qǐng)求與接收多次http響應(yīng),實(shí)際
上當(dāng)我們打開(kāi)一個(gè)網(wǎng)頁(yè)時(shí),還需要請(qǐng)求很多js,css等資源,這個(gè)時(shí)候這些請(qǐng)求是可以復(fù)用tcp連接的,從而節(jié)省
了網(wǎng)絡(luò)資源。
那么,長(zhǎng)連接什么時(shí)候才關(guān)閉?有一個(gè)超時(shí)時(shí)間的,在header進(jìn)行設(shè)置,當(dāng)這段時(shí)間內(nèi)沒(méi)有任何http請(qǐng)求則超時(shí)
后自動(dòng)關(guān)閉。
Dubbo支持的集群容錯(cuò)方案
- Failover Cluster:失敗自動(dòng)切換,當(dāng)出現(xiàn)失敗,重試其它服務(wù)器。通常用于讀操作,但重試會(huì)帶來(lái)更長(zhǎng)延
遲。
\2. Failfast Cluster:快速失敗,只發(fā)起一次調(diào)用,失敗立即報(bào)錯(cuò)。通常用于非冪等性的寫(xiě)操作,比如新增記
錄。
\3. Failsafe Cluster:失敗安全,出現(xiàn)異常時(shí),直接忽略。通常用于寫(xiě)入審計(jì)日志等操作。
\4. Failback Cluster:失敗自動(dòng)恢復(fù),后臺(tái)記錄失敗請(qǐng)求,定時(shí)重發(fā)。通常用于消息通知操作。
\5. Forking Cluster:并行調(diào)用多個(gè)服務(wù)器,只要一個(gè)成功即返回。通常用于實(shí)時(shí)性要求較高的讀操作,但需
要浪費(fèi)更多服務(wù)資源
\6. Broadcast Cluster:廣播調(diào)用所有提供者,逐個(gè)調(diào)用,任意一臺(tái)報(bào)錯(cuò)則報(bào)錯(cuò)。通常用于通知所有提供者更
新緩存或日志等本地資源信息。
Dubbo支持的負(fù)載均衡策略
\1. Random LoadBalance:隨機(jī)
\2. RoundRobin LoadBalance:輪詢
\3. LeastActive LoadBalance:最少活躍調(diào)用數(shù)
\4. ConsistentHash LoadBalance:一致性 Hash,相同參數(shù)的請(qǐng)求總是發(fā)到同一提供者。
Dubbo服務(wù)降級(jí)實(shí)現(xiàn)
Dubbo中的服務(wù)降級(jí)實(shí)際上使用的就是Dubbo中的Mock機(jī)制,比如當(dāng)調(diào)用某個(gè)服務(wù)失敗后,可以設(shè)置
mock=fail:return+null表示調(diào)用服務(wù)失敗后返回null。
服務(wù)提供者實(shí)現(xiàn)失效踢出是什么原理
服務(wù)失效踢出基于 Zookeeper 的臨時(shí)節(jié)點(diǎn)原理。
Dubbo服務(wù)暴露的過(guò)程
首先Dubbo會(huì)通過(guò)DubboNamespanceHandler解析dubbo:service/標(biāo)簽,并且Spring會(huì)完成Bean的實(shí)例化,隨后
發(fā)布ContextRefreshEvent事件,會(huì)調(diào)用ServiceBean中的export方法,以這個(gè)方法為入口然后進(jìn)行服務(wù)暴露。實(shí)
際上,我們應(yīng)該叫服務(wù)導(dǎo)出,因?yàn)榉?wù)導(dǎo)出包括服務(wù)注冊(cè)和服務(wù)暴露,導(dǎo)出順序也是先進(jìn)行服務(wù)注冊(cè)在進(jìn)行服務(wù)
暴露,服務(wù)注冊(cè)就是將服務(wù)信息(包括接口名以及對(duì)于的協(xié)議等信息)注冊(cè)到注冊(cè)中心,然后進(jìn)行服務(wù)信息監(jiān)聽(tīng)
器綁定,然后進(jìn)行服務(wù)暴露(其實(shí)就是啟動(dòng)tomcat或nettyserver)。
Dubbo服務(wù)引入的過(guò)程
首先Dubbo會(huì)通過(guò)DubboNamespanceHandler解析dubbo:reference/標(biāo)簽,并且Spring會(huì)完成Bean的實(shí)例化,在
引入該Bean的時(shí)候,會(huì)調(diào)用ReferenceBean的getObject方法,以這個(gè)方法為入口然后進(jìn)行服務(wù)引入,服務(wù)引入
的步驟為:先根據(jù)服務(wù)名從注冊(cè)中心找到所有的服務(wù)提供者并且封裝到服務(wù)目錄中,然后進(jìn)行服務(wù)路由的初始
化,然后進(jìn)行監(jiān)聽(tīng)器綁定,然后將服務(wù)目錄封裝為Cluster,最后生成代理類。實(shí)際上服務(wù)引入是相當(dāng)復(fù)雜的,這
里只能面試大概的步驟。
Dubbo服務(wù)調(diào)用的過(guò)程
消費(fèi)者:
\1. Mock機(jī)制
\2. 服務(wù)路由
\3. 負(fù)載均衡
\4. Filter過(guò)濾
\5. 發(fā)送請(qǐng)求
服務(wù)者:
\1. 接收請(qǐng)求
\2. Filter過(guò)濾
\3. 執(zhí)行具體的實(shí)現(xiàn)類
\4. 返回結(jié)果