dubbo调用指定单个服务ip dubbo调用服务过程_抽象类

Invocation就是用一个Bean存储当前调用方法的参数,其本质就是一个普通的Bean而已。

Invoker:
1、Class getInterface() :获取服务提供者的接口。
Result invoke(Invocation invocation) throws RpcException :调用服务,返回调用结果

+++++++++++++++++++++++++++++++++++++++++++++++++++++++

dubbo调用指定单个服务ip dubbo调用服务过程_远程调用_02

构建参数invocation 对象,然后调用  Result result = invoker.invoke(inv); 实现调用服务的方法

  同时返回结果result

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

我们看到使用的 Server 实现类是 HeaderExchangeServer 。

我们看到使用的 Client 实现类是 ReferenceCountExchangeClient 和 LazyConnectExchangeClient 。

调用前对参数进行codec编码

  • 编码 Result 对象,写入需要编码的字段。
  • 对应的解码,在 DecodeableRpcResult 中。
  • CodeSupport#getSerialization(url, proto) 方法,获得 Serialization 对象,用于下面反序列化内容体的每个字段。
  • 获得请求或响应的编号。
  • 解析响应( Response )。
  • 解析请求( Request )
  • 使用 DecodeableRpcResult 解码。前者,比较好理解

dubbo调用指定单个服务ip dubbo调用服务过程_异步调用_03


解码 `dubbo` `path` `version` 解码隐式传参集合 解码方法、方法签名、方法参数集合 进一步解码方法参数,主要为了参数返回 当服务提供者者,返回服务消费者调用结果,前者编码的 RpcResult 对象,后者解码成 DecodeableRpcResult 对象


同步调用

在 dubbo:// 协议的调用,一共分成三种:

  1. sync 同步调用
  2. async 异步调用
  3. oneway 单向调用

dubbo调用指定单个服务ip dubbo调用服务过程_远程调用_04

调用 DubboInvoker#invoke(Invocation) 方法,调用服务

dubbo调用指定单个服务ip dubbo调用服务过程_远程调用_05

dubbo调用指定单个服务ip dubbo调用服务过程_远程调用_06

在 DubboProtocol 类中,实现了自己的 ExchangeHandler 对象,处理请求、消息、连接、断开连接等事件。对于服务消费者的远程调用,通过 #reply(ExchangeChannel channel, Object message) 和 #reply(Channel channel, Object message) 方法来处理

  • 用于处理服务消费者的同步调用和异步调用的请求。
  • 调用 #getInvoker(channel, invocation) 方法,获得请求对应的 Invoker 对象
  • exporterMap 集合中,获得 Exporter 对象。
  • 获得 Invoker 对象
  • 设置调用方的地址。
  • 调用 Invoker#invoke(invocation) 方法,执行调用,并返回结果
  • 调用 #invoke(channel, methodKey) 方法,执行对应的方法

异步调用

2. FutureAdapter

com.alibaba.dubbo.rpc.protocol.dubbo.FutureAdapter ,实现 Future 接口,适配 ResponseFuture 。通过这样的方式,对上层调用方,透明化 ResponseFuture 的存在

com.alibaba.dubbo.rpc.protocol.dubbo.filte.FutureFilter ,实现 Filter 接口,事件通知过滤器

dubbo调用指定单个服务ip dubbo调用服务过程_dubbo调用指定单个服务ip_07

 

dubbo调用指定单个服务ip dubbo调用服务过程_dubbo调用指定单个服务ip_08

+++++++++++++++===++++++++++++++++++++++++++++++++++++++++

远程调用(HTTP)

从定义上我们可以看出,不是我们常规理解的 HTTP 调用,而是 Spring 的 HttpInvoker 

dubbo调用指定单个服务ip dubbo调用服务过程_dubbo调用指定单个服务ip_09

  • 从 exporterMap 中,获得 Exporter 对象。若已经暴露,直接返回。
  • 调用 ProxyFactory#getProxy(invoker) 方法,获得 Service Proxy 对象。
  • 调用 #doExport(impl, type, url) 抽象方法,执行子类实现的暴露服务。
  • 创建 Exporter 对象。基于 AbstractExporter 抽象类实现,覆写 #unexport() 方法,代码如下:
  • 取消暴露。
  • 调用 Runnable#run() 方法,执行取消暴露的回调方法。
  • 添加到 Exporter 集合。

3. HttpProtocol

com.alibaba.dubbo.rpc.protocol.http.HttpProtocol ,实现 AbstractProxyProtocol 抽象类,dubbo:// 协议实现类。

dubbo调用指定单个服务ip dubbo调用服务过程_远程调用_10