dubbo消费端调用过程

dubbo消费端调用过程

  • 下方 淡蓝背景( Consumer ):服务消费方使用的接口
  • 上方 淡绿色背景( Provider ):服务提供方使用的接口
  • 中间 粉色背景( Remoting ):通信部分的接口

dubbo消费端调用过程

 

1、引用接口,此时可看到接口实现,为代理实现,handler是InvokerInvocationHandler

dubbo消费端调用过程

2、进入InvokerInvocationHandler,执行invoke方法,进入集群容错处理FailoverClusterInvoker,接下来进行负载均衡处理

doSelect(LoadBalance loadbalance, Invocation invocation, List<Invoker<T>> invokers, List<Invoker<T>> selected) 选择一个Invoker, 消费端生成的invoker数=服务节点数 * 消费端引用的方法数;引用的每个方法的每个节点都会生成一个invoker;

3、选择好一个invoker后,开始执行invoke方法进行调用,Result result = invoker.invoke(invocation);

4、调用的是DubboInvoker实例,invoke方法是它的抽象父类AbstractInvoker的方法,父类invoke中再调用具体实现类DubboInvoker的 protected Result doInvoke(final Invocation invocation)方法,

5、通讯通过netty进行

 

服务端接收消息:

1、NettyServer开启服务时,使用的handler是NettyHandler,然后调用handler的接收消息方法

2、NettyHandler.messageReceived(ChannelHandlerContext ctx, MessageEvent e)

3、然后通过DubboProtocol的reply方法,进行调用,getInvoker()从集合中获取Exporter,

protected final Map<String, Exporter<?>> exporterMap = new ConcurrentHashMap<String, Exporter<?>>();

4、然后从Exporter中通过exporter.getInvoker(),调用AbstractProxyInvoker的实现类JavassistProxyFactory的getInvoker方法,

5、然后调用其抽象类AbstractProxyInvoker的invoke方法,执行JavassistProxyFactory类中的wrapper.invokeMethod(proxy, methodName, parameterTypes, arguments); 

6、Wrapper是通过JavassistProxyFactory字节码生成的一个实现类的子类,通过这个包装类调用实现类的方法。