成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

dubbo源碼解析——概要篇

Meathill / 1047人閱讀

摘要:服務(wù)提供者代碼上面這個(gè)類會(huì)被封裝成為一個(gè)實(shí)例,并新生成一個(gè)實(shí)例。這樣當(dāng)網(wǎng)絡(luò)通訊層收到一個(gè)請(qǐng)求后,會(huì)找到對(duì)應(yīng)的實(shí)例,并調(diào)用它所對(duì)應(yīng)的實(shí)例,從而真正調(diào)用了服務(wù)提供者的代碼。

這次源碼解析借鑒《肥朝》前輩的dubbo源碼解析,進(jìn)行源碼學(xué)習(xí)。總結(jié)起來就是先總體,后局部.也就是先把需要注意的概念先拋出來,把整體架構(gòu)圖先畫出來.讓讀者拿著"地圖"跟著我的腳步,并且每一步我都提醒,現(xiàn)在我們?cè)谀?我們下一步要做什么,這樣才不會(huì)迷失方向。

總體概述


首先是總體出發(fā)了解整體的架構(gòu),涉及到概念,在學(xué)習(xí)dubbo會(huì)更加理解透徹。
下面對(duì)上面這張圖做簡(jiǎn)要的分析:
(1)cluster是集群,主要是

Invoker

概念:
Invoker 是實(shí)體域,它是 Dubbo 的核心模型,其它模型都向它靠擾,或轉(zhuǎn)換成它,它代表一個(gè)可執(zhí)行體,可向它發(fā)起 invoke 調(diào)用,它有可能是一個(gè)本地的實(shí)現(xiàn),也可能是一個(gè)遠(yuǎn)程的實(shí)現(xiàn),也可能一個(gè)集群實(shí)現(xiàn)。它里面有一個(gè)很重要的方法 Result invoke(Invocation invocation)。

Invocation是會(huì)話域,它持有調(diào)用過程中的變量,比如方法名,參數(shù)等重要信息。

它有2種類型的Invoker

1.本地執(zhí)行類的Invoker
   server端:比如有一個(gè)dubbo接口demoService.sayHello,在本項(xiàng)目中執(zhí)行 demoService.sayHello,就通過InjvmExporter來進(jìn)行反射執(zhí)行demoService.sayHello就可以了。
   

2.遠(yuǎn)程通信類的Invoker

    client端:要執(zhí)行 demoService.sayHello,它封裝了DubboInvoker進(jìn)行遠(yuǎn)程通信,發(fā)送要執(zhí)行的接口給server端。
    server端:采用了AbstractProxyInvoker執(zhí)行了DemoServiceImpl.sayHello,然后將執(zhí)行結(jié)果返回發(fā)送給client.

按服務(wù)提供、服務(wù)消費(fèi)分類

引用官方文檔:分為服務(wù)提供 Invoker 和服務(wù)消費(fèi) Invoker 

為了更好的解釋上面這張圖,我們結(jié)合服務(wù)消費(fèi)和提供者的代碼示例來進(jìn)行說明:

服務(wù)消費(fèi)者代碼:

public class DemoClientAction {
 
    private DemoService demoService;
 
    public void setDemoService(DemoService demoService) {
        this.demoService = demoService;
    }
 
    public void start() {
        String hello = demoService.sayHello("world" + i);
    }
}

上面代碼中的 DemoService 就是上圖中服務(wù)消費(fèi)端的 proxy,用戶代碼通過這個(gè) proxy 調(diào)用其對(duì)應(yīng)的 Invoker [5],而該 Invoker 實(shí)現(xiàn)了真正的遠(yuǎn)程服務(wù)調(diào)用。

服務(wù)提供者代碼:

public class DemoServiceImpl implements DemoService {
 
    public String sayHello(String name) throws RemoteException {
        return "Hello " + name;
    }
}

上面這個(gè)類會(huì)被封裝成為一個(gè) AbstractProxyInvoker 實(shí)例,并新生成一個(gè) Exporter 實(shí)例。這樣當(dāng)網(wǎng)絡(luò)通訊層收到一個(gè)請(qǐng)求后,會(huì)找到對(duì)應(yīng)的 Exporter 實(shí)例,并調(diào)用它所對(duì)應(yīng)的 AbstractProxyInvoker 實(shí)例,從而真正調(diào)用了服務(wù)提供者的代碼。

Invoker繼承關(guān)系

Directory

概念
簡(jiǎn)單來說,Directory就是裝載invoker的文件目錄

兩個(gè)重要Directory
StaticDirectory:靜態(tài)目錄服務(wù),他的Invoker是固定的。
RegistryDirectory:注冊(cè)目錄服務(wù),他的Invoker集合數(shù)據(jù)來源于zk注冊(cè)中心的,他實(shí)現(xiàn)了NotifyListener接口,這個(gè)接口中的notify方法就是注冊(cè)中心的回調(diào),也就是它之所以能根據(jù)注冊(cè)中心動(dòng)態(tài)變化的根源所在.。
整個(gè)過程有一個(gè)重要的map變量,methodInvokerMap(它是數(shù)據(jù)的來源;同時(shí)也是notify的重要操作對(duì)象,重點(diǎn)是寫操作。)

Router

概念
利用Router,可以從多個(gè)服務(wù)提者方中選擇一個(gè)進(jìn)行調(diào)用
分類
主要是3個(gè)實(shí)現(xiàn)類:
ConditionRouter(條件路由):條件路由主要就是根據(jù)dubbo管理控制臺(tái)配置的路由規(guī)則來過濾相關(guān)的invoker
MockInvokersSelector:主要根據(jù)參數(shù),判斷是否需要篩選出正常的(非mock的)invoker 或者 mock的invoker
ScriptRouter(腳本路由):待補(bǔ)充

