服務端接收并響應請求流程
provider處理請求流程
- NettyServerWorker線程接收請求
- ByteToMessageDecoder.channelRead()
- ByteToMessageDecoder.callDecode()
- NettyCodecAdapter.InternalDecoder.decode()
- DubboCountCodec.decode()解碼
- fireChannelRead(ctx, out, size)
- NettyServerHandler.channelRead()
- AbstractPeer.received()
- MultiMessageHandler.received()
- HeartbeatHandler.received()
- AllChannelHandler.received()
- cexecutor.execute(new ChannelEventRunnable())// 請求派發到線程池處理,邏輯在ChannelEventRunnable.run()裡
AllChannelHandler.received()方法中:
會将請求交給 ChannelEventRunnable 進行處理,後續在 DubboServerHandler 線程池裡的調用邏輯:
- provider處理請求流程
- ChannelEventRunnable.run()通道事件,判斷RECEIVED事件進行處理
- DecodeHandler.received()解碼處理器
- HeaderExchangeHandler.received()基于消息頭的處理
- 1.HeaderExchangeHandler.handleRequest()處理請求
- DubboProtocol.requestHandler.reply()
- 1.從exporterMap(服務暴露時建立的)中擷取對應的invoker對象
- 2.invoker.invoke()
- 經過各個filter.invoke()
- InvokerWrapper.invoke()
- AbstractProxyInvoker.invoke()中
- 1.doInvoke(methodName,paramType, arguments)
- JavassistProxyFactory.doInvoke()
- com.alibaba.dubbo.demo.provider.DemoServiceImpl.sayHello()
- DemoServiceImpl.sayHello()
- 2.new RpcResult()上一步的傳回結果包裝成RpcResult傳回,後續處理原路傳回
- 2.channel.send(response)響應請求
- // 參見 provider響應請求流程
provider請求響應流程
- provider響應請求流程
- 各個filter的後續處理
- HeaderExchangeHandler.received()中處理請求時走handleRequest(),請求處理完後通過channel.send(response)響應
- AbstractPeer.send()
- netty4/NettyChannel.send()
- 響應線程NettyServerWorker-3-1
- Thread.run()
- DefaultThreadFactory$DefaultRunnableDecorator.run()
- SingleThreadEventExecutor.run()
- NioEventLoop.run()
- SingleThreadEventExecutor.runAllTasks()
- // ...
- AbstractChannelHandlerContext$WriteAndFlushTask.write()
- NettyServerHandler.write()
- AbstractPeer.sent()
- AbstractChannelHandlerDelegate.sent()
- HeartbeatHandler.sent()設定最後的寫時間
- WrappedChannelHandler.sent()
- AbstractChannelHandlerDelegate.sent()
- HeaderExchangeHandler.sent()