欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

大致流程

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

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

大致流程如下:

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

服務(wù)引用策略

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

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

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

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

懶漢式是只有某個(gè)服務(wù)被注入到其他類時(shí)才開(kāi)始啟動(dòng)引入流程。

默認(rèn)情況下,Dubbo會(huì)使用懶漢式引入策略,如果需要使用餓漢式,需要在<dubbo:reference/>中配置init開(kāi)啟。

并且通過(guò)上圖我們還可以看到ReferenceBean還實(shí)現(xiàn)了FactoryBean,Dubbo通過(guò)這個(gè)實(shí)現(xiàn)來(lái)進(jìn)行懶漢式引用服務(wù)。

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

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

  • 本地引入
  • 直接使用連接引入遠(yuǎn)程服務(wù)
  • 通過(guò)注冊(cè)中心引入遠(yuǎn)程服務(wù)

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

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

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

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

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

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

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

再進(jìn)入createProxy()方法

在這里插入圖片描述

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

在這里插入圖片描述

不是本地引入,那么就是遠(yuǎn)程引入了,接下來(lái)需要判斷的是點(diǎn)對(duì)點(diǎn)直連provider還是通過(guò)注冊(cè)中心拿到provider信息再進(jìn)行連接。

以下是點(diǎn)對(duì)點(diǎn)直連:

在這里插入圖片描述

以下是通過(guò)注冊(cè)中心連接:

在這里插入圖片描述

最終拼接出來(lái)的URL如下圖所示:

在這里插入圖片描述

在這里插入圖片描述

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

在這里插入圖片描述

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

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

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

在這里插入圖片描述

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

在這里插入圖片描述

RegistryDirectory類是實(shí)現(xiàn)了NotifyListener接口的,注冊(cè)中心的監(jiān)聽(tīng)功能就此而來(lái)。

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

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

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

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

拿到Provider的信息之后就會(huì)通過(guò)監(jiān)聽(tīng)觸發(fā)DubboProtocol.refer()

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

在這里插入圖片描述

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

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

在這里插入圖片描述

總結(jié)

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

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

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

相關(guān)文章

  • java實(shí)現(xiàn)求只出現(xiàn)一次的數(shù)字

    java實(shí)現(xiàn)求只出現(xiàn)一次的數(shù)字

    本文主要介紹了java實(shí)現(xiàn)求只出現(xiàn)一次的數(shù)字,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02
  • SpringBoot結(jié)合mybatis-plus實(shí)現(xiàn)分頁(yè)的項(xiàng)目實(shí)踐

    SpringBoot結(jié)合mybatis-plus實(shí)現(xiàn)分頁(yè)的項(xiàng)目實(shí)踐

    本文主要介紹了SpringBoot結(jié)合mybatis-plus實(shí)現(xiàn)分頁(yè)的項(xiàng)目實(shí)踐,主要基于MyBatis-Plus 自帶的分頁(yè)插件 PaginationInterceptor,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-06-06
  • 利用Maven入手Spring Boot第一個(gè)程序詳解

    利用Maven入手Spring Boot第一個(gè)程序詳解

    這篇文章主要給大家介紹了關(guān)于如何利用Maven入手Spring Boot第一個(gè)程序的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2018-02-02
  • 聊聊Java中是什么方法導(dǎo)致的線程阻塞

    聊聊Java中是什么方法導(dǎo)致的線程阻塞

    這篇文章主要介紹了聊聊Java中是什么方法導(dǎo)致的線程阻塞,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-02-02
  • Springboot打包部署代碼實(shí)例

    Springboot打包部署代碼實(shí)例

    這篇文章主要介紹了Springboot打包部署代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Java中channel用法總結(jié)

    Java中channel用法總結(jié)

    這篇文章主要介紹了Java中channel用法,較為詳細(xì)的總結(jié)了channel的定義、類型及使用技巧,需要的朋友可以參考下
    2015-06-06
  • SpringCloud Gateway動(dòng)態(tài)路由配置詳解

    SpringCloud Gateway動(dòng)態(tài)路由配置詳解

    這篇文章主要為大家介紹了SpringCloud Gateway動(dòng)態(tài)路由配置詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Java獲取字符串編碼格式實(shí)現(xiàn)思路

    Java獲取字符串編碼格式實(shí)現(xiàn)思路

    文件編碼的格式?jīng)Q定了文件可存儲(chǔ)的字符類型,所以得到文件的類型至關(guān)重要,下文筆者講述獲取一個(gè)文本文件的格式信息的方法分享及java字符串編碼格式實(shí)現(xiàn),感興趣的朋友一起看看吧
    2022-09-09
  • 如何使用SpringSecurity保護(hù)程序安全

    如何使用SpringSecurity保護(hù)程序安全

    這篇文章主要介紹了如何使用SpringSecurity保護(hù)程序安全,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-09-09
  • java實(shí)現(xiàn)列表、集合與數(shù)組之間轉(zhuǎn)化的方法

    java實(shí)現(xiàn)列表、集合與數(shù)組之間轉(zhuǎn)化的方法

    這篇文章主要介紹了java實(shí)現(xiàn)列表、集合與數(shù)組之間轉(zhuǎn)化的方法,涉及java中列表、集合與數(shù)組相互轉(zhuǎn)換的技巧,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2015-03-03

最新評(píng)論