dubbo源碼分析(一) 服務(wù)暴露--服務(wù)引用

又到了面試的時(shí)間 為了應(yīng)付面試 得準(zhǔn)備些干貨

provider示例

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans  
        http://www.springframework.org/schema/beans/spring-beans.xsd  
        http://code.alibabatech.com/schema/dubbo  
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd  
        ">

    <!-- 用dubbo協(xié)議在20880端口暴露服務(wù) -->
    <dubbo:protocol name="dubbo" port="20952"/>

    <!-- 聲明需要暴露的服務(wù)接口 -->
    <dubbo:service interface="com.***.workorder.facade.exports.ApplyTaskFacade" ref="applyTaskFacadeImpl" version="1.0.0" delay="-1"/>
    <dubbo:service interface="com.***.workorder.facade.exports.TaskFacade" ref="taskFacadeImpl" version="1.0.0" delay="-1"/>
</beans> 

以上是基本的provider配置

dubbo無(wú)縫接入了spring 我們看看是如何實(shí)現(xiàn)的

從上面的配置文件看到dubbo使用了自定義標(biāo)簽 那么肯定實(shí)現(xiàn)了NamespaceHandlerSupport用于解析自己的標(biāo)簽
可以找到NamespaceHandlerSupport的實(shí)現(xiàn)DubboNamespaceHandler

通過(guò)META-INF/spring.handlers注冊(cè)當(dāng)前handler,這是spring的拓展機(jī)制
這里不多說(shuō)

DubboNamespaceHandler

這里DubboNamespaceHandler將解析工作委托給了DubboBeanDefinitionParser 這里不過(guò)多敘述

DubboBeanDefinitionParser 可以看到dubbo對(duì)于各個(gè)自定義標(biāo)簽解析所用到的類 這里做個(gè)整理

標(biāo)簽 解析類 作用
application ApplicationConfig 應(yīng)用配置音半,用于配置當(dāng)前應(yīng)用信息蜜徽,不管該應(yīng)用是提供者還是消費(fèi)者伐蒂。
module ModuleConfig 模塊配置驶悟,用于配置當(dāng)前模塊信息械媒,可選。
registry RegistryConfig 注冊(cè)中心配置词爬,用于配置連接注冊(cè)中心相關(guān)信息镐躲。
monitor MonitorConfig 監(jiān)控中心配置,用于配置連接監(jiān)控中心相關(guān)信息岖常,可選驯镊。
provider ProviderConfig 提供方的缺省值,當(dāng)ProtocolConfig和ServiceConfig某屬性沒(méi)有配置時(shí),采用此缺省值板惑,可選橄镜。
consumer ConsumerConfig 消費(fèi)方缺省配置,當(dāng)ReferenceConfig某屬性沒(méi)有配置時(shí)冯乘,采用此缺省值洽胶,可選。
protocol ProtocolConfig 協(xié)議配置裆馒,用于配置提供服務(wù)的協(xié)議信息姊氓,協(xié)議由提供方指定,消費(fèi)方被動(dòng)接受喷好。
service ServiceBean 服務(wù)配置翔横,用于暴露一個(gè)服務(wù),定義服務(wù)的元信息梗搅,一個(gè)服務(wù)可以用多個(gè)協(xié)議暴露禾唁,一個(gè)服務(wù)也可以注冊(cè)到多個(gè)注冊(cè)中心。
reference ReferenceBean 引用配置无切,用于創(chuàng)建一個(gè)遠(yuǎn)程服務(wù)代理荡短,一個(gè)引用可以指向多個(gè)注冊(cè)中心。
annotation AnnotationBean 注解識(shí)別處理器

這里具體的標(biāo)簽屬性解析過(guò)程暫不分析 有興趣可以自己查看原發(fā)
DubboBeanDefinitionParser完成了對(duì)xml配置的解析 并裝載至spring容器的過(guò)程

本人對(duì)spring的解析機(jī)制不是很了解,不過(guò)通過(guò)DubboBeanDefinitionParser可以看出,最終spring容器加載到的是一個(gè)BeanDefinition,可以理解spring中對(duì)對(duì)象的抽象實(shí)現(xiàn)

