DK's Notes DK's Notes
首页
导航站
  • Java-Se

    • Java基础
  • Java-Se进阶-多线程

    • 多线程
  • Java-Se进阶-java8新特性

    • java8新特性
  • Java-ee

    • JavaWeb
  • Java虚拟机

    • JVM
  • SQL 数据库

    • MySQL
  • NoSQL 数据库

    • Redis
    • ElasticSearch
    • MongoDB
  • ORM

    • MyBatis
    • MyBatis-Plus
  • Spring

    • Spring
  • SpringMVC

    • SpringMVC1
    • SpringMVC2
  • SpringCloud

    • SpringCloud
  • 中间件

    • RabbitMQ
    • Dubbo
  • 秒杀项目
  • Git
  • Linux
  • Docker
  • JWT
  • 面试
  • 刷题
开发问题😈
设计模式
关于💕
归档🕛
GitHub (opens new window)

风

摸鱼
首页
导航站
  • Java-Se

    • Java基础
  • Java-Se进阶-多线程

    • 多线程
  • Java-Se进阶-java8新特性

    • java8新特性
  • Java-ee

    • JavaWeb
  • Java虚拟机

    • JVM
  • SQL 数据库

    • MySQL
  • NoSQL 数据库

    • Redis
    • ElasticSearch
    • MongoDB
  • ORM

    • MyBatis
    • MyBatis-Plus
  • Spring

    • Spring
  • SpringMVC

    • SpringMVC1
    • SpringMVC2
  • SpringCloud

    • SpringCloud
  • 中间件

    • RabbitMQ
    • Dubbo
  • 秒杀项目
  • Git
  • Linux
  • Docker
  • JWT
  • 面试
  • 刷题
开发问题😈
设计模式
关于💕
归档🕛
GitHub (opens new window)
  • mybatis

  • mybatis-plus

  • Spring

  • SpringMvc

  • RabbitMQ

  • Dubbo

    • Dubbo知识体系
    • Dubbo
    • 服务注册(provider服务暴露)
    • 服务发现(consumer服务引入)
    • 服务调用过程
      • 1. dubbo请求处理流程
        • 1.1. consumer端处理流程
        • 1.2. provider端处理流程
    • SPI机制
    • 负载均衡机制
    • 服务容错、降级
    • Dubbo的服务异常处理
  • SpringCloud

  • 框架
  • Dubbo
zdk
2022-08-01
目录

服务调用过程

Table of Contents generated with DocToc (opens new window)

  • 1. dubbo请求处理流程
    • 1.1. consumer端处理流程
    • 1.2. provider端处理流程

# 1. dubbo请求处理流程

dubbo是个rpc框架,本质就是socket通信,把客户端的请求信息进行编码为二进制,然后通过socket发送数据。服务端接收二进制数据,解码,进行业务逻辑处理。过程涉及较多,记录如下。

# 1.1. consumer端处理流程

  1. 远程调用入口是InvokerInvocationHandler
  2. 根据调用的methodName,从注册表RegistryDirectory.methodInvokerMap缓存获取Invoker集合(服务方)。这些Invoker集合是consumer启动或服务端服务有变动,监听zk节点生成的。
  3. 使用路由进行过滤,获取过滤后的Invoker集合。默认是路由是MockInvokersSelector,TagRouter
  4. 使用负载均衡策略,从上步中的Invoker集合选取一个Invoker,后续就会请求这个具体的服务方
  5. consumer端filter chain执行。通常dubbo默认[ConsumerContextFilter,FutureFilter,MonitorFilter]。如果是泛化调用filter chain[ConsumerContextFilter,FutureFilter,MonitorFilter,GenericImplFilter]。filter chain作用是在请求前做一些公共处理,通常我们工作中最经常扩展这个
  6. Invoker执行调用。执行的是DubboInvoker.invoker(),该Invoker封装了NettyClient,可以进行网络通信
  7. netty调用,进行网络编码,然后发送数据
  8. 使用Future模式进行同步等待,直至获取响应数据或超时
  9. DefaultFuture阻塞等待provider响应结果
  10. netty遍历selectionkey,read事件,进行解码,接着使用NettyClientHandler读取接收数据
  11. 使用HeartbeatHandler进行接收处理数据,封装Response为ChannelEventRunnable,交由dubbo线程池异步处理。注意:HeartbeatHandler是网络发送和接收的入口
  12. ChannelEventRunnable处理接收事件,根据Response里面的唯一id获取DefaultFuture,把响应数据Response保存到DefaultFuture,同时唤醒DefaultFuture。即唤醒第8步。
  13. DefaultFuture阻塞被唤醒,获取到响应结果(响应结果在第12步已经被保存到DefaultFuture),返回业务数据,至此结束。

# 1.2. provider端处理流程

  1. nettyServer接收consumer端请求数据,进行解码
  2. dubbo层数据接入入口是HeartbeatHandler,封装请求信息为ChannelEventRunnable,使用dubbo线程池异步处理
  3. ChannelEventRunnable处理Request,根据请求数据内的group+interfaceName+version+port从缓存DubbotProtocol.exporterMap获取服务暴露对象DubboExporter,继而获取provider端Invoker对象
  4. Invoker执行,先经过filte chain,然后最终调用目标服务执行业务逻辑
  5. 把业务执行结果封装为Response,使用netty进行网络通信返回数据。
在 GitHub 上编辑此页 (opens new window)
#Dubbo#服务调用
最后更新: 2022/10/04, 8:10:00
服务发现(consumer服务引入)
SPI机制

← 服务发现(consumer服务引入) SPI机制→

Theme by Vdoing | Copyright © 2022-2023 zdk | notes
湘ICP备2022001117号-1
川公网安备 51142102511562号
提供加速服务
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式