Dubbo消费端调用服务端过程分析

àì夳堔傛蜴生んèń 2022-04-16 00:43 352阅读 0赞

调用链的整体流程图

下面蓝色部分是消费端的调用过程,大致过程分为Proxy–>Filter–>Invoker–>Directory–>LoadBalance–>Filter–>Invoker–>Client

在这里插入图片描述

集群容错的架构图

在集群调用失败时,Dubbo 提供了多种容错方案,缺省为 failover 重试。

在这里插入图片描述

源码分析

dubbo-master consumer代码

  1. public class Consumer {
  2. public static void main(String[] args) {
  3. ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{ "META-INF/spring/dubbo-demo-consumer.xml"});
  4. context.start();
  5. DemoService demoService = (DemoService) context.getBean("demoService"); // 获取远程服务代理
  6. String hello = demoService.sayHello("world"); // 执行远程方法
  7. System.out.println(hello); // 显示调用结果
  8. }
  9. }

demoService是一个proxy代理类,执行demoService.sayHello方法,其实是调用InvokerInvocationHandler.invoke方法,应该还记得proxy代理类中我们new了一个InvokerInvocationHandler实例

consumer ref初始化分析

  1. com.alibaba.dubbo.config.spring.ReferenceBean
  2. >com.alibaba.dubbo.config.spring.ReferenceBean#getObject
  3. >com.alibaba.dubbo.config.ReferenceConfig#get
  4. >com.alibaba.dubbo.config.ReferenceConfig#init
  5. >com.alibaba.dubbo.config.ReferenceConfig#createProxy
  6. // 注册中心列表
  7. >com.alibaba.dubbo.config.AbstractInterfaceConfig#loadRegistries
  8. >com.alibaba.dubbo.registry.integration.RegistryProtocol#refer
  9. >com.alibaba.dubbo.registry.integration.RegistryProtocol#doRefer
  10. // 注册中心注册
  11. >com.alibaba.dubbo.registry.RegistryService#register
  12. // 注册中心监听
  13. >com.alibaba.dubbo.registry.integration.RegistryDirectory#subscribe
  14. >com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper#refer
  15. >com.alibaba.dubbo.rpc.protocol.ProtocolListenerWrapper#refer
  16. // dubbo协议的调用
  17. >com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol#refer
  18. >com.alibaba.dubbo.rpc.protocol.dubbo.DubboInvoker
  19. >com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol#getClients
  20. // 共享连接
  21. >com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol#getSharedClient
  22. // 新连接
  23. >com.alibaba.dubbo.rpc.protocol.dubbo.DubboProtocol#initClient
  24. >com.alibaba.dubbo.remoting.exchange.Exchangers#connect
  25. // 构造refer调用责任链
  26. >com.alibaba.dubbo.rpc.protocol.ProtocolFilterWrapper#buildInvokerChain

consumer调用分析

  1. >com.alibaba.dubbo.rpc.proxy.InvokerInvocationHandler#invoke
  2. >com.alibaba.dubbo.rpc.cluster.support.wrapper.MockClusterInvoker#invoke
  3. >com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker#invoke
  4. >com.alibaba.dubbo.rpc.cluster.LoadBalance
  5. >com.alibaba.dubbo.rpc.cluster.support.FailoverClusterInvoker#doInvoke
  6. // 负载均衡
  7. >com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker#select
  8. >com.alibaba.dubbo.rpc.cluster.support.AbstractClusterInvoker#doselect
  9. >com.alibaba.dubbo.rpc.cluster.LoadBalance#select
  10. // 调用
  11. >com.alibaba.dubbo.rpc.Invoker#invoke
  12. >com.alibaba.dubbo.rpc.protocol.InvokerWrapper#invoke
  13. >com.alibaba.dubbo.rpc.listener.ListenerInvokerWrapper#invoke
  14. // 责任链invoke
  15. >com.alibaba.dubbo.rpc.protocol.dubbo.filter.FutureFilter#invoke
  16. >com.alibaba.dubbo.monitor.support.MonitorFilter#invoke
  17. >com.alibaba.dubbo.rpc.protocol.AbstractInvoker#invoke
  18. >com.alibaba.dubbo.rpc.protocol.dubbo.DubboInvoker#doInvoke
  19. >com.alibaba.dubbo.rpc.protocol.dubbo.
  20. ReferenceCountExchangeClient#request
  21. >com.alibaba.dubbo.remoting.exchange.
  22. support.header.HeaderExchangeClient#request
  23. >com.alibaba.dubbo.remoting.exchange.
  24. support.header.HeaderExchangeChannel#request
  25. // 创建DefaultFuture
  26. >new com.alibaba.dubbo.remoting.exchange.
  27. support.DefaultFuture
  28. // NettyChannel 发送数据
  29. >com.alibaba.dubbo.remoting.
  30. transport.netty4.NettyChannel#send

发表评论

表情:
评论列表 (有 0 条评论,352人围观)

还没有评论,来说两句吧...

相关阅读