dubbo消费端调用过程
- 下方 淡蓝背景( Consumer ):服务消费方使用的接口
- 上方 淡绿色背景( Provider ):服务提供方使用的接口
- 中间 粉色背景( Remoting ):通信部分的接口
1、引用接口,此时可看到接口实现,为代理实现,handler是InvokerInvocationHandler
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字节码生成的一个实现类的子类,通过这个包装类调用实现类的方法。