Dubbo原理和面试问题
今天來說一說dubbo的原理,首先我們要知道dubbo到底是什么,都能提供些什么服務(wù)?
一、dubbo是什么?
dubbo是?個分布式服務(wù)框架,提供?性能和透明化的RPC遠(yuǎn)程服務(wù)調(diào)??案,以及SOA服務(wù)治理方案。說白了其實(shí)dubbo就是一個遠(yuǎn)程調(diào)用的分布式框架。
二、dubbo的核心服務(wù)是什么?
1.遠(yuǎn)程通訊: 提供對多種基于長連接的NIO框架抽象封裝,包括多種線程模型,序列化,以及“請求-響應(yīng)”模式的信息交換方式。
2.集群容錯: 提供基于接口方法的透明遠(yuǎn)程過程調(diào)用,包括多協(xié)議支持,以及軟負(fù)載均衡,失敗容錯,地址路由,動態(tài)配置等集群支持。
3.自動發(fā)現(xiàn): 基于注冊中心目錄服務(wù),使服務(wù)消費(fèi)方能動態(tài)的查找服務(wù)提供方,使地址透明,使服務(wù)提供方可以平滑增加或減少機(jī)器。
三、dubbo能做什么?
采用spring的配置方式進(jìn)行配置,完全透明化的接入應(yīng)用,對應(yīng)用沒有任何入侵,只需要spring加載dubbo的配置就可以了。
四、dubbo架構(gòu)圖
我們解釋以下這個架構(gòu)圖:
Consumer服務(wù)消費(fèi)者,Provider服務(wù)提供者。Container服務(wù)容器。消費(fèi)當(dāng)然是invoke提供者了,invoke這條實(shí)線按照圖上的說明當(dāng)然同步的意思了。但是在實(shí)際調(diào)用過程中,Provider的位置對于Consumer來說是透明的,上一次調(diào)用服務(wù)的位置(IP地址)和下一次調(diào)用服務(wù)的位置,是不確定的。這個地方就需要使用注冊中心來實(shí)現(xiàn)軟負(fù)載。
Register
服務(wù)提供者先啟動start,然后注冊register服務(wù)。消費(fèi)訂閱subscribe服務(wù),如果沒有訂閱到自己想獲得的服務(wù),它會不斷的嘗試訂閱。新的服務(wù)注冊到注冊中心以后,注冊中心會將這些服務(wù)通過notify到消費(fèi)者。
Monitor
這是一個監(jiān)控,圖中虛線表明Consumer 和Provider通過異步的方式發(fā)送消息至Monitor,Consumer和Provider會將信息存放在本地磁盤,平均1min會發(fā)送一次信息。Monitor在整個架構(gòu)中是可選的(圖中的虛線并不是可選的意思),Monitor功能需要單獨(dú)配置,不配置或者配置以后,Monitor掛掉并不會影響服務(wù)的調(diào)用。
五、本地暴露與遠(yuǎn)程暴露的區(qū)別
本地暴露是暴露在本機(jī)JVM中,調(diào)用本地服務(wù)不需要網(wǎng)絡(luò)通信。
遠(yuǎn)程暴露是將ip,端口等信息暴露給遠(yuǎn)程客戶端,調(diào)用遠(yuǎn)程服務(wù)時需要網(wǎng)絡(luò)通信。
六、什么情況下適用dubbo協(xié)議,什么時候適用rmi協(xié)議?
Dubbo支持dubbo、rmi、hessian、http、webservice、thrift、redis等多種協(xié)議,但是dubbo協(xié)議是官網(wǎng)推薦使用的,dubbo 缺省協(xié)議是dubbo協(xié)議,采用單一長連接和 NIO 異步通訊,適合于小數(shù)據(jù)量大并發(fā)的服務(wù)調(diào)用,以及服務(wù)消費(fèi)者機(jī)器數(shù)遠(yuǎn)大于服務(wù)提供者機(jī)器數(shù)的情況。反之,Dubbo 缺省協(xié)議不適合傳送大數(shù)據(jù)量的服務(wù),比如傳文件,傳視頻等,除非請求量很低。RMI協(xié)議采用阻塞式(同步)短連接和 JDK 標(biāo)準(zhǔn)序列化方式。適用范圍:傳入傳出參數(shù)數(shù)據(jù)包大小混合,消費(fèi)者與提供者個數(shù)差不多,可傳文件。后面會對其他幾種協(xié)議詳細(xì)介紹,這里就不贅述了。
七、Dubbo主要的配置項(xiàng)有哪些,作用是什么?
provider配置
<!-- 提供方應(yīng)用信息,用于計(jì)算依賴關(guān)系 --><dubbo:application name="hello-world-app" /><!-- 使用multicast廣播注冊中心暴露服務(wù)地址 --><dubbo:registry address="multicast://224.5.6.7:1234" /><!-- 用dubbo協(xié)議在20880端口暴露服務(wù) --><dubbo:protocol name="dubbo" port="20880" /><!-- 聲明需要暴露的服務(wù)接口 --><dubbo:service interface="com.alibaba.dubbo.demo.DemoService" ref="demoService" />consumer配置
<!-- 消費(fèi)方應(yīng)用名,用于計(jì)算依賴關(guān)系,不是匹配條件,不要與提供方一樣 --><dubbo:application name="consumer-of-helloworld-app" /><!-- 使用multicast廣播注冊中心暴露發(fā)現(xiàn)服務(wù)地址 --><dubbo:registry address="multicast://224.5.6.7:1234" /><!-- 生成遠(yuǎn)程服務(wù)代理,可以和本地bean一樣使用demoService --><dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />八、Dubbo有幾種容錯機(jī)制
什么是容錯機(jī)制?容錯機(jī)制指的是某中系統(tǒng)控制在一定范圍的一種允許或包容犯錯情況的發(fā)生,舉個簡單的例子,我們在電腦上運(yùn)行一個程序,有時候會出現(xiàn)無響應(yīng)的情況,然后系統(tǒng)回彈出一個提示框讓我們選擇,是立即結(jié)束還是繼續(xù)等待,然后根據(jù)我們的選擇執(zhí)行對應(yīng)的操作,這就是“容錯”。
在分布式架構(gòu)下,網(wǎng)絡(luò),硬件,應(yīng)用都可以發(fā)生故障,由于各個服務(wù)之間可能存在依賴關(guān)系,如果一條鏈路中的某一個節(jié)點(diǎn)出現(xiàn)故障,將會導(dǎo)致雪崩效應(yīng)。為了減少某一個節(jié)點(diǎn)故障的影響范圍,所以我們才需要去構(gòu)建容錯服務(wù),來優(yōu)雅的處理這種中斷的響應(yīng)結(jié)果
1.failsafe 失敗安全,可以認(rèn)為是把錯誤吞掉(記錄日志)
2.failover(默認(rèn)) 重試其他服務(wù)器;retries(2)重試的次數(shù),默認(rèn)為2次
3.failback 失敗后自動恢復(fù)
4.forking forks. 設(shè)置并行數(shù)
5.Broadcast 廣播,任意一臺報錯,則執(zhí)行的方法報錯,通過cluster方式,配置制定的容錯方案
九、dubbo的服務(wù)降級
降級的目的是為了保證核心服務(wù)可用
降級可以有幾個層面的分類:自動降級,人工降級;按照功能可以分為:讀服務(wù)降級和寫服務(wù)降級;
1.對一些非核心服務(wù)進(jìn)行人工降級,在大促之前通過降級開關(guān)關(guān)閉那些推薦內(nèi)容,評價等對主流程序沒有影響的功能
2.故障降級,比如調(diào)用的遠(yuǎn)程服務(wù)掛了,網(wǎng)絡(luò)故障,或者RPC服務(wù)返回異常。那么可以直接降級,降級的方案比如設(shè)置默認(rèn)值,采用兜底數(shù)據(jù)(系統(tǒng)推薦的行為廣告掛了,可以提前準(zhǔn)備靜態(tài)頁面做返回)等等
3.限流降級,在秒殺這種流量比較集中并且流量特別大的情況下,因?yàn)橥话l(fā)訪問量特別大可能導(dǎo)致系統(tǒng)支撐不了。這個時候可以采用限流來限制訪問量。當(dāng)達(dá)到閾值時,后續(xù)的請求被降級,比如進(jìn)入排隊(duì)頁面,比如跳轉(zhuǎn)到錯誤頁面(活動火爆,請稍后重試)
Dubbo的降級方式:Mock
實(shí)現(xiàn)步驟
1.在client端創(chuàng)建一個testmock類,實(shí)現(xiàn)對應(yīng)的IGphello的接口(需要對哪個接口進(jìn)行mock,就實(shí)現(xiàn)哪個)名稱必須以mock結(jié)尾
2.在client端的xml配置文件中,添加如下配置,增加一個mock屬性指向創(chuàng)建的testmock
3.模擬錯誤(設(shè)置timeout)模擬超時異常,運(yùn)行測試代碼即可訪問到testmock這個類,當(dāng)服務(wù)端故障解除以后,調(diào)用過程將恢復(fù)正常
十、dubbo的優(yōu)先級配置
配置優(yōu)先級別
1.以timeout為例,顯示了配置的查找順序,其他retries,loadbalance等類似。
(1)方法級優(yōu)先,接口級次之,全局配置在次之
(2)如果級別一樣,則消費(fèi)方優(yōu)先,提供方次之
(3)其中,服務(wù)提供方配置,通過URL經(jīng)由注冊中心傳遞給消費(fèi)方
2.建議由服務(wù)提供方設(shè)置超時,因?yàn)橐粋€方法需要執(zhí)行多長時間,服務(wù)提供方更清楚,如果一個消費(fèi)方同時引用多個服務(wù),就不需要關(guān)心每個服務(wù)的超時設(shè)置。
總結(jié)
以上是生活随笔為你收集整理的Dubbo原理和面试问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java马士兵笔记_马士兵java教程笔
- 下一篇: 服务器开机显示0x000000ca,使用