中文亚洲精品无码_熟女乱子伦免费_人人超碰人人爱国产_亚洲熟妇女综合网

當(dāng)前位置: 首頁(yè) > news >正文

兩學(xué)一做注冊(cè)網(wǎng)站嗎網(wǎng)絡(luò)廣告有哪些形式

兩學(xué)一做注冊(cè)網(wǎng)站嗎,網(wǎng)絡(luò)廣告有哪些形式,鄢陵縣北京網(wǎng)站建設(shè),access怎么做網(wǎng)站基于Dubbo 3.1,詳細(xì)介紹了Dubbo服務(wù)的發(fā)布與引用的源碼。 此前我們學(xué)習(xí)了調(diào)用createProxy方法,根據(jù)服務(wù)引用參數(shù)map創(chuàng)建服務(wù)接口代理引用對(duì)象的整體流程,我們知道會(huì)調(diào)用createInvokerForRemote方法創(chuàng)建遠(yuǎn)程引用Invoker,這是Dubbo …

基于Dubbo 3.1,詳細(xì)介紹了Dubbo服務(wù)的發(fā)布與引用的源碼。

此前我們學(xué)習(xí)了調(diào)用createProxy方法,根據(jù)服務(wù)引用參數(shù)map創(chuàng)建服務(wù)接口代理引用對(duì)象的整體流程,我們知道會(huì)調(diào)用createInvokerForRemote方法創(chuàng)建遠(yuǎn)程引用Invoker,這是Dubbo 3 服務(wù)引用的核心方法,我們現(xiàn)在來(lái)接著學(xué)習(xí)createInvokerForRemote方法。

Dubbo 3.x服務(wù)引用源碼:

  1. Dubbo 3.x源碼(11)—Dubbo服務(wù)的發(fā)布與引用的入口
  2. Dubbo 3.x源碼(18)—Dubbo服務(wù)引用源碼(1)
  3. Dubbo 3.x源碼(19)—Dubbo服務(wù)引用源碼(2)
  4. Dubbo 3.x源碼(20)—Dubbo服務(wù)引用源碼(3)

Dubbo 3.x服務(wù)發(fā)布源碼:

  1. Dubbo 3.x源碼(11)—Dubbo服務(wù)的發(fā)布與引用的入口
  2. Dubbo 3.x源碼(12)—Dubbo服務(wù)發(fā)布導(dǎo)出源碼(1)
  3. Dubbo 3.x源碼(13)—Dubbo服務(wù)發(fā)布導(dǎo)出源碼(2)
  4. Dubbo 3.x源碼(14)—Dubbo服務(wù)發(fā)布導(dǎo)出源碼(3)
  5. Dubbo 3.x源碼(15)—Dubbo服務(wù)發(fā)布導(dǎo)出源碼(4)
  6. Dubbo 3.x源碼(16)—Dubbo服務(wù)發(fā)布導(dǎo)出源碼(5)
  7. Dubbo 3.x源碼(17)—Dubbo服務(wù)發(fā)布導(dǎo)出源碼(6)

文章目錄

  • 1 createInvokerForRemote創(chuàng)建遠(yuǎn)程引用Invoker
  • 2 Protocol$Adaptive自適應(yīng)Protocol
  • 3 ProtocolSerializationWrapper協(xié)議序列化包裝器
  • 4 ProtocolFilterWrapper協(xié)議過(guò)濾器包裝器
  • 5 ProtocolListenerWrapper協(xié)議監(jiān)聽(tīng)器包裝器
  • 6 總結(jié)

1 createInvokerForRemote創(chuàng)建遠(yuǎn)程引用Invoker

遠(yuǎn)程引用或者直連引用情況下,將會(huì)調(diào)用該方法,創(chuàng)建遠(yuǎn)程引用Invoker。該方法對(duì)于一個(gè)注冊(cè)中心url和多個(gè)注冊(cè)中心url的處理不一樣,我們僅看一個(gè)注冊(cè)中心的情況。

一個(gè)注冊(cè)中心的情況下,該方法主要邏輯就是執(zhí)行protocolSPI.refer方法,通過(guò)協(xié)議protocolSPI引用服務(wù)Invoker。

這里的protocolSPI是Protocol的自適應(yīng)擴(kuò)展實(shí)現(xiàn),即Protocol$Adaptive,將會(huì)根據(jù)url的協(xié)議選擇Protocol實(shí)現(xiàn),然后調(diào)用Protocol#refer方法引用服務(wù)。

我們下面主要看protocolSPI#refer方法方法的相關(guān)源碼,這也是Dubbo服務(wù)引入的核心流程之一。

