源码分析Dubbo服务调用-服务提供者如何处理请求命令与再谈Invoker

这篇博客深入分析了Dubbo服务调用中NettyHandler如何处理请求命令,以及服务提供者如何使用Invoker处理请求。在Netty服务器端,事件处理Handler包括解码器、编码器和NettyHandler。服务调用流程始于DubboProtocol的requestHandler,通过接收服务调用信息、获取Invoker并执行方法调用。文中还探讨了Invoker在服务提供者暴露服务时的角色,以及如何通过过滤器链模式进行服务调用包装。
摘要由CSDN通过智能技术生成

final NettyHandler nettyHandler = new NettyHandler(getUrl(), this);

channels = nettyHandler.getChannels();

// https://issues.jboss.org/browse/NETTY-365

// https://issues.jboss.org/browse/NETTY-379

// final Timer timer = new HashedWheelTimer(new NamedThreadFactory(“NettyIdleTimer”, true));

bootstrap.setPipelineFactory(new ChannelPipelineFactory() {

@Override

public ChannelPipeline getPipeline() {

NettyCodecAdapter adapter = new NettyCodecAdapter(getCodec(), getUrl(), NettyServer.this);

ChannelPipeline pipeline = Channels.pipeline();

pipeline.addLast(“decoder”, adapter.getDecoder()); // @start

pipeline.addLast(“encoder”, adapter.getEncoder());

pipeline.addLast(“handler”, nettyHandler); // @end

return pipeline;

}

});

可以看出,传入Netty框架的事件处理Handler主要是3个:1、解码器;2、编码器;3、业务类NettyHandler。也就是说当服务端(Server)的读事件就绪后,进行网络读写后,会将二进制流传入解码器(Decoder),解码出一个一个的RPC请求,然后针对每一个RPC请求,交给NettyHandler相关事件处理方法去处理,在这里传入NettyHandler的ChannelHandler为NettyServer,以网络读命令为例,最终将调用NettyServer的父类AbstractPeer的received方法:

@Override

public void received(Channel ch, Object msg) throws RemotingException {

if (closed) {

return;

}

handler.received(ch, msg);

}

那AbstractPeer中的ChannelHandler又是“何许人也”,是通过调用NettyServer(URL url, ChannelHandler handler)中传入的,结合上图中NettyServer的构建流程,可以追溯其流程如下:

  1. DubboProtocol#createServer

server = Exchangers.bind(url, requestHandler); // @1, requestHandler,为最原始的ChannelHandler,接下来整个过程都是对该handler的包装。

  1. HeaderExchanger#bind

return new HeaderExchangeServer(Transporters.bind(url, new

DecodeHandler(new HeaderExchangeHandler(handler))));其包装顺序为 DecodeHandler 》HeaderExchangeHandler 》(DubboProtocol#requestHandler)

  1. NettyTransporter#bind

  2. NettyServer构造函数

super(url, ChannelHandlers.wrap(handler, ExecutorUtil.setThreadName(url, SERVER_THREAD_POOL_NAME)));这里主要包装的是事件的派发Handler,例如AllChannelHandler、ExecutionChannelHandler【Dispatch】业务Handler最终的包装顺序为:事件派发模型handler[AllChannelHandler] 》DecodeHandler 》HeaderExchangeHandler 》 DubboProtocol#requestHandler(最终的业务Handler)。结合网络Netty的处理Handler,服务端事件Handler的处理为:DubboCodec2(解码器) 》 事件派发模型handler[AllChannelHandler] 》DecodeHandler 》 HeaderExchangeHandler》 Dubbo

  • 23
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值