最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java開發(fā)分布式服務(wù)框架Dubbo暴露服務(wù)過程詳解

 更新時(shí)間:2021年11月15日 15:57:34   作者:又蠢又笨的懶羊羊程序猿  
這篇文章主要為大家介紹了java開發(fā)分布式服務(wù)框架Dubbo暴露服務(wù)的過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步

Dubbo服務(wù)暴露機(jī)制

前言

在進(jìn)行服務(wù)暴露機(jī)制的分析之前,必須談?wù)勈裁词?code>URL,在Dubbo服務(wù)暴露過程中URL是無處不在的,貫穿了整個(gè)過程。

一般情況下,URL指的是統(tǒng)一資源定位符,標(biāo)準(zhǔn)格式如下:

protocol://host:port/path?key1=value1&key2=value2

Dubbo就是用這種URL的方式來作為約定的參數(shù)類型,服務(wù)之間也是用URL來進(jìn)行交互。

Dubbo用URL作為配置總線,貫穿整個(gè)源碼體系。

URL的具體參數(shù)如下:

protocol:dubbo中的各種協(xié)議,如:dubbo、http、thrift

host/port:主機(jī)/端口號(hào)

path:接口名稱

parameters:參數(shù)鍵值對(duì)

服務(wù)暴露流程

大體流程分為三個(gè)步驟:

檢測配置,有些配置為空值會(huì)有默認(rèn)值自動(dòng)填充并自動(dòng)組裝為URL暴露服務(wù),包括暴露到本地和遠(yuǎn)程的服務(wù)注冊為服務(wù)到服務(wù)注冊中心

源碼解析

先來到ServiceBean

在這里插入圖片描述

可以看到這個(gè)類實(shí)現(xiàn)了ApplicationListener<ContextRefreshedEvent>,這樣就會(huì)在Spring IOC容器刷新之后調(diào)用onApplicationEvent方法,這個(gè)方法中做的就是服務(wù)暴露。

在這里插入圖片描述

if判斷條件中,我們可以看到如果配置中沒有設(shè)置延遲暴露、并且沒有暴露過、并且支持暴露的情況下就會(huì)執(zhí)行this.export(),最終會(huì)調(diào)用父類ServiceConfig中的export方法。

請(qǐng)?zhí)砑訄D片描述

上述方法中主要就是進(jìn)行配置檢查,然后進(jìn)入this.doExport()進(jìn)行服務(wù)暴露,這個(gè)方法前面的部分都是一些配置檢查,重點(diǎn)放在最后的this.doExportUrls()。

請(qǐng)?zhí)砑訄D片描述

從上述源碼中可以看到Dubbo是支持多注冊中心的,并且支持多種協(xié)議,一個(gè)服務(wù)如果有多個(gè)協(xié)議那么都需要暴露。this.loadRegistries()是根據(jù)配置組裝成注冊中心相關(guān)的URL,如下:

registry://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?application=user-service-provider-one&dubbo=2.6.2&pid=29056&registry=zookeeper&timestamp=1632309180780

接下來進(jìn)入this.doExportUrlsFor1Protocol(),

在這里插入圖片描述

構(gòu)建完成之后的URL如下圖所示:

請(qǐng)?zhí)砑訄D片描述

使用的是dubbo協(xié)議,接下來要做的就是根據(jù)URL來進(jìn)行服務(wù)暴露

在這里插入圖片描述

本地暴露

進(jìn)入exportLocal()看一下,這個(gè)方法做的事就是進(jìn)行本地暴露,使用的是injvm協(xié)議,這個(gè)方法中對(duì)URL進(jìn)行修改,將協(xié)議改為injvm。

在這里插入圖片描述

此處的protocol.export()是標(biāo)注了@Adaptive注解的,設(shè)計(jì)自適應(yīng)拓展,調(diào)用該方法之后會(huì)生成代理類,代理類通過URL中的參數(shù)得知所使用的協(xié)議,然后通過Dubbo SPI機(jī)制實(shí)現(xiàn)拓展,選擇對(duì)應(yīng)的實(shí)現(xiàn)類進(jìn)行export()方法,此處的方法會(huì)選擇InjvmProtocol中的export()進(jìn)行暴露。

在這里插入圖片描述

在這里插入圖片描述

經(jīng)過轉(zhuǎn)化后得到的export如下所示:

在這里插入圖片描述

如圖所示,具體實(shí)現(xiàn)類被層層包裝。

為什么要封裝成invoker呢?

封裝成invoker是為了屏蔽調(diào)用的細(xì)節(jié),統(tǒng)一暴露出一個(gè)可執(zhí)行體,使得調(diào)用者調(diào)用時(shí)變得便捷簡易。

為什么要使用本地暴露呢?

因?yàn)榭赡艽嬖诒镜夭煌?wù)之間相互調(diào)用的情況,因此本地暴露后,內(nèi)部可以直接進(jìn)行調(diào)用,而省去了不必要的網(wǎng)絡(luò)通信。

此處引用一下博主敖丙的文章中的本地暴露流程圖:

在這里插入圖片描述

遠(yuǎn)程暴露

此時(shí)本地暴露已經(jīng)完成了,現(xiàn)在開始遠(yuǎn)程暴露。

在這里插入圖片描述

流程與本地暴露相似,都需要先封裝為invoker然后再進(jìn)一步生成exporter,以下是registryURL.addParameterAndEncoded()方法將URL進(jìn)行拼接后的結(jié)果:

在這里插入圖片描述

可以看到先是走registry協(xié)議,然后參數(shù)中有一個(gè)export=dubbo://,此時(shí)會(huì)走dubbo協(xié)議,所以我們得知SPI會(huì)先通過registry協(xié)議找到RegistryPotocol然后執(zhí)行export(),然后再執(zhí)行DubboPotocol中的export()。

