消费端调用

通过dubbo获取某个服务提供者的ip dubbo获取调用方信息_通过dubbo获取某个服务提供者的ip

1、在业务层代码中调用远程接口的方法时,实际上是调用的本地创建的代理对象。即在《4.4.3 创建服务类的本地代理》中创建的代理对象。

2、在该代理对象中,调用了InvokerInvocationHander.invoke方法。远程调用以Invcation、Result为中心,在这个方法中根据调用的远程方法和传入的参数构建RpcInvcation对象,该对象中的成员变量包括远程调用的方法名、方法参数类型、参数值等值,该RpcInvcation对象作为后续invoke方法的请求参数。

3、根据《4.4.2 远程引用服务》中对Invoker对象的封装顺序,首先调用MockClusterInvoker.invoke方法,根据url中的参数mock提供了三种策略。

       1)若mock的参数值为空或者为“false”,则不需要mock,直接调用FailoverClusterInvoker;

       2)若mock参数值以“force”开头,则调用MockInvoker,根据mock参数值后面的字符串,分几种情况:

       2.1)若是“return”,则直接返回RpcResult对象,value=null;

       2.2)若是“return”开头,也返回RpcResult对象,但value值根据参数值来定:先获取远程方法的返回值类型,然后根据后面字符串来确定value的值:若是“empty”则value等于返回值类型实例;若是null,则value=null;若是ture,value=true;若是false,则value=false;若是\开头,\结尾的字符串,则将该字符串赋值给value;若是数字,则将数字赋值给value;若是{开头,则将内容初始化为Map对象赋值给value;若是[开头,则将内容初始化为List对象赋值给value;否则将剩余的参数值赋值给value;

   3)不是以上两种情况的,则先执行FailoverClusterInvoker,若出现RpcException异常再执行MockInvoker。

4、在执行FailoverClusterInvoker.invoke方法(默认调用策略),在该方法中完成集群路由策略的选择。

1)通过目录服务(RegistryDirectory)查找所有订阅的服务提供者的Invoker对象列表,其中调用AbstractDirectory.list(Invocation)方法,在该方法中根据Dubbo管理系统设置的路由信息调用Router.route方法筛选Invoker对象列表;

2)若Invoker对象列表中存在记录,则根据列表中第一个Invoker对象中URL中的参数loadbalance的值决定选择哪个负载均衡策略类(该参数在标签<dubbo:method>的loadbalance中配置,目前支持random、roundrobin、leastactive、consistenthash四种负载均衡策略);若没有配置该loadbalance参值,则默认选择RandomLoadBalance类作为负载均衡策略;

3)根据上一步选择负载均衡策略类选择一个Invoker。

5、以Dubbo协议为例,调用DubboInvoker.invoke方法。在Dubbo协议的服务引用逻辑中,创建了DubboInvoker对象,并封装了ExchangeClient对象,该对象是与服务端建立的链接对象。利用该对象进行远程请求消息的发送。首先判断远程调用类型是同步、异步还是oneway模式;

       1)<dubbo:method>标签的return属性配置为false,则是oneway模式,利用ExchangeClient对象向服务端发送请求消息之后,立即返回空RpcResult对象;

       2)若是<dubbo:method>标签的async属性配置为ture,则是异步模式,直接返回空RpcResult对象,由FutureFilter和DefaultFuture完成异步处理工作;

       3)若是同步,则发送请求之后线程进入等待状态,直到收到服务端的响应消息或者超时。
       消费端的调用流程图如下:

通过dubbo获取某个服务提供者的ip dubbo获取调用方信息_通过dubbo获取某个服务提供者的ip_02