服务加载机制

SPI服务发现

SPI机制优势

相较于使用CGLIBJDK Proxy生成服务的动态代理机制,

SPI机制实现

类加载

类组装

客户端服务请求

完整流程

img

服务代理

发起请求

dubbo支持同步请求和异步请求。对于同步请求,消费者线程间柱塞,直至请求的响应到来;对于异步请求,发起请求后,消费者线程将不会柱塞,响应到来后支持线程将处理响应数据。同步请求和异步请求的区别在于,执行等待响应及响应数据反序列化的线程不同。

同步请求流程

image-20240528014615836

  1. 消费者发出请求,立即拿到CompletableFuture对象,不会在发送方法处阻塞;

  2. 消费者线程自动调用ThreadlessExecutor.waitAndDrain(),在线程池任务队列上等待任务到来,此时消费者线程阻塞

  3. 当收到响应时,IO线程完成响应头反序列化,并生成响应数据部分反序列化任务,填充到ThreadlessExecutor任务队列中

  4. 线程池中任务将由消费者线程执行,得到业务结果之后,调用Future.set()方法进行设置,之后waitAndDrain()方法返回;

  5. 消费者线程从Future中拿到结果值。

异步请求流程

  1. 消费者发出请求,立即拿到CompletableFuture对象,不会在发送方法处阻塞;

  2. 直接返回CompletableFuture对象,此时消费者线程不会阻塞

  3. 当收到响应时,IO 线程完成响应头反序列化,并生成响应数据部分反序列化任务提交到该请求对应的共享线程池中

  4. 数据部分反序列化任务完成后,调用Future.set()方法进行设置,并唤醒等待在CompletableFuture上线程,执行回调;

  5. 消费者线程从Future中拿到结果值。

发起请求入口

线程模型

image-20240527220711703

请求编码

/dev-guide/images/dubbo_protocol_header.jpg

发送请求的ExchangeClient#request方法执行消息编码,在编码后再发送出去。

服务端服务响应

请求解码

服务调用

客户端获取结果

响应解码

唤醒消费者

 

img