最近在梳理 Dubbo 是怎么跟 Netty 结合在一起,响应来自客户端的网络请求的,针对 Dubbo 3.3 版本的 Triple 协议做了一个简要分析。

一 、服务暴露(服务端)

Dubbo 服务暴露是将“配置”的服务传到 ZK

org.apache.dubbo.config.bootstrap.DubboBootstrap#start()

暴露服务时会启动Netty

Dubbo 启动时开启 Netty Bootstrap

  1. org.apache.dubbo.config.ServiceConfig#export
  2. org.apache.dubbo.config.ServiceConfig#doExportUrls
  3. org.apache.dubbo.config.ServiceConfig#exportRemote
  4. org.apache.dubbo.rpc.Protocol#export
  5. org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol#openServer
  6. org.apache.dubbo.rpc.protocol.dubbo.DubboProtocol#createServer
  7. org.apache.dubbo.remoting.exchange.Exchangers#bind
  8. org.apache.dubbo.remoting.transport.netty4.NettyTransporter#bind
  9. org.apache.dubbo.remoting.transport.AbstractServer#AbstractServer
  10. org.apache.dubbo.remoting.transport.netty4.NettyServer#doOpen

Triple 协议的启动稍微有些不同,从第四步开始,Triple 协议是使用统一的端口暴露服务(NettyPortUnificationServer),最终同样会调用 doOpen 方法。

  1. org.apache.dubbo.rpc.protocol.tri.TripleProtocol#export
  2. org.apache.dubbo.remoting.exchange.PortUnificationExchanger#bind
  3. org.apache.dubbo.remoting.transport.netty4.NettyPortUnificationTransporter#bind
  4. org.apache.dubbo.remoting.transport.netty4.NettyPortUnificationServer#NettyPortUnificationServer
  5. org.apache.dubbo.remoting.transport.AbstractServer#AbstractServer
  6. org.apache.dubbo.remoting.transport.AbstractServer#doOpen

二、发起调用(客户端)

Dubbo 客户端通过动态代理,使用协议(IP/Port),发起网络通信调用

127.0.0.1:50051/com.wei.provider.dubbo.api.DemoService/sayHello

Dubbo 服务端监听这个IP与端口,再经过协议过滤,交由 Netty 线程池处理这个请求,Betty的各种Handler处理这个请求,响应结果返回给客户端

三、获取请求(服务端)

获取请求

org.apache.dubbo.remoting.http12.netty4.h1.NettyHttp1Codec#channelRead

协议过滤

因为只有 Triple 协议给 HTTP/1 设置了Handler所以使用Triple 协议,协议在处理请求上一层就定死了。

四、处理请求(服务端)

org.apache.dubbo.remoting.http12.netty4.h1.NettyHttp1ConnectionHandler#channelRead0

五、返回结果(服务端)

org.apache.dubbo.remoting.http12.netty4.h1.NettyHttp1Codec#write