一个用于对dubbo接口进行mock的agent
动态配置相关类改动比较大,目前仅支持apache dubbo 2.7.5
通过javassist对dubbo框架中的MockClusterInvoker植入mock逻辑(可以避免No Provider),植入的逻辑如下
添加字段
private static final org.apache.dubbo.common.config.Configuration CONFIGURATION = org.apache.dubbo.rpc.model.ApplicationModel.getEnvironment().getConfiguration();
private static final boolean IS_MOCK = Boolean.parseBoolean(getConfig("easymock.enable","false"));
添加方法
private static String getConfig(String key, String defaultValue) {
String value;
org.apache.dubbo.common.config.configcenter.DynamicConfiguration dynamicConfiguration = org.apache.dubbo.common.config.configcenter.DynamicConfiguration.getDynamicConfiguration();
if ((value = dynamicConfiguration.getConfig(key, "easymock")) != null) {
return value;
}
return CONFIGURATION.getString(key, defaultValue);
}
invoke方法调用开始植入mock逻辑
if(IS_MOCK){
String mockValue= getConfig("easymock."+invocation.getServiceName()+"#"+invocation.getMethodName(),null);
if(mockValue!=null&&mockValue.length()>0){
java.lang.reflect.Type[] returnTypes = io.github.cmt.dema.util.ClassHelper.getReturnType($1.getServiceName(), $1.getMethodName(), $1.getParameterTypes());
return new org.apache.dubbo.rpc.AppResponse(io.github.cmt.dema.MockValueResolver.resolve(mockValue, returnTypes[0], returnTypes.length > 1 ? returnTypes[1] : null));
}
}
与dubbo-easy-mock项目不同不是,这边不会将请求转发到外部的Http Mock服务器,而是使用到了Dubbo2.7新增的配置中心特性,会优先从外部配置中心(比如apollo)读取配置。
- 打包得到
dubbo-easy-mock-agent.jar
- 你的应用jvm参数增加
-javaagent:/{path}/dubbo-easy-mock-agent.jar
- 进行mock配置
- 配置格式 不管是配置中心还是系统参数,或者properties文件,配置格式如下
## 开关
easymock.enable=true
## 针对具体方法的mock配置
easymock.io.github.shengchaojie.demo.DemoService#returnString={"data":"7758258"}
优先级从高到低如下
-
外部配置,最新版dubbo支持apollo,consul,etcd,nacos,zookeeper 以常用的apollo为例,在apollo新建一个namespace=easymock,格式见0
-
系统参数 通过jvm参数—D进行的配置
-Deasymock.enable=true
-Deasymock.io.github.shengchaojie.demo.DemoService#returnString={"data":"7758258"}
3.本地配置文件 见0
使用dubbo官方的用例项目dubbo-samples中的dubbo-samples-configcenter-apollo模块
-
启动apollo 这边使用到它提供的docker-compose配置文件,在该配置文件路径执行 docker-compose up -d 命令启动相关服务
-
一些配置修改
-
启动consumer