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,以后不会再遗忘了
泳道图
xmind图
dubbo请求xmind原图https://gitee.com/yulewo123/mdpicture/blob/master/document/dubbo/dubbo请求流程.xmind
2.dubbo请求核心说明
1.consumer端的注册表RegistryDirectory,集群策略,负载均衡策略
2.filter chain,这个我们常用于扩展
3.dubbo的netty模型,可以直接拆出来作为一个基础框架使用了
后续一一写下文章