服务消费方发起请求
1.当服务的消费方引用了某远程服务,服务的应用方在 spring 的配置实例如下:
<dubbo:reference id="demoService" interface="com.alibaba.dubbo.demo.DemoService" />
demoService 实例其实是代理工厂生产的代理对象(大家可以参考代理那部分生
成的伪代码),在代码中调用 demoService.sayHello(“world!”)时,1. 将方法名方法参数传入
InvokerInvocationHandler 的 invoke 方
对于 Object 中的方法 toString, hashCode, equals 直接调用 invoker 的对应方法,
这里对于 Object 的方法需要被远程调用吗?调用了是不是报错比默认处理更好呢??
远程调用层是以 Invocation, Result 为中心, 这里根据要调用的方法以及传入
的参数构建 RpcInvocation 对象,作为 Invoker 的入参
2. MockClusterInvoker 根据参数提供了三种调用策略
不需要mock,直接调用 FailoverClusterInvoker
强制mock,调用 mock 先调 FailoverClusterInvoker,调用失败在 mock
3. FailoverClusterInvoker 默认调用策略
通过目录服务查找到所有订阅的服务提供者的 Invoker 对象
路由服务根据策略来过滤选择调用的 Invokers
通过负载均衡策略LoadBalance来选择一个Invoker
4. 执行选择的 Invoker.inoker(invocation)
经过监听器链,默认没有
经过过滤器链,内置实现了很多
执行到远程调用的 DubboInvoker
5. DubboInvoker
根据url也就是根据服务提供者的长连接,这里封装成交互层对象
ExchangeClient 供这里调用
判断远程调用类型同步,异步还是 oneway 模式
ExchangeClient 发起远程调用,底层 remoting 不在这里描述了
获取调用结果:Oneway 返回空 RpcResult
异步,直接返回空 RpcResult, ResponseFuture 回调
同步, ResponseFuture 模式同步转异步,等待响应返回服务提供方接收调用请求
同样我们也是 rpc 调用层 DubboProtocol 层开始分析,对于通信层 remoting 的数
据接收反序列等等过程不做分析。
DubboProtocol的requestHandler是ExchangeHandler的实现,是remoting 层接收
数据后的回调。
6.requestHandler.replay
方法接收请求消息,这里只处理远程调用消息 Invocation。
1. 通过 Invocation 获取服务名和端口组成 serviceKey=com.alibaba.dubbo.demo.
DemoService:20880, 从 DubboProtocol 的 exproterMap 中获取暴露服务的
DubboExporter, 在从 dubboExporter 获取 invoker 返回
2. 经过过滤器链
3. 经过监听器链
4. 到达执行真正调用的 invoker, 这个 invoker 由代理工厂 ProxyFactory.
getInvoker(demoService, DemoService.class, registryUrl)创建,具体请看代理那
部分介绍。
调用 demoService 实例方法,将结果封装成 RpcResult 返回
5. 交换层构建 Response,通过 Remoting 层编码传输将结果响应给调用方