Dubbo發布過程中,消費者呼叫過程

2022-09-07 21:03:13 字數 2948 閱讀 4541

目錄2.遠端物件rpcinvocation

我們從controller開始看起,當我們發起乙個request請求的時候,controller呼叫的是service,此處我們呼叫的dubbo引用服務的**類

iuserservice是乙個介面,實際呼叫的是乙個**類,我們接著往下看:

@restcontroller

public class usercontroller

}

實際上呼叫的是invokerinvocationhandler的invoke方法,內部呼叫的成員變數invoker的invoke方法,並使用請求方法、引數封裝了乙個遠端呼叫物件rpcinvocation,接下來我們看一下rpcinvocation物件都有什麼?構建完rpcinvocation物件,繼續執行invoke方法,如下

public class invokerinvocationhandler implements invocationhandler 

@override

public object invoke(object proxy, method method, object args) throws throwable

if ("tostring".equals(methodname) && parametertypes.length == 0)

if ("hashcode".equals(methodname) && parametertypes.length == 0)

if ("equals".equals(methodname) && parametertypes.length == 1)

//invoker = mockclusterinvoker

return invoker.invoke(new rpcinvocation(method, args)).recreate();

}}

經過上一章節dubbo發布過程中,消費者的初始化過程,我們知道此處的invoker是乙個被裝飾器包裝了的invoker

public class mockclusterinvokerimplements invoker

public result invoke(invocation invocation) throws rpcexception else if (value.startswith("force"))

//force:direct mock

result = domockinvoke(invocation, null);

} else catch (rpcexception e) else

result = domockinvoke(invocation, e);}}

}return result;

}}

this.invoker.invoke(invocation)首先呼叫的是抽象父類abstractclusterinvoker的invoke方法,呼叫list(invocation)從登錄檔中獲取呼叫者列表,此處返回的是方法對應的invokers,此處有乙個重要方法getmethodparameter,用來獲取方法的不同配置,此處是根據方法名稱獲取方法呼叫的負載方式,如果沒有配置,則走預設方式:random;拿到invoker及loadbalance之後,繼續執行doinvoke方法

public abstract class abstractclusterinvokerimplements invoker

rpcutils.attachinvocationidifasync(geturl(), invocation);

return doinvoke(invocation, invokers, loadbalance);

}protected list> list(invocation invocation) throws rpcexception

}

public abstract class abstractdirectoryimplements directory

list> invokers = dolist(invocation);

listlocalrouters = this.routers; // local reference

if (localrouters != null && !localrouters.isempty())

} catch (throwable t) }}

return invokers;

}}

public class registrydirectoryextends abstractdirectoryimplements notifylistener 

list> invokers = null;

map>> localmethodinvokermap = this.methodinvokermap; // local reference

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

if (invokers == null)

if (invokers == null)

if (invokers == null) }}

return invokers == null ? new arraylist>(0) : invokers;

}}

public class rpcinvocation implements invocation, serializable 

public rpcinvocation(string methodname, class<?> parametertypes, object arguments, mapattachments, invoker<?> invoker)

}

dubbo作為消費者註冊過程分析

請支援原創 先大概了解一下系統作為乙個消費者從啟動到註冊完成的過程 系統啟動時,引用service時首先將系統本身自己需要引用的服務註冊到zookeeper,然後訂閱系統需要的服務,最後,會接收到zookeeper傳送的訂閱資訊。比如乙個消費者註冊了乙個userservice,系統在啟動時,首先宣告...

dubbo消費者註冊到zookeeper失敗

概要 1.vm部署linux,然後部署了zookeeper服務,dubbo admin管理中心 2.本機開啟兩個工程,服務提供者 成功註冊 消費者 tomcat啟動未報異常,但是在dubbo admin就是找不到消費者 原因 在除錯其他bug時,不小心把依賴刪除了 com.github.sgrosc...

go saram 消費者呼叫邏輯

業務層 newconsumer client.mbrokers,group,topic,config cluster comsuer.go 構造consumer consumer,err sarama.newconsumerfromclient client.client c.client.refr...