天天看點

Dubbo provider處理請求服務端接收并響應請求流程

服務端接收并響應請求流程

provider處理請求流程

Dubbo 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 線程池裡的調用邏輯:

Dubbo provider處理請求服務端接收并響應請求流程
- 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()
           

繼續閱讀