當(dāng)provider對(duì)象解析 裝載完成理所當(dāng)然是根據(jù)配置生成服務(wù)
我們看ServiceBean代碼的實(shí)現(xiàn)

public class ServiceBean<T> extends ServiceConfig<T> implements 
InitializingBean, DisposableBean, ApplicationContextAware, ApplicationListener, BeanNameAware 

服務(wù)暴露

service服務(wù)暴露過(guò)程

可以看到最終調(diào)用到Protocol對(duì)象的export()方法暴露服務(wù).
到這里就完成了流程上的服務(wù)暴露.具體暴露細(xì)節(jié)由各個(gè)協(xié)議自己實(shí)現(xiàn).

服務(wù)引用

服務(wù)引用過(guò)程

通過(guò)Protocol的refer()拿到了一個(gè)Invoker對(duì)象,再通過(guò)動(dòng)態(tài)代理生成接口的代理對(duì)象,實(shí)現(xiàn)rpc通信

總結(jié): 通過(guò)Protocol接口的exporter()和refer()接口,完成流程上的服務(wù)暴露和服務(wù)引用

dubbo調(diào)用過(guò)程

dubbo-protocol層介紹

Protocol接口在dubbo屬于Protocol層.Protocol層中主要有Exporter,Invoker,Protocol三大對(duì)象

  • Exporter: 暴露器,可通過(guò)其獲得Invoker對(duì)象
  • Invoker:(通訊)執(zhí)行器,實(shí)現(xiàn)與遠(yuǎn)端的通信
  • Protocol: 抽象協(xié)議,暴露服務(wù)和引用服務(wù)

Protocol層是dubbo的核心層,只要有Protocol + Invoker + Exporter就可以完成非透明的RPC調(diào)用.

來(lái)看Protocol,Exporter,Invoker接口定義

@SPI("dubbo")
public interface Protocol {
    
    /**
     * 獲取缺省端口哆键,當(dāng)用戶沒(méi)有配置端口時(shí)使用掘托。
     * 
     * @return 缺省端口
     */
    int getDefaultPort();

    /**
     * 暴露遠(yuǎn)程服務(wù):<br>
     * 1. 協(xié)議在接收請(qǐng)求時(shí),應(yīng)記錄請(qǐng)求來(lái)源方地址信息:RpcContext.getContext().setRemoteAddress();<br>
     * 2. export()必須是冪等的洼哎,也就是暴露同一個(gè)URL的Invoker兩次烫映,和暴露一次沒(méi)有區(qū)別。<br>
     * 3. export()傳入的Invoker由框架實(shí)現(xiàn)并傳入噩峦,協(xié)議不需要關(guān)心锭沟。<br>
     * 
     * @param <T> 服務(wù)的類型
     * @param invoker 服務(wù)的執(zhí)行體
     * @return exporter 暴露服務(wù)的引用,用于取消暴露
     * @throws RpcException 當(dāng)暴露服務(wù)出錯(cuò)時(shí)拋出识补,比如端口已占用
     */
    @Adaptive
    <T> Exporter<T> export(Invoker<T> invoker) throws RpcException;

    /**
     * 引用遠(yuǎn)程服務(wù):<br>
     * 1. 當(dāng)用戶調(diào)用refer()所返回的Invoker對(duì)象的invoke()方法時(shí)族淮,協(xié)議需相應(yīng)執(zhí)行同URL遠(yuǎn)端export()傳入的Invoker對(duì)象的invoke()方法。<br>
     * 2. refer()返回的Invoker由協(xié)議實(shí)現(xiàn)凭涂,協(xié)議通常需要在此Invoker中發(fā)送遠(yuǎn)程請(qǐng)求祝辣。<br>
     * 3. 當(dāng)url中有設(shè)置check=false時(shí),連接失敗不能拋出異常切油,并內(nèi)部自動(dòng)恢復(fù)蝙斜。<br>
     * 
     * @param <T> 服務(wù)的類型
     * @param type 服務(wù)的類型
     * @param url 遠(yuǎn)程服務(wù)的URL地址
     * @return invoker 服務(wù)的本地代理
     * @throws RpcException 當(dāng)連接服務(wù)提供方失敗時(shí)拋出
     */
    @Adaptive
    <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException;