/*** ReferenceConfig的方法* <p>* 創(chuàng)建遠(yuǎn)程引用Invoker*/
@SuppressWarnings({"unchecked", "rawtypes"})
private void createInvokerForRemote() {//一個(gè)url,表示一個(gè)注冊(cè)中心或者直連地址,這是大多數(shù)情況//url例如: registry://47.94.229.245:2181/org.apache.dubbo.registry.RegistryService?REGISTRY_CLUSTER=demo1&application=demo-consumer&dubbo=2.0.2&pid=34457&registry=zookeeper&timeout=20000&timestamp=1666854892012if (urls.size() == 1) {//獲取注冊(cè)中心協(xié)議urlURL curUrl = urls.get(0);/** 通過(guò)協(xié)議protocolSPI引用服務(wù),該方法固定返回InjvmInvoker實(shí)例,內(nèi)部沒(méi)有NettyClient,因?yàn)椴恍枰l(fā)起網(wǎng)絡(luò)調(diào)用** 這里的protocolSPI是Protocol的自適應(yīng)擴(kuò)展實(shí)現(xiàn),即Protocol$Adaptive* 將會(huì)根據(jù)url的協(xié)議選擇Protocol實(shí)現(xiàn),然后調(diào)用Protocol#refer方法引用服務(wù)*/invoker = protocolSPI.refer(interfaceClass, curUrl);// registry url, mesh-enable and unloadClusterRelated is true, not need Cluster.//如果是registry url(非直連地址), 或者unloadClusterRelated為true,那么不需要Cluster,否則需要Cluster包裝//對(duì)于遠(yuǎn)程注冊(cè)中心協(xié)議來(lái)說(shuō),在protocolSPI.refer方法中就已經(jīng)進(jìn)行了Cluster包裝,這里不再需要了if (!UrlUtils.isRegistry(curUrl) &&!curUrl.getParameter(UNLOAD_CLUSTER_RELATED, false)) {List<Invoker<?>> invokers = new ArrayList<>();invokers.add(invoker);invoker = Cluster.getCluster(scopeModel, Cluster.DEFAULT).join(new StaticDirectory(curUrl, invokers), true);}}//多個(gè)url,表示多個(gè)注冊(cè)中心或者直連地址else {List<Invoker<?>> invokers = new ArrayList<>();URL registryUrl = null;for (URL url : urls) {// For multi-registry scenarios, it is not checked whether each referInvoker is available.// Because this invoker may become available later.invokers.add(protocolSPI.refer(interfaceClass, url));if (UrlUtils.isRegistry(url)) {// use last registry urlregistryUrl = url;}}if (registryUrl != null) {// registry url is available// for multi-subscription scenario, use 'zone-aware' policy by defaultString cluster = registryUrl.getParameter(CLUSTER_KEY, ZoneAwareCluster.NAME);// The invoker wrap sequence would be: ZoneAwareClusterInvoker(StaticDirectory) -> FailoverClusterInvoker// (RegistryDirectory, routing happens here) -> Invokerinvoker = Cluster.getCluster(registryUrl.getScopeModel(), cluster, false).join(new StaticDirectory(registryUrl, invokers), false);} else {// not a registry url, must be direct invoke.if (CollectionUtils.isEmpty(invokers)) {throw new IllegalArgumentException("invokers == null");}URL curUrl = invokers.get(0).getUrl();String cluster = curUrl.getParameter(CLUSTER_KEY, Cluster.DEFAULT);invoker = Cluster.getCluster(scopeModel, cluster).join(new StaticDirectory(curUrl, invokers), true);}}
}

2 Protocol$Adaptive自適應(yīng)Protocol

Protocol$Adaptive的refer方法將會(huì)根據(jù)url的協(xié)議基于Dubbo SPI機(jī)制選擇Protocol實(shí)現(xiàn),然后調(diào)用Protocol#refer方法引用服務(wù),默認(rèn)dubbo協(xié)議。

