(1)介紹dubbo原理仔蝌,暴露服務(wù)過程。
下圖是暴露服務(wù)流程:
首先dubbo暴露服務(wù)有兩種情況:
(1)延時(shí)暴露
(2)非延時(shí)暴露
下面說說非延時(shí)暴露:
dubbo在實(shí)例化完bean之后,在刷新容器最后一步發(fā)布ContextRefreshEvent事件的時(shí)候,通知實(shí)現(xiàn)了ApplicationListener的類執(zhí)行回調(diào)onApplicationEvent,該事件會(huì)調(diào)用ServiceConfig的export方法失球,此export就是服務(wù)暴露。總體來說dubbo的服務(wù)就在onApplicationEvent事件中發(fā)布
那么dubbo是如何在onApplicationEvent中發(fā)布服務(wù)的呢实苞?
暴露流程
(1)首先將服務(wù)封裝成invoker豺撑,換句話說invoker中封裝了服務(wù)的實(shí)現(xiàn)類。
(2)將invoker封裝成exporter并緩存起來黔牵,緩存中使用invoker的url作為key聪轿。
(3)服務(wù)端Server啟動(dòng)并監(jiān)聽窗口(當(dāng)請(qǐng)求過來時(shí),根據(jù)請(qǐng)求信息生成key猾浦,并去緩存中尋找相應(yīng)的invoker陆错,如果找到了invoker就完成了調(diào)用)。
export的步驟簡單介紹
(1)首先會(huì)檢查各種配置信息金赦,填充屬性危号。
(2)加載注冊(cè)中心
(3)根據(jù)配置的所有協(xié)議和注冊(cè)中心url分別進(jìn)行服務(wù)暴露(本地服務(wù)/遠(yuǎn)程服務(wù))
(3.1)首先要獲取invoker
(3.2)生成Exporter,并進(jìn)行緩存
此處所有協(xié)議和注冊(cè)中心的意思素邪,我的理解是:需要一個(gè)應(yīng)用層程序進(jìn)行進(jìn)程間通信,注冊(cè)中心是將生成好的Exporter推送到注冊(cè)中心猪半,即將服務(wù)提交至注冊(cè)中心
export方法中加載注冊(cè)中心的工作細(xì)節(jié)
(1)export方法會(huì)判斷是否是延遲暴露兔朦,如不是則立即執(zhí)行doExport方法。
(2)doExport方法中會(huì)執(zhí)行一系列的檢查方法磨确,然后調(diào)用doExportUrls方法沽甥。
(3)doExportUrls方法會(huì)首先調(diào)用loadRegistries獲取所有注冊(cè)中心url。
export方法中根據(jù)配置的協(xié)議進(jìn)行服務(wù)暴露的工作細(xì)節(jié)
(1)獲取所有注冊(cè)中心之后乏奥,會(huì)遍歷調(diào)用doExportUrldFor1Protocol方法摆舟,此方法根據(jù)不同的協(xié)議將服務(wù)轉(zhuǎn)換成url形式,一些參數(shù)配置參數(shù)會(huì)附在url后面邓了。
(2)根據(jù)scope的值進(jìn)行服務(wù)暴露(即暴露/遠(yuǎn)程暴露/本地暴露)恨诱。
export方法中將服務(wù)暴露為遠(yuǎn)程服務(wù)的工作細(xì)節(jié)
(1)利用動(dòng)態(tài)代理技術(shù),將服務(wù)接口生成代理骗炉。
(2)調(diào)用Protocol生成的適配類的export方法照宝,將服務(wù)接口代理交給export處理。
(3)export方法按照上述的工作流程句葵,完成對(duì)服務(wù)的暴露厕鹃。
個(gè)人理解:invoker的存在是生成代理類,這樣消費(fèi)者調(diào)用服務(wù)時(shí)候不會(huì)直接調(diào)用本地實(shí)例乍丈。而export的過程是標(biāo)準(zhǔn)化的一個(gè)過程剂碴,通過配置的協(xié)議將服務(wù)調(diào)用,服務(wù)信息標(biāo)準(zhǔn)化轻专。
sentinel進(jìn)行熔斷忆矛,限流的原理以及流程
首先搞清楚熔斷與限流的區(qū)別:
A->B->C 表示調(diào)用關(guān)系。
當(dāng)B->C的時(shí)候發(fā)生突發(fā)流量的訪問请垛,