dubbo系列二、dubbo请求流程记录

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进行网络通信返回数据。

1.3.dubbo请求分析记录-图

画了泳道图和xmind,以后不会再遗忘了

泳道图

dubbo系列二、dubbo请求流程记录

xmind图

dubbo系列二、dubbo请求流程记录

dubbo请求xmind原图https://gitee.com/yulewo123/mdpicture/blob/master/document/dubbo/dubbo请求流程.xmind

2.dubbo请求核心说明

1.consumer端的注册表RegistryDirectory,集群策略,负载均衡策略

2.filter chain,这个我们常用于扩展

3.dubbo的netty模型,可以直接拆出来作为一个基础框架使用了

后续一一写下文章

上一篇:Windows下使用Composer安装yii2


下一篇:Ubuntu安装Windows官方版QQ和微信(使用deepin wine)