美文网首页dubbo源码
dubbo server请求处理逻辑探究

dubbo server请求处理逻辑探究

作者: Foghost | 来源:发表于2022-12-28 18:15 被阅读0次

这篇文章主要聊聊 dubbo 的服务端接受请求处理流程

服务端接口声明及实现如下:

public interface DemoService {
    String sayHello(String name);
}
public class DemoServiceImpl implements DemoService {
    @Override
    public String sayHello(String name) {
        return "Hello " + name + ", response from provider: " + RpcContext.getContext().getLocalAddress();
    }
}

在真实业务处理 sayHello return 语句加入断点可以得到如下调用栈:

33. sayHello:29, DemoServiceImpl (com.alibaba.dubbo.demo.provider)
32. invokeMethod:-1, Wrapper1 (com.alibaba.dubbo.common.bytecode)
31. doInvoke:50, JavassistProxyFactory$1 (com.alibaba.dubbo.rpc.proxy.javassist)
30. invoke:86, AbstractProxyInvoker (com.alibaba.dubbo.rpc.proxy)
29. invoke:52, DelegateProviderMetaDataInvoker (com.alibaba.dubbo.config.invoker)
28. invoke:59, InvokerWrapper (com.alibaba.dubbo.rpc.protocol)
27. invoke:63, ExceptionFilter (com.alibaba.dubbo.rpc.filter)
26. invoke:93, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
25. invoke:75, MonitorFilter (com.alibaba.dubbo.monitor.support)
24. invoke:93, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
23. invoke:44, TimeoutFilter (com.alibaba.dubbo.rpc.filter)
22. invoke:93, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
21. invoke:103, TraceFilter (com.alibaba.dubbo.rpc.protocol.dubbo.filter)
20. invoke:93, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
19. invoke:79, ContextFilter (com.alibaba.dubbo.rpc.filter)
18. invoke:93, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
17. invoke:155, GenericFilter (com.alibaba.dubbo.rpc.filter)
16. invoke:93, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
15. invoke:41, ClassLoaderFilter (com.alibaba.dubbo.rpc.filter)
14. invoke:93, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
13. invoke:39, EchoFilter (com.alibaba.dubbo.rpc.filter)
12. invoke:93, ProtocolFilterWrapper$1 (com.alibaba.dubbo.rpc.protocol)
11. reply:149, DubboProtocol$1 (com.alibaba.dubbo.rpc.protocol.dubbo)
10. handleRequest:96, HeaderExchangeHandler (com.alibaba.dubbo.remoting.exchange.support.header)
9. received:176, HeaderExchangeHandler (com.alibaba.dubbo.remoting.exchange.support.header)
8. received:55, DecodeHandler (com.alibaba.dubbo.remoting.transport)
7. run:57, ChannelEventRunnable (com.alibaba.dubbo.remoting.transport.dispatcher)
------线程切换
6. received:66, AllChannelHandler (com.alibaba.dubbo.remoting.transport.dispatcher.all)
5. received:101, HeartbeatHandler (com.alibaba.dubbo.remoting.exchange.support.header)
4. received:45, MultiMessageHandler (com.alibaba.dubbo.remoting.transport)
3. received:154, AbstractPeer (com.alibaba.dubbo.remoting.transport)
2. channelRead:116, NettyServerHandler (com.alibaba.dubbo.remoting.transport.netty4)
1. invokeChannelRead:292, AbstractChannelHandlerContext (io.netty.channel)

下面从栈底依次向上进行拆解:

1、 netty 底层接受网络消息逻辑,此时消息已经经过了解码和反序列化(默认,可以通过配置 decode.in.io 改变解码时机),使用 netty 的 ChannelHandler,具体在 NettyServer 的 doOpen 方法中设置的

2、 NettyServerHandler 将 netty 的 channel 转换为了 dubbo 的 Channel 并进行了缓存,然后将请求委托给了其装饰的 handler,从这里我们可以看出 dubbo 的 channelHandler处理链条是 NettyServerHandler -> NettyServer -> MultiMessageHandler -> HeartbeatHandler -> AllChannelHandler -> DecodeHandler -> HeaderExchangeHandler -> DubboProtocol中的匿名类requestHandler(ExchangeHandlerAdapter),他们通过装饰着模式组成了一个链表,层层依次调用

3、 NettyServer 继承自 AbstractPeer,这里调用到了父类的received方法,这里仅仅只判断了下 channel 是否close 就将请求转发给了下一层

4、 MultiMessageHandler 顾名思义其是将多个请求拆开循环调用后续的 ChannelHandler

5、 HeartbeatHandler 处理心跳的处理器,如果是 心跳请求则返回一个心跳相应,如果是心跳相应则什么也不做,其他的一律转发给下一层的 ChannelHandler

6、 AllChannelHandler 是默认的请求派发策略实现,即所有事件(connected/disconnected/Request/Response/异常处理)都提交给业务线程池处理

7、 由于 AllChannelHandler 进行了请求派发到业务线程池处理,这里进行了线程切换,将后续处理包装为 ChannelEventRunnable 提交给线程池

8、 DecodeHandler 对收到的消息进行解码,这里不一定是真的解码,主要看是否配置了参数 decode.in.io,如果为 false 的话会在这里进行解码,否则从步骤1就已解码完毕

9-10、 HeaderExchangeHandler 判断消息是请求还是相应(因为客户端也是会在这里处理),如果是请求则调用 handleRequest 拿到真实的调用结果然后返回

11、DubboProtocol$1 是 DubboProtocol 中的匿名内部类 requestHandler,在这里进行了根据请求找对对应的 Invoker 进行真实的业务处理过程

12-27、 这里执行了 Invoker 的过滤器逻辑,通过 ProtocolFilterWrapper.buildInvokerChain 逻辑将过滤器(Filter)组成了一个 Invoker 链表,最后执行到 InvokerDelegete

28、 InvokerWrapper 是 InvokerDelegete 的父类,这里其实是调用的 InvokerDelegete 的 invoke 方法

29、 DelegateProviderMetaDataInvoker 就是个 Invoker 的代理类,忽略就好

30-31、 JavassistProxyFactory$1 是 JavassistProxyFactory 的内部类,实现了 JavassistProxy Invoker,将请求代理到具体的业务实现类

32、 Wrapper1 是字节码生成的代理类,是 Wrapper 的子类,Wrapper 提供了一些接口声明,方便直接调用,生成的字节码需要有接口才能调用,否则只能用反射,用接口占位可以避免使用反射

33、 真实业务处理逻辑

相关文章

  • dubbo server处理请求

    源码分析基于dubbo 2.6.0 前面讲到,RegistryProtocol.doLocalExport负责启动...

  • 以太坊源码阅读-网络处理-RPC

    server.go 实现了RPC服务端的核心逻辑,包括注册、读取请求、处理请求、发送回应等逻辑。// Server...

  • dubbo - server处理请求过程

    开篇  这篇文章的主要目的是想梳理下Dubbo框架中server端处理consumer端请求的过程,主要为了解答自...

  • 多线程多进程线程池进程池

    利用并发处理来自客户端的请求, server端 线程池处理请求 多线程处理请求 telnet 10.0.122.1...

  • Dubbo请求处理流程

    Dubbo客户端发送请求调用栈: Dubbo服务端接受请求图: 介绍下两个概念: 过滤器链 各类协议protoco...

  • Dubbo Provider 处理请求流程 (2)

    开篇 这篇是Dubbo Provider 处理请求流程 (1)的下篇内容,建议有兴趣可以先阅读之前的Dubbo P...

  • nacos结合dubbo2.7.12、springboot分析

    一、dubbo原理简介 问题:并发很多的时候Tomcat处理并发请求有限,多模块进行通信解决:dubbo是一个RP...

  • 2.http请求过程

    输入域名地址 =>dns解析 =>建立tcp连接=>发送请求=> server 接收到http请求,处理,返回=>...

  • Dubbo源码分析----处理请求

    Dubbo默认是使用Netty进行通信的,那么Netty会配置一个Handler,来处理一些事件,所以这个Hand...

  • API性能指标

    1、事务 在性能测试中,一个事务表示一个“从用户发送请求-->server端接受请求并处理-→server端向DB...

网友评论

    本文标题:dubbo server请求处理逻辑探究

    本文链接:https://www.haomeiwen.com/subject/raxzqdtx.html