/*** Protocol$Adaptive的方法* 基于url協(xié)議參數(shù)的自適應(yīng)引用服務(wù)** @param arg0 服務(wù)class* @param arg1 遠(yuǎn)程服務(wù)的url地址* @return Invoker*/
public org.apache.dubbo.rpc.Invoker refer(java.lang.Class arg0, org.apache.dubbo.common.URL arg1) throws org.apache.dubbo.rpc.RpcException {if (arg1 == null) throw new IllegalArgumentException("url == null");org.apache.dubbo.common.URL url = arg1;//獲取url協(xié)議作為擴(kuò)展名,默認(rèn)dubboString extName = (url.getProtocol() == null ? "dubbo" : url.getProtocol());if (extName == null)throw new IllegalStateException("Failed to get extension (org.apache.dubbo.rpc.Protocol) name from url (" + url.toString() + ") use keys([protocol])");ScopeModel scopeModel = ScopeModelUtil.getOrDefault(url.getScopeModel(), org.apache.dubbo.rpc.Protocol.class);//基于DUbbo SPI機(jī)制查找指定擴(kuò)展名的Protocol實(shí)現(xiàn)類,默認(rèn)DubboProtocol,這里會(huì)進(jìn)行wrapper包裝org.apache.dubbo.rpc.Protocol extension = (org.apache.dubbo.rpc.Protocol) scopeModel.getExtensionLoader(org.apache.dubbo.rpc.Protocol.class).getExtension(extName);//通過(guò)具體的Protocol包裝實(shí)現(xiàn)類的refer方法實(shí)現(xiàn)服務(wù)的引用return extension.refer(arg0, arg1);
}

同服務(wù)導(dǎo)出時(shí)一樣,獲取Protocol的時(shí)候,將會(huì)經(jīng)過(guò)wrapper的包裝。以InjvmProtocol協(xié)議為例,可以看到經(jīng)過(guò)了三層包裝,調(diào)用時(shí)由外向內(nèi)調(diào)用,即ProtocolSerializationWrapper -> ProtocolFilterWrapper -> ProtocolListenerWrapper -> InjvmProtocol(具體的Protocol實(shí)現(xiàn))。實(shí)際上Dubbo正式采用warpper機(jī)制和裝飾設(shè)計(jì)模式實(shí)現(xiàn)類似aop的功能。

本地引入的injvm協(xié)議對(duì)應(yīng)InjvmProtocol,需要引入遠(yuǎn)程接口級(jí)注冊(cè)中心的registry對(duì)應(yīng)InterfaceCompatibleRegistryProtocol,需要引入遠(yuǎn)程應(yīng)用級(jí)注冊(cè)中心的service-discovery-registry對(duì)應(yīng)RegistryProtocol。
image.png
下面我們分別講解這些wrapper和protocol是如何進(jìn)行服務(wù)引入的!

3 ProtocolSerializationWrapper協(xié)議序列化包裝器

protocol的最外層wrapper,它僅會(huì)在導(dǎo)出服務(wù)的export方法中起作用,在引入服務(wù)的refer方法中沒(méi)有其他處理。

/*** ProtocolSerializationWrapper的方法*/
@Override
public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException {//無(wú)特殊處理return protocol.refer(type, url);
}

4 ProtocolFilterWrapper協(xié)議過(guò)濾器包裝器

這個(gè)包裝器首先會(huì)判斷如果是注冊(cè)中心的協(xié)議,例如registry或者service-discovery-registry,那么直接調(diào)用下一層refer方法。

否則,獲取服務(wù)url對(duì)應(yīng)的Filter并且構(gòu)建為一個(gè)InvokerChain對(duì)象返回,內(nèi)部包含了一個(gè)下層refer方法的Invoker和一條過(guò)濾器調(diào)用鏈。

/*** ProtocolFilterWrapper的方法*/
@Override
public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException {//如果是注冊(cè)中心的協(xié)議,例如registry或者service-discovery-registry,那么直接調(diào)用下一層refer方法if (UrlUtils.isRegistry(url)) {return protocol.refer(type, url);}//獲取服務(wù)url對(duì)應(yīng)的Filter并且構(gòu)建為一個(gè)InvokerChain對(duì)象返回,內(nèi)部包含了一個(gè)下層refer方法的Invoker和一條過(guò)濾器調(diào)用鏈。FilterChainBuilder builder = getFilterChainBuilder(url);return builder.buildInvokerChain(protocol.refer(type, url), REFERENCE_FILTER_KEY, CommonConstants.CONSUMER);
}

5 ProtocolListenerWrapper協(xié)議監(jiān)聽(tīng)器包裝器

這個(gè)包裝器首先會(huì)判斷如果是注冊(cè)中心的協(xié)議,例如registry或者service-discovery-registry,那么直接調(diào)用下一層refer方法。

否則,調(diào)用下一層refer方法獲取返回的Invoker,如果url不包含registry-cluster-type參數(shù),將返回的Invoker包裝為L(zhǎng)istenerInvokerWrapper,內(nèi)部包含了一個(gè)Invoker和一個(gè)監(jiān)聽(tīng)器列表。

