由于dubbo生态发展过程的曲折,公司系统较多依赖于原当当维护的dubbox框架,而业务测试中又需要能有一个支持接口级的压测工具(基于dubbo的测试工具之前有造过一个轮子详见:https://blog.youkuaiyun.com/qq355667166/article/details/78914453),经过测试同学选型最终确认了采用jmeter+插件化jmeter-plugins-for-apache-dubbo2.7.4(https://github.com/thubbo/jmeter-plugins-for-apache-dubbo)的方式来实现,但是在真正配置完使用时发现对dubbo2.8.4(Dubbox)不兼容从而导致无法正常使用。
apache-dubbo和dubbox版本兼容性比对(可参考:https://blog.youkuaiyun.com/qq_29116427/article/details/100621126):
放手开干,下载该插件源码对其进行兼容性改造(以达成最终可用为目的,改造过程可能过于暴力):
1、屏蔽apache的dubbo包依赖,放入dubbox的包依赖,同时增加zkClient的jar包配置
2、此时整个程序编译后会发现大量错误引用,大多数只需要删除原有apache dubbo引用替换成dubbox的引用即可(这块还是蛮简单),这时候发现源码中有应用apache-dubbo中两个常量类,暴力点直接复制代码在本地创建:
创建CommonConstants类并将代码复制进来:
package io.github.ningyu.jmeter.plugin.util;
import java.util.regex.Pattern;
/**
* @Author: Andy.jia
* @Date: 2019-12-04 10:48
*/
public interface CommonConstants {
String DUBBO = "dubbo";
String PROVIDER = "provider";
String CONSUMER = "consumer";
String APPLICATION_KEY = "application";
String REMOTE_APPLICATION_KEY = "remote.application";
String ENABLED_KEY = "enabled";
String DISABLED_KEY = "disabled";
String DUBBO_PROPERTIES_KEY = "dubbo.properties.file";
String DEFAULT_DUBBO_PROPERTIES = "dubbo.properties";
String ANY_VALUE = "*";
String COMMA_SEPARATOR = ",";
String DOT_SEPARATOR = ".";
Pattern COMMA_SPLIT_PATTERN = Pattern.compile("\\s*[,]+\\s*");
String PATH_SEPARATOR = "/";
String PROTOCOL_SEPARATOR = "://";
String REGISTRY_SEPARATOR = "|";
Pattern REGISTRY_SPLIT_PATTERN = Pattern.compile("\\s*[|;]+\\s*");
Pattern D_REGISTRY_SPLIT_PATTERN = Pattern.compile("\\s*[|]+\\s*");
String SEMICOLON_SEPARATOR = ";";
Pattern SEMICOLON_SPLIT_PATTERN = Pattern.compile("\\s*[;]+\\s*");
Pattern EQUAL_SPLIT_PATTERN = Pattern.compile("\\s*[=]+\\s*");
String DEFAULT_PROXY = "javassist";
String DEFAULT_DIRECTORY = "dubbo";
String PROTOCOL_KEY = "protocol";
String DEFAULT_PROTOCOL = "dubbo";
String DEFAULT_THREAD_NAME = "Dubbo";
int DEFAULT_CORE_THREADS = 0;
int DEFAULT_THREADS = 200;
String THREADPOOL_KEY = "threadpool";
String THREAD_NAME_KEY = "threadname";
String CORE_THREADS_KEY = "corethreads";
String THREADS_KEY = "threads";
String QUEUES_KEY = "queues";
String ALIVE_KEY = "alive";
String DEFAULT_THREADPOOL = "limited";
String DEFAULT_CLIENT_THREADPOOL = "cached";
String IO_THREADS_KEY = "iothreads";
int DEFAULT_QUEUES = 0;
int DEFAULT_ALIVE = 60000;
String TIMEOUT_KEY = "timeout";
int DEFAULT_TIMEOUT = 1000;
String REMOVE_VALUE_PREFIX = "-";
String PROPERTIES_CHAR_SEPERATOR = "-";
String UNDERLINE_SEPARATOR = "_";
String SEPARATOR_REGEX = "_|-";
String GROUP_CHAR_SEPERATOR = ":";
String HIDE_KEY_PREFIX = ".";
String DOT_REGEX = "\\.";
String DEFAULT_KEY_PREFIX = "default.";
String DEFAULT_KEY = "default";
int DEFAULT_SERVER_SHUTDOWN_TIMEOUT = 10000;
String SIDE_KEY = "side";
String PROVIDER_SIDE = "provider";
String CONSUMER_SIDE = "consumer";
String ANYHOST_KEY = "anyhost";
String ANYHOST_VALUE = "0.0.0.0";
String LOCALHOST_KEY = "localhost";
String LOCALHOST_VALUE = "127.0.0.1";
String METHODS_KEY = "methods";
String METHOD_KEY = "method";
String PID_KEY = "pid";
String TIMESTAMP_KEY = "timestamp";
String GROUP_KEY = "group";
String PATH_KEY = "path";
String INTERFACE_KEY = "interface";
String FILE_KEY = "file";
String DUMP_DIRECTORY = "dump.directory";
String CLASSIFIER_KEY = "classifier";
String VERSION_KEY = "version";
String REVISION_KEY = "revision";
String RELEASE_KEY = "release";
int MAX_PROXY_COUNT = 65535;
String MONITOR_KEY = "monitor";
String CLUSTER_KEY = "cluster";
String USERNAME_KEY = "username";
String PASSWORD_KEY = "password";
String HOST_KEY = "host";
String PORT_KEY = "port";
String DUBBO_IP_TO_BIND = "DUBBO_IP_TO_BIND";
/** @deprecated */
@Deprecated
String SHUTDOWN_WAIT_SECONDS_KEY = "dubbo.service.shutdown.wait.seconds";
String SHUTDOWN_WAIT_KEY = "dubbo.service.shutdown.wait";
String DUBBO_PROTOCOL = "dubbo";
String DUBBO_LABELS = "dubbo.labels";
String DUBBO_ENV_KEYS = "dubbo.env.keys";
String CONFIG_CONFIGFILE_KEY = "config-file";
String CONFIG_ENABLE_KEY = "highest-priority";
String CONFIG_NAMESPACE_KEY = "namespace";
String CHECK_KEY = "check";
}
创建RegistryConstants类并将代码复制进来:
package io.github.ningyu.jmeter.plugin.util;
/**
* @Author: Andy.jia
* @Date: 2019-12-04 10:51
*/
public interface RegistryConstants {
String REGISTRY_KEY = "registry";
String REGISTRY_PROTOCOL = "registry";
String DYNAMIC_KEY = "dynamic";
String CATEGORY_KEY = "category";
String PROVIDERS_CATEGORY = "providers";
String CONSUMERS_CATEGORY = "consumers";
String ROUTERS_CATEGORY = "routers";
String DYNAMIC_ROUTERS_CATEGORY = "dynamicrouters";
String DEFAULT_CATEGORY = "providers";
String CONFIGURATORS_CATEGORY = "configurators";
String DYNAMIC_CONFIGURATORS_CATEGORY = "dynamicconfigurators";
String APP_DYNAMIC_CONFIGURATORS_CATEGORY = "appdynamicconfigurators";
String ROUTERS_SUFFIX = ".routers";
String EMPTY_PROTOCOL = "empty";
String ROUTE_PROTOCOL = "route";
String OVERRIDE_PROTOCOL = "override";
String COMPATIBLE_CONFIG_KEY = "compatible_config";
}
3、以下代码是源码中使用了Dubbo 2.7.3支持配置中心外部化配置功能,但Dubbox2.8.4无法支持,根据使用场景评估影响面较小可直接将其屏蔽:
4、该插件支持通过zk地址获取服务列表的能力:
所以这里需要修改获取服务列表的功能,在io.github.ningyu.jmeter.plugin.dubbo.sample.ProviderService 下修改 资源配置类路径为:com.alibaba.dubbo.registry.RegistryService
5、打包,将新生成的jmeter-plugins-dubbo-2.7.4-jar-with-dependencies.jar 放置在jmeter/lib/ext下,启动jmeter最终效果如下:
兼容后插件下载地址 :https://download.youkuaiyun.com/download/u012090878/11144502