Invocation就是用一个Bean存储当前调用方法的参数,其本质就是一个普通的Bean而已。
Invoker:
1、Class getInterface() :获取服务提供者的接口。
Result invoke(Invocation invocation) throws RpcException :调用服务,返回调用结果
+++++++++++++++++++++++++++++++++++++++++++++++++++++++
构建参数invocation 对象,然后调用 Result result = invoker.invoke(inv); 实现调用服务的方法
同时返回结果result
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
我们看到使用的 Server 实现类是 HeaderExchangeServer 。
我们看到使用的 Client 实现类是 ReferenceCountExchangeClient 和 LazyConnectExchangeClient 。
调用前对参数进行codec编码
- 编码 Result 对象,写入需要编码的字段。
- 对应的解码,在 DecodeableRpcResult 中。
-
CodeSupport#getSerialization(url, proto)
方法,获得 Serialization 对象,用于下面反序列化内容体的每个字段。 - 获得请求或响应的编号。
- 解析响应( Response )。
- 解析请求( Request )
- 使用 DecodeableRpcResult 解码。前者,比较好理解
解码 `dubbo` `path` `version` 解码隐式传参集合 解码方法、方法签名、方法参数集合 进一步解码方法参数,主要为了参数返回 当服务提供者者,返回服务消费者调用结果,前者编码的 RpcResult 对象,后者解码成 DecodeableRpcResult 对象
同步调用
在 dubbo://
协议的调用,一共分成三种:
- sync 同步调用
- async 异步调用
- oneway 单向调用
调用 DubboInvoker#invoke(Invocation)
方法,调用服务
在 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 接口,事件通知过滤器
+++++++++++++++===++++++++++++++++++++++++++++++++++++++++
远程调用(HTTP)
从定义上我们可以看出,不是我们常规理解的 HTTP 调用,而是 Spring 的 HttpInvoker
- 从
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://
协议实现类。