学习小记 -- Dubbo服务调用过程

服务端流程:

  1. Netty收到请求, 根据协议得到信息并且反序列化成对象。
  2. 按照派发策略派发消息,默认是 All,封装成一个ChannleEventRunnable扔给业务线程池。
  3. 业务线程会根据消息类型,调用不同的处理类。
  4. 通过请求的id构造出一个响应。
  5. 通过一系列参数构造得到 serviceKey ,从之前服务暴露生成的 exporterMap 中得到对应的 Invoker ,然后调用真实的实现类。
  6. 返回响应。

客户端流程;

  1. 调用接口方法,实际上调用的是代理类。
  2. 通过路由和负载均衡得到invoker。
  3. 在经过负载均衡筛选,得到一个invoker,这里有很多中类型的容错方式,默认使用FailoverClusterInvoker。
  4. 然后invoker发起调用。
  5. 调用方式有三种:onWay、异步、同步(这里同步的方式其实是Dubbo帮我们实现的future,get()的操作,本质上还是异步的)。
  6. 调用过程:组装一个request,构造一个 future(future内部会将请求Id和future存在ConcurrentHashMap中),调用NettyClient的send方法发送请求(引申下问题)。
  7. 接收到响应,客户端经过反序列化,通过响应的id,在之前存入的ConcurrentHashMap中找到对应的future,塞入response,唤醒等待线程,完成一次远程调用全过程。

问:Dubbo内部本质是异步操作,只不过是Dubbo本身帮我们做了Future.get的方法,使我们感觉到是同步的,既然这样,那Dubbo内部异步返回的时候是如何找到所对应的future的呢?

答:在DefaultFuture内部,可以看到一个全局唯一的ID,跟DefaultFuture一同被放在了ConcurrentHashMap中。之后的response通过id找到对应的future,塞入response,唤醒等待线程。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值