dubbo消费端调用过程

本文详细解析了Dubbo RPC调用流程,包括客户端和服务端的主要步骤。客户端涉及代理实现、集群容错、负载均衡及网络通信;服务端则关注消息接收、Invoker与Exporter的使用及服务实现调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调用链

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

满眼都是 Invoker

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值