現(xiàn)在我們進(jìn)入RegistryPotocol中的export()方法。

在這里插入圖片描述

上述操作主要是講export轉(zhuǎn)化為exporter,獲取注冊中心的相關(guān)配置,如果需要注冊則向注冊中心進(jìn)行注冊,并且在ProviderConsumerRegTable中記錄服務(wù)提供者信息,進(jìn)入源碼中,我們發(fā)現(xiàn)實(shí)質(zhì)就是往一個(gè)ConcurrentHashMap中塞入invoker,key是服務(wù)接口全類名,value是一個(gè)set,set中存儲(chǔ)包裝過的invoker。

在這里插入圖片描述

然后進(jìn)入 doLocalExport 方法內(nèi)部

在這里插入圖片描述

箭頭指向的方法最終會(huì)調(diào)用DubboProtocol中的export()

在這里插入圖片描述

在這里插入圖片描述

需要?jiǎng)?chuàng)建server

在這里插入圖片描述

上述代碼中,主要就是根據(jù)URL創(chuàng)建出key,然后將key和invoker存入exporterMap中關(guān)聯(lián)起來,如果是初次服務(wù)暴露則需要?jiǎng)?chuàng)建監(jiān)聽服務(wù)器,默認(rèn)是NettyServer,并且初始化各種Handler,比如心跳檢測,解碼等。

至此服務(wù)暴露流程結(jié)束。

在這里插入圖片描述

此處引用博主敖丙的文章中的本地暴露流程圖:

在這里插入圖片描述

如果不足或錯(cuò)誤歡迎評(píng)論指正。

以上就是java開發(fā)分布式服務(wù)框架Dubbo暴露服務(wù)過程詳解的詳細(xì)內(nèi)容,更多關(guān)于Dubbo暴露服務(wù)過程詳解的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • MybatisPlus IService接口功能介紹

    MybatisPlus IService接口功能介紹

    MybatisPlus中的IService接口為開發(fā)者提供了一系列基礎(chǔ)數(shù)據(jù)庫操作方法,如增刪改查等,通過泛型支持不同類型的實(shí)體和主鍵,IService的默認(rèn)實(shí)現(xiàn)類為ServiceImpl,它實(shí)現(xiàn)了接口中的基本方法,用戶可通過繼承ServiceImpl來擴(kuò)展自定義的業(yè)務(wù)邏輯
    2024-09-09
  • Mybatis Plus 自定義方法實(shí)現(xiàn)分頁功能的示例代碼

    Mybatis Plus 自定義方法實(shí)現(xiàn)分頁功能的示例代碼

    這篇文章主要介紹了Mybatis Plus 自定義方法實(shí)現(xiàn)分頁功能的示例代碼,代碼簡單易懂,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-08-08
  • Java日期時(shí)間類(Date、DateFormat、Calendar)解析

    Java日期時(shí)間類(Date、DateFormat、Calendar)解析

    這篇文章主要介紹了Java日期時(shí)間類(Date、DateFormat、Calendar)解析,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-06-06
  • SpringBoot常見問題小結(jié)

    SpringBoot常見問題小結(jié)

    這篇文章主要介紹了SpringBoot常見問題小結(jié),需要的朋友可以參考下
    2017-07-07
  • SpringMVC的工程搭建步驟實(shí)現(xiàn)

    SpringMVC的工程搭建步驟實(shí)現(xiàn)

    這篇文章主要介紹了SpringMVC的工程搭建步驟實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Spring Boot 項(xiàng)目搭建教程及注解

    Spring Boot 項(xiàng)目搭建教程及注解

    下面小編就為大家?guī)硪黄猄pring Boot 項(xiàng)目搭建教程及注解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-09-09
  • mybatis打印的sql日志不寫入到log文件的問題及解決

    mybatis打印的sql日志不寫入到log文件的問題及解決

    這篇文章主要介紹了mybatis打印的sql日志不寫入到log文件的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • java實(shí)現(xiàn)發(fā)送手機(jī)短信

    java實(shí)現(xiàn)發(fā)送手機(jī)短信

    這篇文章主要介紹了java實(shí)現(xiàn)發(fā)送手機(jī)短信,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • Java數(shù)據(jù)結(jié)構(gòu)和算法之鏈表詳解

    Java數(shù)據(jù)結(jié)構(gòu)和算法之鏈表詳解

    鏈表是一種物理存儲(chǔ)單元上非連續(xù)、非順序的存儲(chǔ)結(jié)構(gòu),java代碼實(shí)現(xiàn)單鏈表,插入,刪除和遍歷等功能,這篇文章主要給大家介紹了關(guān)于Java數(shù)據(jù)結(jié)構(gòu)和算法之鏈表的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • Spring整合Mybatis 掃描注解創(chuàng)建Bean報(bào)錯(cuò)的解決方案

    Spring整合Mybatis 掃描注解創(chuàng)建Bean報(bào)錯(cuò)的解決方案

    這篇文章主要介紹了Spring 整合Mybatis 掃描注解創(chuàng)建Bean報(bào)錯(cuò)的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論

扎鲁特旗| 山西省| 区。| 剑河县| 鸡东县| 黄冈市| 大石桥市| 巴彦县| 象州县| 宁陵县| 孟州市| 开平市| 招远市| 左云县| 九寨沟县| 镇原县| 峨眉山市| 普安县| 登封市| 社会| 八宿县| 庆云县| 呼和浩特市| 华池县| 光泽县| 姚安县| 长乐市| 乌拉特中旗| 宁武县| 邵阳县| 光泽县| 云阳县| 西青区| 金门县| 绥德县| 偃师市| 富顺县| 娱乐| 霞浦县| 保靖县| 曲靖市|