W3Cschool
恭喜您成為首批注冊用戶
獲得88經(jīng)驗值獎勵
RPC 協(xié)議擴展,封裝遠程調(diào)用細節(jié)。
契約:
注意:
public interface Protocol {
/**
* 暴露遠程服務:<br>
* 1. 協(xié)議在接收請求時,應記錄請求來源方地址信息:RpcContext.getContext().setRemoteAddress();<br>
* 2. export()必須是冪等的,也就是暴露同一個URL的Invoker兩次,和暴露一次沒有區(qū)別。<br>
* 3. export()傳入的Invoker由框架實現(xiàn)并傳入,協(xié)議不需要關心。<br>
*
* @param <T> 服務的類型
* @param invoker 服務的執(zhí)行體
* @return exporter 暴露服務的引用,用于取消暴露
* @throws RpcException 當暴露服務出錯時拋出,比如端口已占用
*/
<T> Exporter<T> export(Invoker<T> invoker) throws RpcException;
/**
* 引用遠程服務:<br>
* 1. 當用戶調(diào)用refer()所返回的Invoker對象的invoke()方法時,協(xié)議需相應執(zhí)行同URL遠端export()傳入的Invoker對象的invoke()方法。<br>
* 2. refer()返回的Invoker由協(xié)議實現(xiàn),協(xié)議通常需要在此Invoker中發(fā)送遠程請求。<br>
* 3. 當url中有設置check=false時,連接失敗不能拋出異常,需內(nèi)部自動恢復。<br>
*
* @param <T> 服務的類型
* @param type 服務的類型
* @param url 遠程服務的URL地址
* @return invoker 服務的本地代理
* @throws RpcException 當連接服務提供方失敗時拋出
*/
<T> Invoker<T> refer(Class<T> type, URL url) throws RpcException;
}
<!-- 聲明協(xié)議,如果沒有配置id,將以name為id -->
<dubbo:protocol id="xxx1" name="xxx" />
<!-- 引用協(xié)議,如果沒有配置protocol屬性,將在ApplicationContext中自動掃描protocol配置 -->
<dubbo:service protocol="xxx1" />
<!-- 引用協(xié)議缺省值,當<dubbo:service>沒有配置prototol屬性時,使用此配置 -->
<dubbo:provider protocol="xxx1" />
Maven項目結構:
src
|-main
|-java
|-com
|-xxx
|-XxxProtocol.java (實現(xiàn)Protocol接口)
|-XxxExporter.java (實現(xiàn)Exporter接口)
|-XxxInvoker.java (實現(xiàn)Invoker接口)
|-resources
|-META-INF
|-dubbo
|-org.apache.dubbo.rpc.Protocol (純文本文件,內(nèi)容為:xxx=com.xxx.XxxProtocol)
XxxProtocol.java:
package com.xxx;
import org.apache.dubbo.rpc.Protocol;
public class XxxProtocol implements Protocol {
public <T> Exporter<T> export(Invoker<T> invoker) throws RpcException {
return new XxxExporter(invoker);
}
public <T> Invoker<T> refer(Class<T> type, URL url) throws RpcException {
return new XxxInvoker(type, url);
}
}
XxxExporter.java:
package com.xxx;
import org.apache.dubbo.rpc.support.AbstractExporter;
public class XxxExporter<T> extends AbstractExporter<T> {
public XxxExporter(Invoker<T> invoker) throws RemotingException{
super(invoker);
// ...
}
public void unexport() {
super.unexport();
// ...
}
}
XxxInvoker.java:
package com.xxx;
import org.apache.dubbo.rpc.support.AbstractInvoker;
public class XxxInvoker<T> extends AbstractInvoker<T> {
public XxxInvoker(Class<T> type, URL url) throws RemotingException{
super(type, url);
}
@Override
protected Result doInvoke(Invocation invocation) throws Throwable {
// ...
}
}
META-INF/dubbo/org.apache.dubbo.rpc.Protocol:
xxx=com.xxx.XxxProtocol
Copyright©2021 w3cschool編程獅|閩ICP備15016281號-3|閩公網(wǎng)安備35020302033924號
違法和不良信息舉報電話:173-0602-2364|舉報郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號
聯(lián)系方式:
更多建議: