開源框架面試之Dubbo面試題

1、Dubbo中zookeeper做注冊(cè)中心,如果注冊(cè)中心集群都掛掉,發(fā)布 者和訂閱者之間還能通信么?

可以通信的,啟動(dòng)dubbo時(shí),消費(fèi)者會(huì)從zk拉取注冊(cè)的生產(chǎn)者的地址接 口等數(shù)據(jù),緩存在本地。每次調(diào)用時(shí),按照本地存儲(chǔ)的地址進(jìn)行調(diào)用;注 冊(cè)中心對(duì)等集群,任意一臺(tái)宕機(jī)后,將會(huì)切換到另一臺(tái);注冊(cè)中心全部宕機(jī) 后,服務(wù)的提供者和消費(fèi)者仍能通過本地緩存通訊。服務(wù)提供者無狀態(tài), 任一臺(tái)宕機(jī)后,不影響使用;服務(wù)提供者全部宕機(jī),服務(wù)消費(fèi)者會(huì)無法使 用,并無限次重連等待服務(wù)者恢復(fù);掛掉是不要緊的,但前提是你沒有增 加新的服務(wù),如果你要調(diào)用新的服務(wù),則是不能辦到的。

2、dubbo服務(wù)負(fù)載均衡策略?
  1. Random LoadBalance

隨機(jī),按權(quán)重設(shè)置隨機(jī)概率。在一個(gè)截面上碰撞的概率高,但調(diào)用量越大 分布越均勻,而且按概率使用權(quán)重后也比較均勻,有利于動(dòng)態(tài)調(diào)整提供者 權(quán)重。(權(quán)重可以在dubbo管控臺(tái)配置)

  1. RoundRobin LoadBalance

輪循,按公約后的權(quán)重設(shè)置輪循比率。存在慢的提供者累積請(qǐng)求問題,比 如:第二臺(tái)機(jī)器很慢,但沒掛,當(dāng)請(qǐng)求調(diào)
到第二臺(tái)時(shí)就卡在那,久而久之,所有請(qǐng)求都卡在調(diào)到第二臺(tái)上。

  1. LeastActive LoadBalance

最少活躍調(diào)用數(shù),相同活躍數(shù)的隨機(jī),活躍數(shù)指調(diào)用前后計(jì)數(shù)差。使慢的 提供者收到更少請(qǐng)求,因?yàn)樵铰奶峁┱叩?br> 調(diào)用前后計(jì)數(shù)差會(huì)越大。

  1. ConsistentHash LoadBalance

一致性Hash,相同參數(shù)的請(qǐng)求總是發(fā)到同一提供者。當(dāng)某一臺(tái)提供者掛 時(shí),原本發(fā)往該提供者的請(qǐng)求,基于虛擬節(jié)點(diǎn),平攤到其它提供者,不會(huì) 引起劇烈變動(dòng)。缺省只對(duì)第一個(gè)參數(shù)Hash,如果要修改,請(qǐng)配置
<dubbo:parameter key="hash.arguments" value=H0,1H />
缺省用160份虛擬節(jié)點(diǎn),如果要修改,請(qǐng)配置
<dubbo:parameter key=Hhash.nodesH value="320" />

3、Dubbo在安全機(jī)制方面是如何解決的

Dubbo通過Token令牌防止用戶繞過注冊(cè)中心直連,然后在注冊(cè)中心上管 理授權(quán)。Dubbo還提供服務(wù)黑白名單,來控制服務(wù)所允許的調(diào)用方。

4、dubbo連接注冊(cè)中心和直連的區(qū)別

在開發(fā)及測試環(huán)境下,經(jīng)常需要繞過注冊(cè)中心,只測試指定服務(wù)提供者, 這時(shí)候可能需要點(diǎn)對(duì)點(diǎn)直連,點(diǎn)對(duì)點(diǎn)直聯(lián)方式,將以服務(wù)接口為單位,忽 略注冊(cè)中心的提供者列表,

Failsafe Cluster

失敗安全,出現(xiàn)異常時(shí),直接忽略。通常用于寫入審計(jì)日志等操作。