/*** ProtocolListenerWrapper的方法*/
@Override
public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException {//如果是注冊(cè)中心的協(xié)議,例如registry或者service-discovery-registry,那么直接調(diào)用下一層refer方法if (UrlUtils.isRegistry(url)) {return protocol.refer(type, url);}//調(diào)用下一層refer方法獲取返回的InvokerInvoker<T> invoker = protocol.refer(type, url);//如果url不包含registry-cluster-type參數(shù)if (StringUtils.isEmpty(url.getParameter(REGISTRY_CLUSTER_TYPE_KEY))) {//將返回的Invoker包裝為L(zhǎng)istenerInvokerWrapper,內(nèi)部包含了一個(gè)Invoker和一個(gè)監(jiān)聽(tīng)器列表invoker = new ListenerInvokerWrapper<>(invoker,Collections.unmodifiableList(ScopeModelUtil.getExtensionLoader(InvokerListener.class, invoker.getUrl().getScopeModel()).getActivateExtension(url, INVOKER_LISTENER_KEY)));}return invoker;
}

6 總結(jié)

本次我們學(xué)習(xí)了createInvokerForRemote方法中的Wrapper有哪些以及作用,接下來(lái)我們將會(huì)的學(xué)習(xí)真正的本地、應(yīng)用級(jí)別、接口級(jí)別的Protocol的引入邏輯。

http://www.risenshineclean.com/news/59424.html

相關(guān)文章:

  • 平面設(shè)計(jì)比較好的網(wǎng)站廣告投放平臺(tái)系統(tǒng)
  • 金色世紀(jì)做網(wǎng)站的是哪個(gè)崗位發(fā)布推廣信息的網(wǎng)站
  • 在縣城怎么做網(wǎng)站公司seo教程優(yōu)化
  • 做網(wǎng)站不打廣告怎么賺錢網(wǎng)絡(luò)營(yíng)銷是什么工作
  • 公司微網(wǎng)站怎么建設(shè)廣州線上教學(xué)
  • 動(dòng)易網(wǎng)站后臺(tái)密碼破解寧夏百度推廣代理商
  • 航達(dá)建設(shè)網(wǎng)站上海優(yōu)質(zhì)網(wǎng)站seo有哪些
  • 有沒(méi)有什么做統(tǒng)計(jì)的網(wǎng)站網(wǎng)絡(luò)營(yíng)銷比較好的企業(yè)
  • 如何解決網(wǎng)站只收錄首頁(yè)的一些辦法小程序制作
  • cms網(wǎng)站地圖模板東莞搜索引擎推廣
  • 開(kāi)淘寶店和做網(wǎng)站有什么區(qū)別福鼎網(wǎng)站優(yōu)化公司
  • 直接打域名訪問(wèn)網(wǎng)站關(guān)鍵詞推廣工具
  • 網(wǎng)站制作設(shè)及的技術(shù)產(chǎn)品營(yíng)銷策劃方案3000字
  • 廣州定制網(wǎng)站建設(shè)廣東seo網(wǎng)站推廣代運(yùn)營(yíng)
  • 成都網(wǎng)站開(kāi)發(fā)哪個(gè)好深圳seo優(yōu)化排名
  • 嵌入式培訓(xùn)班多少錢seo優(yōu)化推廣軟件
  • 企業(yè)網(wǎng)站備案 名稱沈陽(yáng)seo博客
  • 伊通縣建設(shè)局網(wǎng)站常德政府網(wǎng)站
  • 學(xué)校英語(yǔ)網(wǎng)站欄目名稱域名備案
  • WordPress漢化卡片式主題長(zhǎng)嶺網(wǎng)站優(yōu)化公司
  • 做直播網(wǎng)站需要什么環(huán)球軍事網(wǎng)
  • 網(wǎng)站建設(shè)好之后怎么自己推廣免費(fèi)推廣引流平臺(tái)有哪些
  • 服務(wù)器做網(wǎng)站需安裝哪些軟件佛山網(wǎng)站建設(shè)排名
  • 外包做網(wǎng)站賺錢么app注冊(cè)推廣拉人
  • 濟(jì)南做網(wǎng)站哪家便宜seo項(xiàng)目經(jīng)理
  • 網(wǎng)站怎么添加js廣告位免費(fèi)seo搜索優(yōu)化
  • 常德論壇網(wǎng)站看廣告賺錢
  • 住房和城鄉(xiāng)建設(shè)部網(wǎng)站安廣東省淘寶指數(shù)官網(wǎng)
  • 優(yōu)化網(wǎng)站用軟件好嗎山東一級(jí)造價(jià)師
  • 建設(shè)摩托車官網(wǎng)旗艦店寶雞seo排名