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