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

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

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

大致流程

Provider將服務(wù)暴露出來并且注冊到注冊中心,而Consumer通過注冊中心獲取Provider的信息,之后將自己封裝成一個調(diào)用類去與Provider進行交互。

首先需要將所有調(diào)用轉(zhuǎn)化為Dubbo中我們熟悉的Invoker,再通過代理類去遠程獲取服務(wù)。

大致流程如下:

請?zhí)砑訄D片描述

服務(wù)引用策略

服務(wù)的引用和服務(wù)的暴露原理相似,都是Spring自定義標簽機制解析生成對應(yīng)的Bean,在之前服務(wù)暴露使用到的Provider Service使用的是ServiceBean,而Comsumer Reference使用的ReferenceBean

請?zhí)砑訄D片描述

服務(wù)暴露是在SpringIOC容器完成刷新后開始暴露的,而服務(wù)的引入則分為兩種,分別是餓漢式懶漢式。

餓漢式是通過實現(xiàn)Spring的InitializingBean接口中的afterPropertiesSet()實現(xiàn)的,通過上圖中ReferenceBean的實現(xiàn)也可以獲知,而容器通過調(diào)用ReferenceBean中的afterPropertiesSet()時引入服務(wù)。

懶漢式是只有某個服務(wù)被注入到其他類時才開始啟動引入流程。

默認情況下,Dubbo會使用懶漢式引入策略,如果需要使用餓漢式,需要在<dubbo:reference/>中配置init開啟。

并且通過上圖我們還可以看到ReferenceBean還實現(xiàn)了FactoryBean,Dubbo通過這個實現(xiàn)來進行懶漢式引用服務(wù)。

服務(wù)引用的三種方式

服務(wù)引用分為三種方式:

  • 本地引入
  • 直接使用連接引入遠程服務(wù)
  • 通過注冊中心引入遠程服務(wù)

本地引入的基礎(chǔ)是之前介紹過的本地暴露,某個服務(wù)端可能同時是Provider又是Comsumer,并且可能會自己調(diào)用本地的服務(wù),這種情況下不需要進行網(wǎng)絡(luò)調(diào)用,所以引入了本地引用,來避免不必要的網(wǎng)絡(luò)開銷。

服務(wù)引入時,第一步做的就是在本地中查找是否有可用的本地服務(wù)。

直連引入服務(wù),這種方式不需要注冊中心的支持,繞過了注冊中心,直接通過Url來引用遠程服務(wù),具體實現(xiàn)是在Comsumer中寫死Provider的具體地址,然后在調(diào)用時直接連接即可,一般用于測試,如果大量服務(wù)之間都使用直連引入,那么服務(wù)集群之間的關(guān)系將錯綜復(fù)雜,變得那以維護和管理。

注冊中心引入服務(wù),Comsumer通過注冊中心獲取Provider的相關(guān)信息,然后進行服務(wù)的引入,其中還涉及到多注冊中心,服務(wù)集群時的負載均衡,以及容錯機制。

服務(wù)引入流程解析

前提:服務(wù)引入選擇默認的懶漢式引入策略并且使用注冊中心引入服務(wù)。

服務(wù)引入的入口是ReferenceBean.getObject()

在這里插入圖片描述

然后會調(diào)用父類ReferenceConfig.get()

在這里插入圖片描述

進入init()方法,前面的一大串代碼就是做if else判斷的配置檢查并且將配置放入map,構(gòu)建完畢后的map如下:

在這里插入圖片描述

再進入createProxy()方法

在這里插入圖片描述

如果是本地引入的話,會構(gòu)建一個本地引入的URL然后進行服務(wù)的引入,即圖示中的refprotocol.refer()

在這里插入圖片描述

不是本地引入,那么就是遠程引入了,接下來需要判斷的是點對點直連provider還是通過注冊中心拿到provider信息再進行連接。

以下是點對點直連:

在這里插入圖片描述

以下是通過注冊中心連接:

在這里插入圖片描述

最終拼接出來的URL如下圖所示:

在這里插入圖片描述

在這里插入圖片描述

方法最后通過代理封裝invoker返回代理實現(xiàn)。

在這里插入圖片描述

上圖就是整個服務(wù)引用流程。

但是還有很多細節(jié),比如如何從注冊中心獲得Provider,invoker內(nèi)部結(jié)構(gòu)是怎么樣的?

在上面URL的截圖中,我們可以看到此時的協(xié)議是registry,因此會調(diào)用RegistryPotocol.refer()

在這里插入圖片描述

獲取注冊中心實例,之后調(diào)用doRefer()

在這里插入圖片描述

RegistryDirectory類是實現(xiàn)了NotifyListener接口的,注冊中心的監(jiān)聽功能就此而來。

public class RegistryDirectory<T> extends AbstractDirectory<T> implements NotifyListener {}

public interface NotifyListener {
    void notify(List<URL> var1);
}

向注冊中心注冊自身信息之后,會向注冊中心訂閱providers,configurators,routers節(jié)點信息。訂閱之后RegistryDirectory會收到這幾個節(jié)點的信息,并觸發(fā)DubboInvoker的生成,即用于遠程調(diào)用的invoker。

