dubbo源码分析1-reference bean创建

dubbo源码分析2-reference bean发起服务方法调用

dubbo源码分析3-service bean的创建与发布

dubbo源码分析4-基于netty的dubbo协议的server

dubbo源码分析5-dubbo的扩展点机制

dubbo提供了telnet的方式,直接用命令查看服务信息等。怎么实现的呢。

1. 编解码器

com.alibaba.dubbo.remoting.transport.netty.NettyCodecAdapter.InternalDecoder

实现了SimpleChannelUpstreamHandler类

然后注册给ChannelPipeline

后面的都是用netty的套路

2. dubbo中URL类

com.alibaba.dubbo.common.URL

该类的作用类似于我们通常用的上下文,它描述了调用过程中一些配置信息,形式如下:

dubbo://192.168.1.101:20880/org.simonme.dubbo.demo.provider.service.HelloService?anyhost=true&application=hello-world-app&channel.readonly.sent=true&codec=dubbo&dubbo=2.4.9&heartbeat=60000&interface=org.simonme.dubbo.demo.provider.service.HelloService&methods=sayHello&monitor=dubbo%3A%2F%2F192.168.1.100%3A2174%2Fcom.alibaba.dubbo.registry.RegistryService%3Fapplication%3Dhello-world-app%26dubbo%3D2.4.9%26pid%3D8976%26protocol%3Dregistry%26refer%3Ddubbo%253D2.4.9%2526interface%253Dcom.alibaba.dubbo.monitor.MonitorService%2526pid%253D8976%2526timestamp%253D1468370420113%26registry%3Dzookeeper%26timestamp%3D1468370419870&pid=8976&side=provider&timestamp=1468370419920

比如我需要怎样的编解码器,我会到这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使用比较方便。

3. dubbo的扩展点实现

分析 com.alibaba.dubbo.common.extension.ExtensionLoader<T>

本质上还是将构建出来的实例放在cachedInstances属性中,这个事本来可以交给spring干,spring专业干IOC的。但是dubbo这么干了之后一个明显的好处是:dubbo在不依赖任何第三方框架的情况下可以跑起来。说的简单一点:dubbo自己做了一个简易的IOC机制,它这里面称之为SPI。自己做IOC的框架真是不少,Struts2也自己干了IOC。详细分析见之前画的一份思维导图

4. telnet协议编解码器

DubboCountCodec与netty对接,DubboCountCodec 关联了DubboCodec。DubboCodec继承体系上有个TelnetCodec。TelnetCodec完成了telenet协议的编解码,在decode方法中会将InputStream 实例转换成message。

5. 解码后的动作链路

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注解,描述了命令的帮助。

6. telnet连接后,按向上或者向下方向键的时候能回显历史命令,怎么实现的

实现在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;
}

7. 部分问题

dubbo的这个telnet管理台实现还是比较简陋的 只实现了telnet的行模式

并没有实现字符模式,这样的话 按tab补全这种事就不好做了。

之前看过huawei的命令行管理平台的工具,tab补全能力非常强大 也非常好用。

--EOF--

dubbo源码分析6-telnet方式的管理实现的更多相关文章

  1. Dubbo 源码分析 - 服务调用过程

    注: 本系列文章已捐赠给 Dubbo 社区,你也可以在 Dubbo 官方文档中阅读本系列文章. 1. 简介 在前面的文章中,我们分析了 Dubbo SPI.服务导出与引入.以及集群容错方面的代码.经过 ...

  2. dubbo源码分析1-reference bean创建

    dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...

  3. dubbo源码分析2-reference bean发起服务方法调用

    dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...

  4. dubbo源码分析3-service bean的创建与发布

    dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...

  5. dubbo源码分析4-基于netty的dubbo协议的server

    dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...

  6. dubbo源码分析5-dubbo的扩展点机制

    dubbo源码分析1-reference bean创建 dubbo源码分析2-reference bean发起服务方法调用 dubbo源码分析3-service bean的创建与发布 dubbo源码分 ...

  7. dubbo源码分析一:整体分析

    本文作为dubbo源码分析的第一章,先从总体上来分析一下dubbo的代码架构.功能及优缺点,注意,本文只分析说明开源版本提供的代码及功能. 1.dubbo的代码架构:  spring适配层:常规的sp ...

  8. Dubbo 源码分析 - 集群容错之 LoadBalance

    1.简介 LoadBalance 中文意思为负载均衡,它的职责是将网络请求,或者其他形式的负载"均摊"到不同的机器上.避免集群中部分服务器压力过大,而另一些服务器比较空闲的情况.通 ...

  9. Dubbo 源码分析 - 集群容错之 Cluster

    1.简介 为了避免单点故障,现在的应用至少会部署在两台服务器上.对于一些负载比较高的服务,会部署更多台服务器.这样,同一环境下的服务提供者数量会大于1.对于服务消费者来说,同一环境下出现了多个服务提供 ...

随机推荐

  1. 浅析python 中__name__ = '__main__' 的作用

    引用http://www.jb51.net/article/51892.htm 很多新手刚开始学习python的时候经常会看到python 中__name__ = \'__main__\' 这样的代码 ...

  2. 在SQL SERVER中实现RSA加解密函数(第一版)

    /*************************************************** 作者:herowang(让你望见影子的墙) 日期:2010.1.1 注:   转载请保留此信息 ...

  3. php中session原理及安全性问题

    有一点我们必须承认,大多数web应用程序都离不开session的使用.这篇文章将会结合php以及http协议来分析如何建立一个安全的会话管理机制   我们先简单的了解一些http的知识,从而理解该协议 ...

  4. 10 Cookie/Session

    JSP/EL入门     * SUN提供了开发WEB资源的技术     Servlet/JSP              * response.getWriter().write();         ...

  5. jQuery实现全选效果【转】

    这是一段用jquery实现全选的代码,主要思路如下: 1.所有的复选框都有单击事件,所有效果都是在单击事件下实现的 2.全选复选框所实现的功能与其他复选选项实现的功能不同,所有在单击事件内做一个判断, ...

  6. 【Alpha】Daily Scrum Meeting第九次

    一.本次Daily Scrum Meeting主要内容 汇报情况. 上次提到的数据库字段问题,已经和合作队伍统一完毕. 在服务器上解析Json数据仍在解决中,现在直接使用手机发过去的数据进行解析. 二 ...

  7. 修改ie的默认值 为ie10

    <meta http-equiv="X-UA-Compatible" content="IE=EmulateIE10" />

  8. WPF整理-为User Control添加依赖属性

    依赖属性 ".NET properties are nothing more than syntactic sugar over set and get methods." 我们知 ...

  9. javaScript代码执行顺序

    javaScript是一种描述型脚本语言,由浏览器进行动态的解析和执行. 页面加载过程中,浏览器会对页面上载入的每个js代码块进行扫描. JavaScript是一段一段的分析执行的,在分析执行同一段代 ...

  10. java内置数据类型

    常量在程序运行时,不会被修改的量. 在 Java 中使用 final 关键字来修饰常量,声明方式和变量类似: finaldouble PI =3.1415927; 虽然常量名也可以用小写,但为了便于识 ...