Dubbo框架學習-重要概念理解
阿新 • • 發佈:2019-02-10
ProxyFactory
- ProxyFactory是代理工廠,在dubbo中主要有兩個作用,我們可以通過原始碼來分析介面作用
@SPI("javassist")
public interface ProxyFactory {
/**
* create proxy.
* 針對Client端,建立服務端介面的代理物件,例如DemoService的代理物件
* 一個Invoker物件
* @param invoker
* @return proxy
*/
@Adaptive({Constants.PROXY_KEY})
<T> T getProxy(Invoker<T> invoker) throws RpcException;
/**
* create invoker.
* 針對server端,將服務物件的具體實現,例如DemoServiceImpl包裝成
* @param <T>
* @param proxy:服務的具體實現型別引用 DemoServiceImpl
* @param type:介面的Class型別
* @param url:URL物件,如果是遠端服務暴露,則為服務介面名,註冊中心URL,埠,協議(dubbo)等資訊
* @return invoker
*/
@Adaptive ({Constants.PROXY_KEY})
<T> Invoker<T> getInvoker(T proxy, Class<T> type, URL url) throws RpcException;
}
Invoker
- Invoker是指可執行的物件,在dubbo中是由代理工廠ProxyFactory的getInvoker生成的。根據上述方法getInvoker(T proxy, Class type, URL url)可以看出,Invoker物件在dubbo框架中主要分為三類(後續詳細講解):
1.1. 本地執行Invoker,服務在本地暴露時,則Invoker是指本地執行的。
1.2. 遠端通訊Invoker,服務進行遠端暴露,ProxyFactory生成遠端Invoker。
1.3. 多個遠端通訊的Invoker聚合成叢集版的Invoker。 - Invoker是指可執行的物件,則呼叫Invoker的invoke方法則能獲得執行結果。該介面的原始碼如下:
public interface Invoker<T> extends Node {
/**
* get service interface.
*
* @return service interface.
*/
Class<T> getInterface();
/**
* invoke.
* @param invocation
* @return result
* @throws RpcException
*/
Result invoke(Invocation invocation) throws RpcException;
}
Protocol
- protocol在dubbo中是協議的意思,該介面主要有兩個方面的功能。
1.1. 服務端通過Protocol的export(Invoker)方法將ProxyFactory生成的Invoker物件暴露成遠端服務或本地服務的引用Exporter。
1.2. 客戶端consumer通過Protocol的refer(Invoker,Url)方法引用遠端服務。
@SPI("dubbo")
public interface Protocol {
/**
* 獲取預設埠,當用戶沒有配置埠時使用。
*
* @return 預設埠
*/
int getDefaultPort();
/**
* 暴露遠端服務:<br>
* 1. 協議在接收請求時,應記錄請求來源方地址資訊:RpcContext.getContext().setRemoteAddress();<br>
* 2. export()必須是冪等的,也就是暴露同一個URL的Invoker兩次,和暴露一次沒有區別。<br>
* 3. export()傳入的Invoker由框架實現並傳入,協議不需要關心。<br>
*
* @param <T> 服務的型別
* @param invoker 服務的執行體
* @return exporter 暴露服務的引用,用於取消暴露
* @throws RpcException 當暴露服務出錯時丟擲,比如埠已佔用
*/
@Adaptive
<T> Exporter<T> export(Invoker<T> invoker) throws RpcException;
/**
* 引用遠端服務:<br>
* 1. 當用戶呼叫refer()所返回的Invoker物件的invoke()方法時,協議需相應執行同URL遠端export()傳入的Invoker物件的invoke()方法。<br>
* 2. refer()返回的Invoker由協議實現,協議通常需要在此Invoker中傳送遠端請求。<br>
* 3. 當url中有設定check=false時,連線失敗不能丟擲異常,並內部自動恢復。<br>
*
* @param <T> 服務的型別
* @param type 服務的型別
* @param url 遠端服務的URL地址
* @return invoker 服務的本地代理
* @throws RpcException 當連線服務提供方失敗時丟擲
*/
@Adaptive
<T> Invoker<T> refer(Class<T> type, URL url) throws RpcException;
/**
* 釋放協議:<br>
* 1. 取消該協議所有已經暴露和引用的服務。<br>
* 2. 釋放協議所佔用的所有資源,比如連線和埠。<br>
* 3. 協議在釋放後,依然能暴露和引用新的服務。<br>
*/
void destroy();
}
- 通過export暴露服務的引用exporter,其中exporter負責管理Invoker的宣告週期。
- 遠端服務暴露時,使用DubboProtocol進行具體服務暴露。呼叫DubboProtocol的export(Invoker)將Invoker進行暴露成Exporter。這個方法的核心就是將暴露的exporter放入到ConcurrentHashMap中。
4.原始碼如下:
public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
URL url = invoker.getUrl();
// export service.
String key = serviceKey(url);
/**
key是指com.xxx.DemoService:20880
***DubboExporter,返回出去。
**/
DubboExporter<T> exporter = new DubboExporter<T>(invoker, key, exporterMap);
// 將exporter放入map中,key是com.xxx.DemoService:20880
exporterMap.put(key, exporter);
// 省略部分非核心程式碼
// 開啟服務
openServer(url);
return exporter;
}
Exchanger
- 資訊交換層,封裝請求,響應資訊。同步轉非同步。
Transporter
- 抽象Mina和Netty通訊統一介面。