- 下方 淡蓝背景( 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、查找提供端请求对应的Invoker,在接口提供者初始化时,每个接口都会创建一个Invoker和Exporter,Exporter持有invoker实例,Exporter对象保存在DubboProtocol的exporterMap中,key是由URL生成的serviceKey,此时通过Invocation中的信息就可还原该serviceKey并且找到对应的Exporter和Invoker,在分析提供者初始化代码时知道它是Invoker-Filter的头节点,激活Filter后调用由ProxyFactory生成的Invoker:
调用invoker.invoke时,通过反射调用最终的服务实现执行相关逻辑
参考:https://blog.csdn.net/yjp198713/article/details/79474622