服务调用
2022-07-05 18:31:59 10 举报
dubbo服务调用客户端 服务端
作者其他创作
大纲/内容
NettyServerHandler.channelRead
调用filter链
AbstractPeer.send
CallbackRegistrationInvoker.invoke
把RpcContext中设置的Attachments添加到invocation对象上,调用路由链从服务目录上筛选出适合的服务Invoker,获得服务均衡策略loadbalance
服务端处理客户端请求
ContextFilter.invoke
客户端请求解码
DubboProtocol.ExchangeHandlerAdapter.replay
设置RpcContext中LocalAddress、RemoteAddress、RemoteApplicationName参数
从clients轮询出一个client进行数据发送,如果配置了不关心结果,则调用ReferenceCountExchangeClient的send方法,否则调用ReferenceCountExchangeClient的request方法
HeaderExchangeClient.request
其实客户端接收服务端响应上面的流程和服务端接口客户端请求的流程一摸一样,只是这里不一样了,服务端接收客户端请求是handleRequest,而这里是handleResponse,接下来流程也不一样
AbstractClient.send
堆栈图
TimeoutFilter.invoke
这里和客户端一样都是调同一个类进行filter的链的执行
HeartbeatHandler.received
HeaderExchangeHandler.received->handleResponse
将下一步返回的同步结果封装为异步的CompletableFuture,返回AsyncRpcResult
构造一个Request对象,并且会构造一个DefaultFuture对象来阻塞timeout的时间来等待结果,在构造DefaultFuture对象时,会把DefaultFuture对象和req的id存入FUTURES中,FUTURES是一个Map,当HeaderExchangeHandler接收到结果时,会从这个Map中根据id获取到DefaultFuture对象,然后返回Response。
GenericFilter.invoke
MultiMessageHandler.received
ConsumerContextFilter.invoke
AllChannelHandler.received
HeaderExchangeChannel.request
DelegateProviderMetaDataInvoker.invoke
先执行下一个invoker的invoke方法,调用成功后录调用信息
ExceptionFilter.invoke
AbstractClusterInvoker.invoke
当我们在客户端用@Reference注解引入一个其他项目的一个dubbo接口时,其实得到的是ReferenceBean中getObject方法返回的Invoker
调用时没有特别处理,在回调onResponse方法时,对不同的异常进行处理,详解Dubbo的异常处理
DecodeHandler.received
客户端调用服务端
HeaderExchangeHandler.received->handleRequest
设置RpcContext.getContext()的参数
判断是否是心跳信息,不是的话调下一个handler
MonitorFilter.invoke
TraceFilter.invoke
参考链接:https://www.yuque.com/books/share/f2394ae6-381b-4f44-819e-c231b39c1497/pgy17b(密码kyys)https://mp.weixin.qq.com/s/oNR9v_ID2oAlEvDI93hRcw
NettyChannel.send
DefaultFuture.received->doReceived
ListenerInvokerWrapper.invoke
ExchangeHandlerAdapter的实现类在dubboProtocol中;从本机已经导出的Exporter中根据当前Request所对应的服务key,去寻找Exporter对象,从Exporter中得到Invoker,然后执行invoke方法,此Invoker为ProtocolFilterWrapper$CallbackRegistrationInvoker
AbstractProxyInvoker.invock->doInvoke
AbstractInvoker.invoke
反射执行实现类的方法拿到返回值
调用netty发送
把泛化调用发送过来的信息包装为RpcInvocation对象
AsyncToSyncInvoker.invoke
设置当前线程的classloader为当前要执行的服务接口所对应的classloader
客户端接收服务端的返回
JavassistProxyFactory.getInvoker->doInvoke
服务调用会分为客户端和服务端两部分
ClassLoaderFilter.invoke
DubboInvoker.doInvoke
NioSocketChannel.writeAndFlush
MockClusterInvoker.invoke(mock逻辑@Reference上可以叫mock信息)
处理Request数据,首先构造一个Response对象(带有请求的id),然后调用ExchangeHandlerAdapter(这是下一个handler,在dubboProtocol中)得到一个CompletionStage future,然后给future通过whenComplete绑定一个回调函数,当future执行完了之后,就可以从回调函数中得到ExchangeHandlerAdapter的执行结果,并把执行结果设置给Response对象,通过channel将结果发送给客户端。
判断当前请求是不是一个回升测试,如果是,则不继续执行过滤器链了(服务实现者Invoker也不会调用了)
方法的执行次数+1
EchoFilter.invoke
FailoverClusterInvoker.doInvoke
记录当前服务的执行次数
主要调用DubboInvoker的doInvoke方法,如果doInvoker方法出现了异常,会进行包装,包装成AsyncRpcResult
FutureFilter.invoke
InvokerWrapper.invoke(没做啥事)
ReferenceCountExchangeClient.request
把接收到的Message封装为一个ChannelEventRunnable对象,扔给线程池进行处理
0 条评论
下一页