1. 将方法名方法参数传入InvokerInvocationHandler的invoke方法中,对于Object中的方法toString, hashCode, equals直接调用invoker的对应方法(远程调用层是以Invocation, Result为中心, 这里根据要调用的方法以及传入的参数构建RpcInvocation对象,作为Invoker的入参)。
2. 然后进入MockClusterInvoker.invoke()方法中,MockClusterInvoker根据参数提供了三种调用策略:
(1)不需要mock, 直接调用FailoverClusterInvoker
(2)强制mock,调用mock
(3)先调FailoverClusterInvoker,调用失败在mock
3. FailoverClusterInvoker默认调用策略
(1)通过目录服务查找到所有订阅的服务提供者的Invoker对象
(2)路由服务根据策略(比如:容错策略)来过滤选择调用的Invokers
(3)通过负载均衡策略LoadBalance来选择一个Invoker
4. 执行选择的Invoker.inoker(invocation)
(1)经过监听器链,默认没有
(2)经过过滤器链,内置实现了很多
(3)执行到远程调用的DubboInvoker
5. DubboInvoker
(1)根据url 也就是根据服务提供者的长连接,这里封装成交互层对象ExchangeClient供这里调用
(2)判断远程调用类型同步,异步还是oneway模式
(3)ExchangeClient发起远程调用,底层remoting不在这里描述了
获取调用结果:
(1)Oneway返回空RpcResult
(2)异步,直接返回空RpcResult, ResponseFuture回调
(3)同步, ResponseFuture模式同步转异步,等待响应返回
同样我们也是rpc调用层DubboProtocol层开始分析,对于通信层remoting的数据接收反序列等等过程不做分析。
DubboProtocol的requestHandler是ExchangeHandler的实现,是remoting层接收数据后的回调。
requestHandler.replay方法接收请求消息,这里只处理远程调用消息Invocation。
其中,DecodeableRpcInvocation.decode()方法实现反序列化解析(传输过程中服务消费方先encode,所以这里需要decode)。
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层编码传输将结果响应给调用方。
服务消费方发起远程调用的底层通信
服务提供方接收请求并响应的底层通信
本文为参考网上资料整理,是为了以后学习用,请勿喷。