怎麼會這麼詳細 dubbo原始碼服務的發布

2021-10-10 05:21:41 字數 3020 閱讀 7824

本文主要介紹dubbo原始碼分析服務的發布,大概的介紹了一下流程。

與spring的整合是基於spring的schema擴充套件進行載入。dubbo命名空間對應的實現類是dubbonamespacehandler,dubbobeandefinitionparser用來解析xml檔案資訊。

以dubbo官方提供的dubbo-demo-provider為例來講解服務的發布過程。demo中xml配置檔案內容為:

public void afterpropertiesset() throws exception 

}if (!providerconfigs.isempty())

} else

providerconfig = config;}}

if (providerconfig != null) }}

}if (config.isdefault() == null || config.isdefault().booleanvalue()) }}

}}}if (getmodule() == null

&& (getprovider() == null || getprovider().getmodule() == null))

moduleconfig = config;}}

if (moduleconfig != null) }}

//是否設定 dubbo:registry 標籤

if ((getregistries() == null || getregistries().isempty())

&& (getprovider() == null || getprovider().getregistries() == null || getprovider().getregistries().isempty())

if (registryconfigmap != null && registryconfigmap.size() > 0)

}if (registryconfigs != null && !registryconfigs.isempty()) }}

//是否設定 dubbo:monitor 標籤

if (getmonitor() == null

&& (getprovider() == null || getprovider().getmonitor() == null)

if (monitorconfigmap != null && monitorconfigmap.size() > 0)

monitorconfig = config;}}

if (monitorconfig != null) }}

//是否設定dubbo:protocol標籤

if ((getprotocols() == null || getprotocols().isempty())

&& (getprovider() == null || getprovider().getprotocols() == null || getprovider().getprotocols().isempty()))

}if (protocolconfigs != null && !protocolconfigs.isempty()) }}

if (getpath() == null || getpath().length() == 0)

}if (!isdelay())

}

afterpropertiesset()方法主要利用spring的解析收集到很多一些配置,然後將這些配置都存至serviceconfig中。

if (isdelay() && !i***ported() && !isunexported())

//服務的發布與註冊

export();}}

//收集各類引數,放入map中,在為服務暴露做引數收集準備工作

mapmap = new hashmap();

//根據每乙個協議配置構建乙個url

string host = this.findconfigedhosts(protocolconfig, registryurls, map);

integer port = this.findconfigedports(protocolconfig, name, map);

url url = new url(name, host, port, (contextpath == null || contextpath.length() == 0 ? "" : contextpath + "/") + path, map);

//根據scope的配置決定是作本地暴露還是遠端暴露,做服務暴露從結果上看就是產生了乙個特定服務的 exporter 類,並將其儲存在對應的servicebean例項的 exporters屬性中。

string scope = url.getparameter(constants.scope_key);

}

根據scope的不同進行不同的介面暴露,一般情況下,乙個dubbo服務介面會先作本地暴露,然後再作遠端暴露,也即乙個服務介面兩次暴露。下面我們詳細介紹下面這段**

/**

* 引數1:ref就是介面實現類

* 引數2:inte***ceclass:介面類

* 引數3:在registryurl上新增引數,key為"export",value就是前面產生的服務協義的url

*/invoker> invoker = proxyfactory.getinvoker(ref, (class) inte***ceclass, registryurl.addparameterandencoded(constants.export_key, url.tofullstring()));

//使用protocol將invoker匯出成乙個exporter

上面**到目前大概流程如圖:

dubbo原始碼 服務目錄

dubbo用在微服務,那麼肯定是需要使用到集群的 面對集群就需要處理機器宕機的問題,如果是普通服務,乙個機子宕機,那麼我們還可以人工去維護,在集群裡面宕機,就很麻煩,所以需要我們軟體有容錯的功能,dubbo在容錯機制,分為四個 1.服務目錄 directory 也就是本章 2.服務路由router ...

Dubbo原始碼閱讀 三 Dubbo 服務註冊

通過註解來註冊dubbo服務的時候,在服務端和消費端都需要用到乙個元件dubbocomponentscanregistrar,先看下registerbeandefinitions 方法 public void registerbeandefinitions annotationmetadata im...

Dubbo服務註冊原始碼分析

服務在本地發布完成,那麼接下去要進入服務的註冊階段 final registry registry getregistry origininvoker final url registeredproviderurl geturltoregistry providerurl,registryurl d...