`

(原创)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是否有值,如果没有将进程暂时处于等待状态。

分享到:
评论

相关推荐

    dubbo示例源码及相关文档

    而在异步调用中,Consumer仅发起请求,无需等待结果,提高系统吞吐量。 六、服务治理 Dubbo提供了丰富的服务治理功能,包括服务分组、负载均衡、容错机制(如Failover、Failfast、Failsafe、Fallback、Loadbalance...

    netty手写dubbo源码分享

    1. 请求处理:当服务消费者发起调用请求时,Netty会将请求消息封装成ByteBuf并通过Socket发送到服务提供者。服务提供者的Server端接收到请求后,解析消息,通过反射或动态代理找到对应的服务方法并执行。 2. 响应...

    dubbo应用实例源码工程

    源码将展示如何配置服务接口、参数类型和返回值,以及如何发起RPC请求和处理响应。 4. **服务治理**:包括负载均衡、容错机制、服务监控等。例如,Dubbo支持随机、轮询、最少活跃调用数等多种负载均衡策略,源码中...

    dubbo实例练习源码

    Dubbo支持同步和异步调用模式,异步调用可以在不阻塞当前线程的情况下发起请求,提高系统并发处理能力。同时,还可以设置回调机制,处理调用结果。 总结,这个"Dubbo实例练习"涵盖了Dubbo的核心概念和实际操作,...

    dubbo源码下载

    《深入剖析Dubbo源码:探索2.5.9版本的奥秘》 在软件开发领域,理解并掌握开源框架的源码对于提升技术能力、优化应用性能具有至关重要的作用。今天,我们将聚焦于分布式服务框架Dubbo,通过下载并研究其2.5.9版本的...

    ZooKeeper+dubbo+spring+springMvc+mybatis实例源码下载

    项目结构中,"DubboConsumer"代表服务消费者端,它负责发起对服务提供者的请求;而"DubboProvider"则是服务提供者端,包含实际的业务逻辑和对外提供的服务接口。这两个项目被打成WAR包,部署在Tomcat服务器上,以...

    Dubbo龙果学院简易版支付项目源码

    2. **服务消费者(Consumer)**:消费者模块负责调用服务提供者的接口,完成支付请求的发起和结果处理。 3. **配置文件**:可能包括Spring的配置文件,用于设置Dubbo的各个组件,如服务暴露、引用、协议、注册中心...

    dubbo服务提供者的web应用实例

    首先,我们需要理解Dubbo的核心概念,包括服务(Service)、消费者(Consumer)、注册中心(Registry)和协议(Protocol)。服务提供者是提供特定业务功能的组件,它定义了服务接口并实现该接口的业务逻辑。 【详细...

    分布式RPC框架Apache Dubbo

    然后启动服务消费者项目,消费者通过Zookeeper找到服务提供者并发起请求。 四、Dubbo管理控制台 Dubbo提供了Web界面的管理控制台,方便开发者监控服务的运行状态。配置控制台主要包括以下步骤: 1. 下载Dubbo-admin...

    dubbo-provider/dubbo-consumer

    服务消费者在调用服务时,可以根据服务名、版本号等信息找到对应的服务实例,并发起RPC(Remote Procedure Call)请求。消费者同样可以配置超时时间、重试策略等参数来优化调用性能和容错性。 Dubbo的核心功能包括...

    dubbo之HelloWorld

    2. **服务消费者(Consumer)**:服务消费者是需要使用服务提供者提供的服务的模块,它通过注册中心获取服务提供者的地址,并发起远程调用。 3. **注册中心(Registry)**:注册中心是连接服务提供者和消费者的桥梁...

    Dubbo入门---搭建一个最简单的Demo框架

    - **服务消费者(Consumer)**:调用服务的模块,通过Dubbo框架向服务提供者发起请求。 - **服务注册中心(Registry)**:存储服务提供者信息的中心节点,服务消费者通过注册中心找到服务提供者。 6. **Dubbo核心...

    dubbo-master

    2. **服务消费者(Consumer)**:服务消费者是调用服务的实体,它从注册中心获取服务提供者的地址,然后发起远程调用。消费者可以通过动态代理、接口引用等方式消费服务。 3. **注册中心(Registry)**:注册中心是...

    dubbo的服务发布与服务引用

    本文将深入源码,详细解析这两个关键过程,帮助你理解Dubbo是如何在服务提供者和服务消费者之间建立通信桥梁的。 一、服务发布 1. 配置服务:首先,服务提供者需要在配置文件(如Spring XML)中定义服务接口及其...

    dubbo_demo实例

    - 服务消费者通过Dubbo协议发起请求到服务提供者。 - 服务提供者接收到请求后,执行相应业务逻辑,然后返回结果。 - 服务消费者的回调方法接收到服务提供者返回的结果。 7. **Dubbo特性** - **负载均衡**:...

    springboot+dubbo+zookeeper整合

    `演示.mp4`可能是一个操作演示视频,详细展示了如何启动Zookeeper(参考`启动zookeeper.png`)和如何发起请求(参考`请求的接口地址及返回结果.png`),这对于理解整个系统的运作流程非常有帮助。 总的来说,这个...

    dubbo-demo-provider-consumer

    3. **服务消费者(Consumer)**:服务消费者是调用服务提供者接口的组件,它通过注册中心查找服务提供者,并发起远程调用请求。 4. **服务注册与发现**:Dubbo通过注册中心(如ZooKeeper)实现服务的注册与发现,...

    dubbo-dubbo-2.5.3-codeanalysis:dubbo源码分析

    服务消费者在发起请求时,会生成一个 RpcInvocation 对象,包含调用的接口、方法和参数等信息,然后通过传输层发送到服务提供者。服务提供者接收到请求后,根据 RpcInvocation 解析出调用的具体方法,并执行相应的...

    dubbo的jar包 包含javasoc source 以及jar

    - **服务消费者(Consumer)**:服务消费者则是调用服务的一方,它从注册中心获取服务提供者的地址,然后通过这些地址发起远程调用。消费者可以动态调整服务调用策略,如负载均衡、重试机制等。 - **注册中心...

    dubbo交易系统后台服务端.zip

    《Dubbo交易系统后台服务端源码解析》 在当今的互联网行业中,分布式服务框架的重要性不言而喻,其中Dubbo作为阿里巴巴开源的一款高性能、轻量级的服务治理框架,深受广大开发者喜爱。本资料包“dubbo交易系统后台...

Global site tag (gtag.js) - Google Analytics