标签:
dubbo提供了telnet的方式,直接用命令查看服务信息等。怎么实现的呢。
com.alibaba.dubbo.remoting.transport.netty.NettyCodecAdapter.InternalDecoder
实现了SimpleChannelUpstreamHandler类
然后注册给ChannelPipeline
后面的都是用netty的套路
com.alibaba.dubbo.common.URL
该类的作用类似于我们通常用的上下文,它描述了调用过程中一些配置信息,形式如下:
比如我需要怎样的编解码器,我会到这url中取
com.alibaba.dubbo.remoting.transport.AbstractEndpoint.AbstractEndpoint(URL, ChannelHandler)
this.codec = ExtensionLoader.getExtensionLoader(Codec.class).getExtension(url.getParameter(Constants.CODEC_KEY, "telnet"));
我们在上述的url示例中能找到 codec=dubbo
所以就知道这次采用dubbo的编解码器。
略微和我们之前用上下文方式不同的是,上下文中可以防止一些比较复杂的对象,比如放置一个根窗体容器之类的。
用了URL这种形式,结合ZooKeeper使用比较方便。
分析 com.alibaba.dubbo.common.extension.ExtensionLoader<T>
本质上还是将构建出来的实例放在cachedInstances属性中,这个事本来可以交给spring干,spring专业干IOC的。但是dubbo这么干了之后一个明显的好处是:dubbo在不依赖任何第三方框架的情况下可以跑起来。说的简单一点:dubbo自己做了一个简易的IOC机制,它这里面称之为SPI。自己做IOC的框架真是不少,Struts2也自己干了IOC。详细分析见之前画的一份思维导图
DubboCountCodec与netty对接,DubboCountCodec 关联了DubboCodec。DubboCodec继承体系上有个TelnetCodec。TelnetCodec完成了telenet协议的编解码,在decode方法中会将InputStream 实例转换成message。
NettyHandler extends SimpleChannelHandler 这个类会注册给netty,netty在解码后会触发下面的messageReceived逻辑。
com.alibaba.dubbo.remoting.transport.netty.NettyHandler.messageReceived(ChannelHandlerContext, MessageEvent)
这个handler又关联了真正处理逻辑的handler,com.alibaba.dubbo.remoting.telnet.support.TelnetHandlerAdapter
TelnetHandlerAdapter触发telnet方法 调用真正的命令处理逻辑
根据拿到的命令 再通过扩展点机制获取具体的命令实现类的实例。
可以以com.alibaba.dubbo.rpc.protocol.dubbo.telnet.ListTelnetHandler为例子分析一下。
命令的实现使用了@Help注解,描述了命令的帮助。
实现在com.alibaba.dubbo.remoting.telnet.codec.TelnetCodec.decode(Channel, InputStream, int, byte[])中,编解码器会将历史命令记录在channel中,然后根据方向来获取。
boolean down = endsWith(message, DOWN); if (up || down) { LinkedList<String> history = (LinkedList<String>) channel.getAttribute(HISTORY_LIST_KEY); if (history == null || history.size() == 0) { return NEED_MORE_INPUT; }
--EOF--
标签:
原文地址:http://www.cnblogs.com/simoncook/p/5669159.html