所有服务器均支持telnet访问,用于人工干预。
dubbo的remoting包中的telnet实现,也是基于SPI扩展的,并且为了方便使用,也是使用适配器模式进行设计。
在TelnetHandlerAdapter类中,通过对输入命令进行分解,根据命令关键字,选择不同的实现类,即:
String result = extensionLoader.getExtension(command).telnet(channel, message);
此处telnet的配置在dubbo/internal中如下
clear=com.alibaba.dubbo.remoting.telnet.support.command.ClearTelnetHandler
exit=com.alibaba.dubbo.remoting.telnet.support.command.ExitTelnetHandler
help=com.alibaba.dubbo.remoting.telnet.support.command.HelpTelnetHandler
status=com.alibaba.dubbo.remoting.telnet.support.command.StatusTelnetHandler
log=com.alibaba.dubbo.remoting.telnet.support.command.LogTelnetHandler
具体实现类如下图:
具体实现过程如下:
1、从message中分解出command命令
int i = message.indexOf(' ');
if (i > 0) {
command = message.substring(0, i).trim();
message = message.substring(i + 1).trim();
} else {
command = message;
message = "";
}
2、根据command找出相应的扩展实现类即extensionLoader.getExtension(command).,然后调用其中的telnet方法String result = extensionLoader.getExtension(command).telnet(channel, message);
if (command.length() > 0) {
if (extensionLoader.hasExtension(command)) {
try {
String result = extensionLoader.getExtension(command).telnet(channel, message);
if (result == null) {
return null;
}
buf.append(result);
} catch (Throwable t) {
buf.append(t.getMessage());
}
} else {
buf.append("Unsupported command: ");
buf.append(command);
}
}
以上即简单介绍了dubbo中telnet的实现,用于支持主机之间的访问。