dubbo源碼分析6-telnet方式的管理實現


 

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--


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM