服务调用过程
Table of Contents generated with DocToc (opens new window)
# 1. dubbo请求处理流程
dubbo是个rpc框架,本质就是socket通信,把客户端的请求信息进行编码为二进制,然后通过socket发送数据。服务端接收二进制数据,解码,进行业务逻辑处理。过程涉及较多,记录如下。
# 1.1. consumer端处理流程
- 远程调用入口是InvokerInvocationHandler
- 根据调用的methodName,从注册表RegistryDirectory.methodInvokerMap缓存获取Invoker集合(服务方)。这些Invoker集合是consumer启动或服务端服务有变动,监听zk节点生成的。
- 使用路由进行过滤,获取过滤后的Invoker集合。默认是路由是MockInvokersSelector,TagRouter
- 使用负载均衡策略,从上步中的Invoker集合选取一个Invoker,后续就会请求这个具体的服务方
- consumer端filter chain执行。通常dubbo默认[ConsumerContextFilter,FutureFilter,MonitorFilter]。如果是泛化调用filter chain[ConsumerContextFilter,FutureFilter,MonitorFilter,GenericImplFilter]。filter chain作用是在请求前做一些公共处理,通常我们工作中最经常扩展这个
- Invoker执行调用。执行的是DubboInvoker.invoker(),该Invoker封装了NettyClient,可以进行网络通信
- netty调用,进行网络编码,然后发送数据
- 使用Future模式进行同步等待,直至获取响应数据或超时
- DefaultFuture阻塞等待provider响应结果
- netty遍历selectionkey,read事件,进行解码,接着使用NettyClientHandler读取接收数据
- 使用HeartbeatHandler进行接收处理数据,封装Response为ChannelEventRunnable,交由dubbo线程池异步处理。注意:HeartbeatHandler是网络发送和接收的入口
- ChannelEventRunnable处理接收事件,根据Response里面的唯一id获取DefaultFuture,把响应数据Response保存到DefaultFuture,同时唤醒DefaultFuture。即唤醒第8步。
- DefaultFuture阻塞被唤醒,获取到响应结果(响应结果在第12步已经被保存到DefaultFuture),返回业务数据,至此结束。
# 1.2. provider端处理流程
- nettyServer接收consumer端请求数据,进行解码
- dubbo层数据接入入口是HeartbeatHandler,封装请求信息为ChannelEventRunnable,使用dubbo线程池异步处理
- ChannelEventRunnable处理Request,根据请求数据内的group+interfaceName+version+port从缓存DubbotProtocol.exporterMap获取服务暴露对象DubboExporter,继而获取provider端Invoker对象
- Invoker执行,先经过filte chain,然后最终调用目标服务执行业务逻辑
- 把业务执行结果封装为Response,使用netty进行网络通信返回数据。
在 GitHub 上编辑此页 (opens new window)
最后更新: 2022/10/04, 16:10:00