    /**
     * 釋放協(xié)議:<br>
     * 1. 取消該協(xié)議所有已經(jīng)暴露和引用的服務(wù)。<br>
     * 2. 釋放協(xié)議所占用的所有資源澎胡,比如連接和端口孕荠。<br>
     * 3. 協(xié)議在釋放后娩鹉,依然能暴露和引用新的服務(wù)。<br>
     */
    void destroy();
}

public interface Exporter<T> {
    Invoker<T> getInvoker();
    
    void unexport();
}

**
 * Invoker. (API/SPI, Prototype, ThreadSafe)
 * 分三種:
 * 1.AbstractInvoker      通過(guò)網(wǎng)絡(luò)調(diào)用遠(yuǎn)程服務(wù) (客戶端用)
 * 2.AbstractProxyInvoker 調(diào)用本地實(shí)現(xiàn) (服務(wù)端用)
 * 3.ClusterInvoker       提供集群服務(wù) (客戶端用)
 */
public interface Invoker<T> extends Node {


    Class<T> getInterface();

    Result invoke(Invocation invocation) throws RpcException;

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末稚伍,一起剝皮案震驚了整個(gè)濱河市弯予,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌个曙,老刑警劉巖锈嫩,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異垦搬,居然都是意外死亡呼寸,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)悼沿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)等舔,“玉大人,你說(shuō)我怎么就攤上這事糟趾』胖玻” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵义郑,是天一觀的道長(zhǎng)蝶柿。 經(jīng)常有香客問(wèn)我,道長(zhǎng)非驮,這世上最難降的妖魔是什么交汤? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮劫笙,結(jié)果婚禮上芙扎,老公的妹妹穿的比我還像新娘。我一直安慰自己填大,他們只是感情好戒洼,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著允华,像睡著了一般圈浇。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上靴寂,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天磷蜀,我揣著相機(jī)與錄音,去河邊找鬼百炬。 笑死褐隆,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的剖踊。 我是一名探鬼主播妓灌,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼轨蛤,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼蜜宪!你這毒婦竟也來(lái)了虫埂?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤圃验,失蹤者是張志新(化名)和其女友劉穎掉伏,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體澳窑,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡斧散,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了摊聋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸡捐。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖麻裁,靈堂內(nèi)的尸體忽然破棺而出箍镜,到底是詐尸還是另有隱情,我是刑警寧澤煎源,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布色迂,位于F島的核電站,受9級(jí)特大地震影響手销,放射性物質(zhì)發(fā)生泄漏歇僧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一锋拖、第九天 我趴在偏房一處隱蔽的房頂上張望诈悍。 院中可真熱鬧兽埃,春花似錦侥钳、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至鄙陡,卻和暖如春冕房,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背趁矾。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工耙册, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人毫捣。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓详拙,卻偏偏與公主長(zhǎng)得像帝际,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子饶辙,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容

  • dubbo暴露服務(wù)有兩種情況蹲诀,一種是設(shè)置了延遲暴露(比如delay="5000"),另外一種是沒(méi)有設(shè)置延遲暴露或者...
    加大裝益達(dá)閱讀 21,279評(píng)論 5 36
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理弃揽,服務(wù)發(fā)現(xiàn)脯爪,斷路器,智...
    卡卡羅2017閱讀 134,699評(píng)論 18 139
  • 過(guò)去的每一年情人節(jié)或光棍節(jié)里,在QQ涌矢,微信上到處都是單身狗在飛掖举。作為一個(gè)似乎從出生到現(xiàn)在每年從不錯(cuò)過(guò)這個(gè)節(jié)日的我,...
    3b843a555cb1閱讀 312評(píng)論 0 0
  • R·閱讀原文片段 批評(píng)你的人通常最想得到的是你傾聽(tīng)他的意見(jiàn)和想法娜庇,并認(rèn)真地對(duì)待塔次。如果你不愿聽(tīng)對(duì)方的批評(píng),問(wèn)題就會(huì)積...
    胡妍穎閱讀 193評(píng)論 1 0
  • 我走了許多路 看過(guò)許多風(fēng)景 才發(fā)現(xiàn)你是我人生當(dāng)中最美的風(fēng)景
    詩(shī)的畫(huà)意閱讀 305評(píng)論 0 0