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
該類的作用類似於我們通常用的上下文,它描述了調用過程中一些配置信息,形式如下:
比如我需要怎樣的編解碼器,我會到這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--