dubbo2.7以下可以通过telnet:20880端口执行ls、invoke指令,升级到3.X以上版本会提示不支持ls/invoke指令。这是因为dubbo3.X移除了对ls、invoke指令的支持,将这两个指令归纳到了运维指令。如果需要20880端口重新支持这两个指令,可以重新实现TelnetHandler接口,以下记录具体操作:
1、实现ls指令的支持:
package cn.xxx.common.dubbo.telnet;
import cn.hutool.core.collection.CollUtil;
import java.lang.reflect.Method;
import java.util.Iterator;
import java.util.List;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.common.utils.ReflectUtils;
import org.apache.dubbo.common.utils.StringUtils;
import org.apache.dubbo.qos.command.util.ServiceCheckUtils;
import org.apache.dubbo.remoting.Channel;
import org.apache.dubbo.remoting.telnet.TelnetHandler;
import org.apache.dubbo.remoting.telnet.support.Help;
import org.apache.dubbo.rpc.model.ApplicationModel;
import org.apache.dubbo.rpc.model.ConsumerModel;
import org.apache.dubbo.rpc.model.MethodDescriptor;
import org.apache.dubbo.rpc.model.ProviderModel;
import org.apache.dubbo.rpc.model.ServiceRepository;
/**
* @author nuoka
* @version 1.0.0
* <li></li>
* @date 2022/2/22 0:20
**/
@Activate
@Help(parameter = "[-l] [service]", summary = "List services and methods.", detail = "List services and methods.")
public class ListTelnetHandler implements TelnetHandler {
private static ServiceRepository serviceRepository = ApplicationModel.defaultModel()
.getApplicationServiceRepository();
public ListTelnetHandler() {
}
@Override
public String telnet(Channel channel, String message) {
StringBuilder buf = new StringBuilder();
String service = null;
boolean detail = false;
if (message.length() > 0) {
String[] parts = message.split("\\s+");
String[] var7 = parts;
int var8 = parts.length;
for (int var9 = 0; var9 < var8; ++var9) {
String part = var7[var9];
if ("-l".equals(part)) {
detail = true;
} else {
if (!StringUtils.isEmpty(service)) {
return "Invalid parameter " + part;
}
service = part;
}
}
} else {
service = (String) channel.getAttribute("telnet.service");
if (StringUtils.isNotEmpty(service)) {
buf.append("Use default service ").append(service).append(".\r\n");
}
}
if (StringUtils.isEmpty(service)) {
this.printAllServices(buf, detail);
} else {
this.printSpecifiedService(service, buf, detail);
if (buf.length() == 0) {
buf.append("No such service: ").append(service);
}
}
return buf.toString();
}
private void printAllServices(StringBuilder buf, boolean detail) {
this.printAllProvidedServices(buf, detail);
this.printAllReferredServices(buf, detail);
}
private void printAllProvidedServices(StringBuilder buf, boolean detail) {
List<ProviderModel> providerModels = CollUtil.newArrayList(serviceRepository.allProviderModels());
if (!providerModels.isEmpty()) {
buf.append("PROVIDER:\r\n");
}
for (Iterator var4 = providerModels.iterator(); var4.hasNext(); buf.append("\r\n")) {
ProviderModel provider = (ProviderModel) var4.next();
buf.append(provider.getServiceKey());
if (detail) {
buf.append(" -> ");
buf.append(" published: ");
buf.append(ServiceCheckUtils.isRegistered(provider) ? "Y" : "N");
}
}
}
private void printAllReferredServices(StringBuilder buf, boolean detail) {
List<ConsumerMo