Dubbo源码分析(十一)------服务提供者的Invoker调用流程

833 阅读2分钟

Dubbo版本是2.7.3.Release.
上一章分析过消费端的Invoker调用流程,今天着重分析下服务提供者的Invoker调用流程 从上一篇中可以知道消费者调用最终通过NettyServer接受消费者发送的RpcInvocation的message消息,这里看到ChannelPipeline加入了解码器和编码器以及NettyHandler处理类

这里看到NettyHandler是继承SimpleChannelHandler的,也就是当消费端ExhcngeClient通过send发送message后,NettyServer的通过Channel收到消息后调用messageReceived消息,然后调用依赖的channelHandler的received方法进行接受的处理
在创建ExchangeServer是会绑定requestHandler,默认是HeaderExchangeServer里依赖Server,默认使用NettyServer.
这是调用Transporter默认使用NettyTransporter,通过bind方法创建了NettyServer的服务端,并绑定ChannelHandler(实际对象是上图中DecodeHandler包装了HeaderExchangeHandler, HeaderExchangeHandler包装了DubboProtoco中requestHandler的匿名内部类),也就是NettyServer接受消息后,首先会调用DecodeHandler对消息进行解码,然后调用HeaderExchangeHandler的received方法处理逻辑,然后调用channelHandler的Hadreply方法进行回调处理.
这是NettyServer服务端绑定的ExchangeHandler的pipeline中绑定的requestHandler的匿名内部类,这里可以看到匿名内部主要逻辑

  1. 从ExchangeChannel中获取port,path,invocation的attachment中的version和group信息构造serviceKey,从serverMap中获取ServiceExporter
  2. 然后从ServiceExporer获取的Invoker,并进行Invoker的invoker调用.
    由于之前服务提供者启动过程中可以知道服务导出都是由ServiceBeanz这个里面完成,这里是 通过ProxyFactory进行getInvoker构造代理类,然后通过Protocol的export进行协议导出.
    服务提供者通过JavassistProxyFactory的getInvoker构造的Invoker对象,这里生成的AbstractProxyInvoker的匿名内部类,
    这里主要是调用Wrapper的makeWrapper方法拼接字符串生成代理类,主要是利用javassist操作字节码的生成,
    服务提供端获取对应的Invoker对象,并进行AbstractProxyInvokerr调用invoke方法,并回调用代理类的doInvoke方法,并调用wrapper类的invokeMethod方法实现对接口的实现类的调用.

总结
今天分析了服务提供者的Invoker执行过程,其中主要就NettyServer的channel的pipeline的绑定channel的构造以及Invoker代理调用过程.