例子
參考:org.apache.dubbo.rpc.cluster.router.script.ScriptRouterTest

LoadBalance

概念
與Router功能類似,利用負(fù)載均衡策略(random,roundrobin,leastactive),從多個(gè)服務(wù)提者方中選擇一個(gè)進(jìn)行調(diào)用

Protocol

概念
Protocol 是服務(wù)域,它是 Invoker 暴露和引用的主功能入口,它負(fù)責(zé) Invoker 的生命周期管理。

再接下來給大家一張"地圖","地圖"上我已經(jīng)標(biāo)記了序號(hào),再下面的源碼分析中,我也會(huì)實(shí)時(shí)提醒我們所在的位置,以至于不會(huì)迷失方向.

消費(fèi)方調(diào)用過程中,dubbo究竟做了什么?
a、在Directory中找出本次集群中的全部invokers
b、在Router中,將上一步的全部invokers挑選出滿足條件的invokers
c、在LoadBalance中,將上一步的能正常的執(zhí)行invokers中,根據(jù)配置的負(fù)載均衡策略,挑選出需要執(zhí)行的invoker

后面開始,就是正式的源碼閱讀(環(huán)境搭建這些略過)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/72101.html

相關(guān)文章

  • dubbo源碼解析——消費(fèi)過程

    摘要:上一篇源碼解析概要篇中我們了解到中的一些概念及消費(fèi)端總體調(diào)用過程。由于在生成代理實(shí)例的時(shí)候,在構(gòu)造函數(shù)中賦值了,因此可以只用該進(jìn)行方法的調(diào)用。 上一篇 dubbo源碼解析——概要篇中我們了解到dubbo中的一些概念及消費(fèi)端總體調(diào)用過程。本文中,將進(jìn)入消費(fèi)端源碼解析(具體邏輯會(huì)放到代碼的注釋中)。本文先是對(duì)消費(fèi)過程的總體代碼邏輯理一遍,個(gè)別需要細(xì)講的點(diǎn),后面會(huì)專門的文章進(jìn)行解析。...

    darkbug 評(píng)論0 收藏0
  • dubbo擴(kuò)展點(diǎn)的IOC

    摘要:屬性上篇文章中,提到在獲取擴(kuò)展點(diǎn)接口對(duì)應(yīng)的的時(shí)候,會(huì)執(zhí)行私有構(gòu)造函數(shù)。因?yàn)榇藭r(shí)是,即當(dāng)為時(shí),即我們可以看出,所有非擴(kuò)展點(diǎn)接口都會(huì)執(zhí)行對(duì)應(yīng)的實(shí)例的方法返回一個(gè)實(shí)例,即對(duì)象。 spring是如何獲得容器中管理的類的 拿到applicationContext,就可以調(diào)用getBean方法來獲得Spring的bean對(duì)象了 public class SpringContextUtil impl...

    Zoom 評(píng)論0 收藏0
  • dubbo源碼解析(二)Dubbo擴(kuò)展機(jī)制SPI

    摘要:二注解該注解為了保證在內(nèi)部調(diào)用具體實(shí)現(xiàn)的時(shí)候不是硬編碼來指定引用哪個(gè)實(shí)現(xiàn),也就是為了適配一個(gè)接口的多種實(shí)現(xiàn),這樣做符合模塊接口設(shè)計(jì)的可插拔原則,也增加了整個(gè)框架的靈活性,該注解也實(shí)現(xiàn)了擴(kuò)展點(diǎn)自動(dòng)裝配的特性。 Dubbo擴(kuò)展機(jī)制SPI 前一篇文章《dubbo源碼解析(一)Hello,Dubbo》是對(duì)dubbo整個(gè)項(xiàng)目大體的介紹,而從這篇文章開始,我將會(huì)從源碼來解讀dubbo再各個(gè)模塊的實(shí)...

    DirtyMind 評(píng)論0 收藏0
  • dubbo源碼解析(四十七)服務(wù)端處理請(qǐng)求過程

    摘要:而存在的意義就是保證請(qǐng)求或響應(yīng)對(duì)象可在線程池中被解碼,解碼完成后,就會(huì)分發(fā)到的。 2.7大揭秘——服務(wù)端處理請(qǐng)求過程 目標(biāo):從源碼的角度分析服務(wù)端接收到請(qǐng)求后的一系列操作,最終把客戶端需要的值返回。 前言 上一篇講到了消費(fèi)端發(fā)送請(qǐng)求的過程,該篇就要將服務(wù)端處理請(qǐng)求的過程。也就是當(dāng)服務(wù)端收到請(qǐng)求數(shù)據(jù)包后的一系列處理以及如何返回最終結(jié)果。我們也知道消費(fèi)端在發(fā)送請(qǐng)求的時(shí)候已經(jīng)做了編碼,所以我...

    yzzz 評(píng)論0 收藏0
  • 【推薦】最新200:技術(shù)文章整理

    摘要:作為面試官,我是如何甄別應(yīng)聘者的包裝程度語言和等其他語言的對(duì)比分析和主從復(fù)制的原理詳解和持久化的原理是什么面試中經(jīng)常被問到的持久化與恢復(fù)實(shí)現(xiàn)故障恢復(fù)自動(dòng)化詳解哨兵技術(shù)查漏補(bǔ)缺最易錯(cuò)過的技術(shù)要點(diǎn)大掃盲意外宕機(jī)不難解決,但你真的懂?dāng)?shù)據(jù)恢復(fù)嗎每秒 作為面試官,我是如何甄別應(yīng)聘者的包裝程度Go語言和Java、python等其他語言的對(duì)比分析 Redis和MySQL Redis:主從復(fù)制的原理詳...

    BicycleWarrior 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<