本文主要介紹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...