1 简介
Dubbo目前的应用已经越来越广泛、或者基于Dubbo二次开发的也越来越多,使用到Dubbo的系统基本也是采用微服务架构设计的系统,多个系统、多个应用之间的接口是有依赖关系的,所以就会出现需要MOCK的应用场景。
当我们发布了两个应用A和B,应用A引用应用B发布的接口,那么我们的应用场景是MOCK应用B(接口提供方)。通常的MOCK方式是,测试人员自己发布一个一样的接口(应用C),然后把应用A的调用指向(应用C),这种方式可以解决MOCK,但是这种方式的弊端:
1.需要开发MOCK代码
2.对人员要求技能高
3.需要接口提供方的依赖jar
4.需要容器发布应用C
5.接口变更需要更新MOCK代码
6.发布时间长,需要编码发布
我们可以采取另外一个方式,通过添加dubbo的filter过滤器,通过过滤器拦截请求,把请求导向mock平台,或者拦截请求后直接返回已经缓存的响应数据,达到mock的效果而且可以配置返回的数据内容和响应时间。filter是放在消费端的(应用A),配置filter之后应用A的请求首先会到filter里面。
下面是添加filter后需要实现的工作流程图:
具体的filter代码实现请看下面的章节介绍!
RPC接口mock平台架构图:
2 RPC接口mock平台在接口测试中的用处
2.1 屏蔽关联接口依赖关系,快速定位接口的性能瓶颈点
当被测试接口依赖多个其他接口时,出现了性能问题后无法定位性能瓶颈是出在被测接口还是其他依赖的接口,这时可以使用接口mock平台屏蔽掉其他依赖的接口,这样就可以很快的定位是被测接口存在性能问题,还是其他依赖接口存在性能问题。
2.2 用mock平台代替依赖服务的部署,提高环境部署的效率,减少环境部署的工作量。
当进行集群测试时,需要部署大量的其他依赖服务器,如果依赖的服务部署比较繁琐,工作量较大时,可以考虑使用mock平台代替依赖服务的部署,既节省服务器资源又可提高部署环境的效率。
2.3 使用mock平台,可以方便查看被测试接口的依赖关系
从mock平台配置界面或者数据库可以看到被测接口依赖的其他接口列表:
2.4 使用mock平台的配置界面可以方便配置接口的mock参数(返回数据,mock开关,响应时间)
可以在mock平台的前端配置界面配置接口的mock参数,例如返回数据,mock开关,响应时间等。
3 RPC接口mock测试平台使用方法
3.1 实现com.alibaba.dubbo.rpc.Filter接口
实现com.alibaba.dubbo.rpc.Filter接口的类CustomConsumerFilter 代码如下:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.lang.reflect.Method;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import net.sf.json.JSONObject;
import com.alibaba.dubbo.rpc.Filter;
import com.alibaba.dubbo.rpc.Invocation;
import com.alibaba.dubbo.rpc.Invoker;
import com.alibaba.dubbo.rpc.Result;
import com.alibaba.dubbo.rpc.RpcException;
import com.alibaba.dubbo.rpc.RpcResult;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
@SuppressWarnings("deprecation")
public class CustomConsumerFilter implements Filter {
public static Map<String, Object> map = new HashMap<String, Object>(); //保存接口对象
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
Result result = null;