Dubbo 回调用服务的处理逻辑

处理方式

以Netty为例,首先在初始化NettyClient或者NettyServer的时候,根据URL中的codec参数选择具体的codec类,默认使用DubboCountCodec类。

在启动Netty客户端或者服务端的时候在Netty的pipeline中添加了编解码器。

  • decoder为解码器,是一个SimpleChannelUpstreamHandler,从Socket到Netty中的时候,需要解码,也就是接收消息的时候,需要解码。
  • encoder为编码器,是OneToOneEncoder,这个类实现了ChannelDownstreamHandler,从发送消息的时候,需要编码。
  • nettyHandler实现了ChannelUpstreamHandler、ChannelDownstreamHandler两个,上下的时候都需要处理。

接收消息的时候,会先执行decoder,然后执行nettyHandler.

发送消息的时候,会先执行nettyhandler,然后执行encoder。

 

客户端发送调用请求的逻辑

1.选择NettyHandler,writeRequested方法,从而decodeHandler的sent方法,该handler未实现sent方法,因而调用父类的方法。

2.执行encoder,调用链为NettyCodecAdapter$InternalEncoder.encode->DubboCountCodec.encode->DubboCodec.encode->ExchangeCodec.encode->DubboCodec.encodeRequestData,在该调用链中,最终调用CallbackServiceCodec.encodeInvocationArgument方法,在该方法中检查远程方法的参数是否为回调用函数,若是,则将客户端中调用远程方法时传入的回调用函数参数暴露出来提供服务端调用,大致逻辑:

(1)生成一个唯一的实例ID

(2)代理工厂创建Invoker代理

(3)调用Protocol.export方法。

 

服务端接受客户端请求的处理逻辑

1.先执行decoder,调用链NettyCodecAdatper$InternalDecoder.messageReceived->DubboCountCodec.decode->DubboCodec.decode-->DubboCodec.decodeBody->DecodeableRpcInvocation.decode->...->CallbackServiceCodec.decodeInvocationArgument,在这个方法中判断该调用的方法中参数是否为回调用函数,若是则调用CallbackServiceCodec.referOrdestroyCallbackService方法完成对客户端暴露的回调函数 的引用,大致逻辑:

(1)初始化ChannelWrapperInvoker对象,其中将与客户建立的通道Channel对象中参数之一,此Channel参数是回调用函数消息发送的重要通道,在触发回调用工作时,利用此Channel创建HeaderExchanageClient对象,由该对象完成回调用的请求工作,具体的逻辑与消费端发起的远程调用的逻辑基本一致。

(2)创建服务类的本地代理,即为ChannelWrapperInvoker对象创建代理,将此代理作为服务端方法中回调参数的请求值,从而在服务端的方法实现中就可以使用该代理完成远程回调用工作。

(3)将DecodeableRpcInvocation类中的hasDecoded变量设置为true,以免在Decodehandler中重复执行解码工作。

 

最后欢迎大家访问我的个人网站:1024s

你可能感兴趣的:(秒扒Dubbo)