服務(wù)注冊(cè)中心,動(dòng)態(tài)的注冊(cè)和發(fā)現(xiàn)服務(wù),使服務(wù)的位置透明,并通過在消 費(fèi)方獲取服務(wù)提供方地址列表,實(shí)現(xiàn)軟負(fù)載均衡和Failover,注冊(cè)中心返 回服務(wù)提供者地址列表給消費(fèi)者,如果有變更,注冊(cè)中心將基于長連接推 送變更數(shù)據(jù)給消費(fèi)者。服務(wù)消費(fèi)者,從提供者地址列表中,基于軟負(fù)載均 衡算法,選一臺(tái)提供者進(jìn)行調(diào)用,如果調(diào)用失敗,再選另一臺(tái)調(diào)用。注冊(cè) 中心負(fù)責(zé)服務(wù)地址的注冊(cè)與查找,相當(dāng)于目錄服務(wù),服務(wù)提供者和消費(fèi)者 只在啟動(dòng)時(shí)與注冊(cè)中心交互,注冊(cè)中心不轉(zhuǎn)發(fā)請(qǐng)求,服務(wù)消費(fèi)者向注冊(cè)中 心獲取服務(wù)提供者地址列表,并根據(jù)負(fù)載算法直接調(diào)用提供者,注冊(cè)中 心,服務(wù)提供者,服務(wù)消費(fèi)者三者之間均為長連接,監(jiān)控中心除外,注冊(cè) 中心通過長連接感知服務(wù)提供者的存在,服務(wù)提供者宕機(jī),注冊(cè)中心將立 即推送事件通知消費(fèi)者注冊(cè)中心和監(jiān)控中心全部宕機(jī),不影響已運(yùn)行的提 供者和消費(fèi)者,消費(fèi)者在本地緩存了提供者列表注冊(cè)中心和監(jiān)控中心都是 可選的,服務(wù)消費(fèi)者可以直連服務(wù)提供者。

  1. dubbo服務(wù)集群配置(集群容錯(cuò)模式)
    在集群調(diào)用失敗時(shí),Dubbo提供了多種容錯(cuò)方案,缺省為failover重試。 可以自行擴(kuò)展集群容錯(cuò)策略l Failover Cluster (默認(rèn)) 失敗自動(dòng)切換,當(dāng)出現(xiàn)失敗,重試其它服務(wù)器。(缺?。┩ǔS糜谧x操作, 但重試會(huì)帶來更長延遲。可通過retries="2"來設(shè)置重試次數(shù)(不含第一次)。
    <dubbo:service retries="2" cluster=HfailoverH/>
    或:
    <dubbo:reference retries="2" cluster="failover"/> cluster="failover"可以不用寫,因?yàn)槟J(rèn)就是failover

Failfast Cluster
快速失敗,只發(fā)起一次調(diào)用,失敗立即報(bào)錯(cuò)。通常用于非冨等性的寫操 作,
比如新增記錄。
dubbo:service cluster="failfast" />
或:
<dubbo:reference cluster="failfast" />

cluster="failfast"和把 cluster="failover"、retries="0"是一樣的效 果,retries="0"就是不重試

  1. Failsafe Cluster
    失敗安全,出現(xiàn)異常時(shí),直接忽略。通常用于寫入審計(jì)日志等操作。
    <dubbo:service cluster="failsafe" />
    或:
    <dubbo:reference cluster="failsafe" />

  2. Failback Cluster

失敗自動(dòng)恢復(fù),后臺(tái)記錄失敗請(qǐng)求,定時(shí)重發(fā)。通常用于消息通知操作。
<dubbo:service cluster="failback" /> 或:
<dubbo:reference cluster="failback" />

  1. Forking Cluster
    并行調(diào)用多個(gè)服務(wù)器,只要一個(gè)成功即返回。通常用于實(shí)時(shí)性要求較高的 讀操作,但需要浪費(fèi)更多服務(wù)資源??赏ㄟ^forks="2"來設(shè)置最大并行數(shù)。
    <dubbo:service cluster="forking" forks="2"/>或:
    <dubbo:reference cluster="forking" forks="2"/>

配置

服務(wù)端服務(wù)級(jí)別

<dubbo:service interface="..." loadbalance=HroundrobinH />

客戶端服務(wù)級(jí)別

<dubbo:reference interface="..." loadbalance="roundrobin" />

服務(wù)端方法級(jí)別
<dubbo:service interface="..."> <dubbo:method name="..." loadbalance />

客戶端方法級(jí)別 <dubbo:reference interf ace="..."> <dubbo:method name="..." loadbalance="/>

  1. dubbo通信協(xié)議dubbo協(xié)議為什么要消費(fèi)者比提供者個(gè)數(shù)多:

