国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

dubbo源碼解析——概要篇

Meathill / 1036人閱讀

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

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

總體概述


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

Invoker

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

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

它有2種類型的Invoker

1.本地執(zhí)行類的Invoker
   server端:比如有一個dubbo接口demoService.sayHello,在本項目中執(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,用戶代碼通過這個 proxy 調(diào)用其對應(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;
    }
}

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

Invoker繼承關(guān)系

Directory

概念
簡單來說,Directory就是裝載invoker的文件目錄

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

Router

概念
利用Router,可以從多個服務(wù)提者方中選擇一個進(jìn)行調(diào)用
分類
主要是3個實(shí)現(xiàn)類:
ConditionRouter(條件路由):條件路由主要就是根據(jù)dubbo管理控制臺配置的路由規(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),從多個服務(wù)提者方中選擇一個進(jìn)行調(diào)用

Protocol

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

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

消費(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)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/72101.html

相關(guān)文章

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

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

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

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

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

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

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

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

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

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

    BicycleWarrior 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<