(原创)Dubbo源码之消费者发起请求过程

客户端发起请求:因为真正执行service方法的是service之前创建的proxy,所以,在执行方法的时候,执行的是代理中nvocationHandler的invoke方法

InvokerInvocationHandler类:
invoke方法:
因为最后封装的是MockClusterInvoker,所以执行MockClusterInvoker类中的invoke方法,将执行方法的参数封装成RpcInvocation类。

MockClusterInvoker类:
invoke方法:
通过MockClusterInvoker中存储的directory,执行父类AbstractClusterInvoker类中的invoke方法

AbstractClusterInvoker类:
invoke方法:
通过directory获取list,调用AbstractDirectory类中的list方法

AbstractDirectory类:
list方法:
执行RegistryDirectory类中的doList方法,参数为之前封装的RpcInvocation类,此类中具体参数
[world](传递的参数)
{}
null(invoker)
sayHello(方法名)
[class java.lang.String](返回类型)

RegistryDirectory类:
doList方法:
获取之前创建demoService代理时,创建的伪装为invoker的RegistryDirectory,缓存key为方法名,value为初始化service代理时存储的伪装为invoker的RegistryDirectory,
获取RegistryDirectory中存的invoker列表,返回AbstractClusterInvoker类的invoke方法。

AbstractClusterInvoker类:
invoke方法:
获取路由规则列表,循环路由规则,筛选invokers列表。将筛选结果返回,执行FailoverClusterInvoker类中doInvoke方法。

FailoverClusterInvoker类:
doInvoke方法:
获取失败重试次数,默认为2次,不包括第一次请求,执行select方法,参数为
负载均衡策略:默认com.alibaba.dubbo.rpc.cluster.loadbalance.RoundRobinLoadBalance
invocation:封装请求参数的RpcInvocation,重新获取的invoker列表(防止invoker列表出现变化)。
经过select负载均衡算法结束后,筛选出一个invoker进行执行,执行invoker的invoke方法。
执行InvokerWrapper类的invoke方法,执行ListenerInvokerWrapper类中的invoke方法,执行ConsumerContextFilter类中的invoke方法,执行FutureFilter类中的invoke方法。
,执行AbstractInvoker类中invoke方法。

AbstractInvoker类:
invoke方法:
将之前筛选出的invoker存进之前封装的RpcInvocation对象中,执行DubboInvoker类中的doInvoke方法。

DubboInvoker类:
doInvoke方法:
获取之前存储的NettyClient,执行currentClient.request方法参数为存有服务提供者URL的invoker对象的RpcInvocation对象。
执行HeaderExchangeClient的request方法。跳转到HeaderExchangeChannel类中的request方法,将RpcInvocation封装为Request对象执行,最终通过NettyChannel执行send方法,
通过org.jboss.netty.channel.Channel类的write方法传递Request对象。

HeaderExchangeChannel类:
request方法:
创建 DefaultFuture future = new DefaultFuture(channel, req, timeout);对象,
DefaultFuture对象的构造方法重点取得请求request的ID,将本类为value,ID为KEY加以缓存。异步执行channel.send(req)方法。
直接返回刚才创建的,暂时还没有服务提供者返回值的DefaultFuture对象。回到DubboInvoker类的doInvoke方法中,
继续执行(Result) currentClient.request(inv, timeout).get()这条语句,其中该语句前半部分:currentClient.request(inv, timeout)已经执行完毕。
得到的是一个暂时还没有服务提供者返回值的DefaultFuture对象。执行该对象的get方法。

DefaultFuture类
get方法:
调get(int timeout)方法:
判断是否成功调用了服务提供者,即判断对象内response是否有值,如果没有将进程暂时处于等待状态。

猜你喜欢

转载自287746074.iteye.com/blog/2421832
今日推荐