因dubbo 協(xié)議采用單一長連接,假設(shè)網(wǎng)絡(luò)為千兆網(wǎng)卡(1024Mbit=128MByte),根 據(jù)測試經(jīng)驗(yàn)數(shù)據(jù)每條連接最多只能壓滿7MByte(不同的環(huán)境可能不一 樣,供參考),理論上1個(gè)服務(wù)提供者需要20個(gè)服務(wù)消費(fèi)者才能壓滿網(wǎng) 卡。

  1. dubbo通信協(xié)議dubbo協(xié)議為什么不能傳大包:因dubbo協(xié)議采用單 一長連接,如果每次請(qǐng)求的數(shù)據(jù)包大小為500KByte,假設(shè)網(wǎng)絡(luò)為千兆 網(wǎng)卡(1024Mbit=128MByte),每條連接最大7MByte(不同的環(huán)境可能不 一樣,供參考),單個(gè)服務(wù)提供者的TPS(每秒處理事務(wù)數(shù))最大
    為:128MByte/ 500KByte = 262。單個(gè)消費(fèi)者調(diào)用單個(gè)服務(wù)提供者的 TPS(每秒處理事務(wù)數(shù))最大為:7MByte/ 500KByte = 14。如果能接受, 可以考慮使用,否則網(wǎng)絡(luò)將成為瓶頸。

  2. dubbo通信協(xié)議dubbo協(xié)議為什么采用異步單一長連接:因?yàn)榉?wù)的現(xiàn) 狀大都是服務(wù)提供者少,通常只有幾臺(tái)機(jī)器,而服務(wù)的消費(fèi)者多,可能 整個(gè)網(wǎng)站都在訪問該服務(wù),比如Morgan的提供者只有6臺(tái)提供者,卻 有上百臺(tái)消費(fèi)者,每天有1.5億次調(diào)用,如果采用常規(guī)的hessian服 務(wù),服務(wù)提供者很容易就被壓跨,通過單一連接,保證單一消費(fèi)者不會(huì) 壓死提供者,長連接,減少連接握手驗(yàn)證等,并使用異步IO,復(fù)用線 程池,防止C10K問題。

  3. dubbo通信協(xié)議dubbo協(xié)議適用范圍和適用場景適用范圍:傳入傳出參 數(shù)數(shù)據(jù)包較?。ńㄗh小于100K),消費(fèi)者比提供者個(gè)數(shù)多,單一消費(fèi)者無 法壓滿提供者,盡量不要用dubbo協(xié)議傳輸大文件或超大字符串。適 用場景:常規(guī)遠(yuǎn)程服務(wù)方法調(diào)用dubbo協(xié)議補(bǔ)充:連接個(gè)數(shù):單連接連接 方式:長連接傳輸協(xié)議:TCP傳輸方式:NI0異步傳輸序列化:Hessian二進(jìn) 制序列化

  4. RMI協(xié)議RMI協(xié)議采用JDK標(biāo)準(zhǔn)的java.rmi.*實(shí)現(xiàn),采用阻塞式短連接 和JDK標(biāo)準(zhǔn)序列化方式,Java標(biāo)準(zhǔn)的遠(yuǎn)程調(diào)用協(xié)議。連接個(gè)數(shù):多連 接連接方式:短連接傳輸協(xié)議:TCP傳輸方式:同步傳輸序列化:Java標(biāo)準(zhǔn) 二進(jìn)制序列化適用范圍:傳入傳出參數(shù)數(shù)據(jù)包大小混合,消費(fèi)者與提供 者個(gè)數(shù)差不多,可傳文件。適用場景:常規(guī)遠(yuǎn)程服務(wù)方法調(diào)用,與原生 RMI服務(wù)互操作

  5. Hessian協(xié)議Hessian協(xié)議用于集成Hessian的服務(wù),Hessian底層采 用Http通訊,采用Servlet暴露服務(wù),Dubbo缺省內(nèi)嵌Jetty作為服務(wù) 器實(shí)現(xiàn)基于Hessian的遠(yuǎn)程調(diào)用協(xié)議。連接個(gè)數(shù):多連接連接方式:短 連接傳輸協(xié)議:HTTP傳輸方式:同步傳輸序列化:Hessian二進(jìn)制序列化 適用范圍:傳入傳出參數(shù)數(shù)據(jù)包較大,提供者比消費(fèi)者個(gè)數(shù)多,提供者 壓力較大,可傳文件。適用場景:頁面?zhèn)鬏敚募鬏?,或與原生 hessian服務(wù)互操作

  6. http采用Spring的HttpInvoker實(shí)現(xiàn)基于http表單的遠(yuǎn)程調(diào)用協(xié)議。 連接個(gè)數(shù):多連接連接方式:短連接傳輸協(xié)議:HTTP傳輸方式:同步傳輸 序列化:表單序列化(JSON)適用范圍:傳入傳出參數(shù)數(shù)據(jù)包大小混合,提 供者比消費(fèi)者個(gè)數(shù)多,可用瀏覽器查看,可用表單或URL傳入?yún)?shù), 暫不支持傳文件。適用場景:需同時(shí)給應(yīng)用程序和瀏覽器JS使用的服 務(wù)。

  7. Webservice 基于 CXF 的 frontend-simple 和 transports-http 實(shí)現(xiàn)基于 WebService的遠(yuǎn)程調(diào)用協(xié)議。連接個(gè)數(shù):多連接連接方式:短連接傳輸 協(xié)議:HTTP傳輸方式:同步傳輸序列化:SOAP文本序列化適用場景:系統(tǒng) 集成,跨語言調(diào)用。

  8. Thrif Thrift 是 Facebook 捐給 Apache 的一個(gè) RPC 框架,當(dāng)前 dubbo 支 持的thrift協(xié)議是對(duì)thrift原生協(xié)議的擴(kuò)展,在原生協(xié)議的基礎(chǔ)上添加了 —些額外的頭信息,比如service name, magic number等

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容