再通過cluster封裝得到invoker,因此一個服務(wù)可能有多個提供者,最終在ProviderConsumerRegTable記錄這些信息,然后返回invoker。

拿到Provider的信息之后就會通過監(jiān)聽觸發(fā)DubboProtocol.refer()

在這里插入圖片描述

重點在getClients()方法中,這個方法是用于獲取客戶端實例的,實例類型為ExchangeClient[],底層依賴Netty進行通訊,并且是默認共享連接的。

在這里插入圖片描述

再進入initClient()方法中看看初始化客戶端的具體細節(jié):

在這里插入圖片描述

最后返回的(ExchangeClient) client封裝的是NettyClient

在這里插入圖片描述

最后得到的Invoker如下,其中記錄到了許多信息:

在這里插入圖片描述

最后調(diào)用return proxyFactory.getProxy(this.invoker);將代理對象返回。

以下是整個服務(wù)引用的流程圖:

在這里插入圖片描述

總結(jié)

首先是通過配置構(gòu)建URL,再通過協(xié)議頭自適應(yīng)拓展得到具體的實現(xiàn)類進行服務(wù)引入,之后消費者向注冊中心注冊自己的信息,然后訂閱相關(guān)信息,得到遠程服務(wù)提供者的信息,最后通過NettyClient進行連接通訊。

還會通過DirectoryCluster進行多個服務(wù)提供者的合并、屏蔽、容錯以及負載均衡,最終將封裝好的可執(zhí)行體Invoker通過動態(tài)代理封裝得到代理對象返回。

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

相關(guān)文章

  • java程序代碼與文本對比實用工具簡介

    java程序代碼與文本對比實用工具簡介

    可以對兩段文本進行對比,檢測/比較兩個文本有什么不同的差異,以便修改,常用于程序代碼,就是不需要人工查看,尤其是大文件,有幾百上千行的代碼,這時候就建議使用比較工具了,不用浪費過多時間去尋找
    2021-09-09
  • java long轉(zhuǎn)String +Codeforces110A案例

    java long轉(zhuǎn)String +Codeforces110A案例

    這篇文章主要介紹了java long轉(zhuǎn)String +Codeforces110A案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java?Optional用法面試題精講

    Java?Optional用法面試題精講

    這篇文章主要為大家介紹了Java?Optional用法面試題精講,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • Java線程池Executor用法詳解

    Java線程池Executor用法詳解

    本文主要為大家詳細介紹了Java線程池Executor的用法,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Springboot Activemq整合過程代碼圖解

    Springboot Activemq整合過程代碼圖解

    這篇文章主要介紹了Springboot Activemq整合過程代碼圖解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-02-02
  • java讀取證書公鑰的實現(xiàn)

    java讀取證書公鑰的實現(xiàn)

    這篇文章主要介紹了java讀取證書公鑰的實現(xiàn),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • Java Calendar日歷與Date日期的相互轉(zhuǎn)換詳解

    Java Calendar日歷與Date日期的相互轉(zhuǎn)換詳解

    這篇文章主要介紹了Java Calendar日歷與Date日期的相互轉(zhuǎn)換詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • SpringSecurity 認證、注銷、權(quán)限控制功能(注銷、記住密碼、自定義登入頁)

    SpringSecurity 認證、注銷、權(quán)限控制功能(注銷、記住密碼、自定義登入頁)

    SpringSecurity是一個強大的Java框架,用于保護應(yīng)用程序的安全性,它提供了一套全面的安全解決方案,本文給大家介紹SpringSecurity認證、注銷、權(quán)限控制和注銷、記住密碼、自定義登入頁等知識總結(jié),感興趣的朋友一起看看吧
    2025-03-03
  • Java聊天室之實現(xiàn)客戶端群聊功能

    Java聊天室之實現(xiàn)客戶端群聊功能

    這篇文章主要為大家詳細介紹了Java簡易聊天室之實現(xiàn)客戶端群聊功能,文中的示例代碼講解詳細,具有一定的借鑒價值,需要的可以了解一下
    2022-10-10
  • Spring循環(huán)依賴正確性及Bean注入的順序關(guān)系詳解

    Spring循環(huán)依賴正確性及Bean注入的順序關(guān)系詳解

    這篇文章主要給大家介紹了關(guān)于Spring循環(huán)依賴的正確性,以及Bean注入的順序關(guān)系的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-01-01

最新評論

内乡县| 玉树县| 茂名市| 龙州县| 荔波县| 含山县| 肇东市| 临海市| 舒城县| 开封市| 富顺县| 策勒县| 淮南市| 绩溪县| 富锦市| 垣曲县| 潞城市| 商城县| 奈曼旗| 拜泉县| 五指山市| 霍林郭勒市| 石河子市| 芷江| 塘沽区| 玛纳斯县| 石城县| 远安县| 巴东县| 南昌县| 四子王旗| 灵寿县| 中方县| 建宁县| 威宁| 将乐县| 岑溪市| 大埔区| 习水县| 固镇县| 襄汾县|