背景
随着业务的发展,业务越来越复杂,为了提高系统性能,对业务解耦,对系统按业务模块拆分;服务之间的治理(SOA)、远程服务调用(RPC),组成复杂的网状的分布式系统。用户的访问的(pc,h5,android,ios等前端)页面并没有对业务系统暴露的接口服务全面的测试,存在潜在风险,为此写了一个远程服务接口测试的DEMO (DUBBO服务为例)
应用场景
技术实现
1.使用技术
- 类加载器-加载需要dubbo服务接口jar
- 动态代理-订阅消费者服务;调用订阅服务的方法
- 反射-获取类的方法及参数信息
- 反序列化-fastJson实现对象序列化,反序列化
- 缓存-jvm缓存消费者服务,方法参数等信息,本地文件缓存页面请求参数信息
2.类加载器加载订阅服务的jar或者订阅服务jar的目录
3.订阅消费服务
人工订阅返回动态代理消费者服务并缓存
4.消费服务方法封装
反射获取对象方法及参数信息
5.方法请求参数类型转换
将请求参数转换成方法对应的数据类型
6.代理执行方法
获取订阅消费者服务,代理调用具体要访问的方法
7.查看类加载器加载的所有jar
8.复制响应结果
9.效果显示
自动加载填充方法列表
3.调用Dubbo接口
注:多个请求参数对象用“;”分割,请求参数内容不能含有“;”
4.结果展示
5.功能菜单说明
导入JAE地址:是类加载器需要订阅消费服务的jar和目录,可输入或者点击“导入jar”选在目录和jar
注册中心:是指zookeeper注册中心
订阅服务:要调用dubbo的消费者服务ClassPath
订阅版本:暴露服务的版本号
订阅服务按钮:会订阅服务并初始化消费者方法信息
调用接口:调用消费者方法
复制请求:会将左侧请求域的内容复制到剪切板
复制结果:会将右侧响应域的内容复制到剪切板
JSON格式化:会将左侧请求域数据JSON格式化后在右侧响应域显示,必需是JSON格式
JAR类加载:会把当前客户端AppClassLoader加载器加载的所有jar显示在右侧响应域
核心类及方法解释说明
fills.tools.dubbo.CustomerDubboService-订阅服务
1.fills.tools.dubbo.CustomerDubboService.getCustomerDubboService(String, Class, String, String)
/**
* 订阅消费者服务
* @param zk 注册中心
* @param c3 订阅服务的反射对象
* @param ver 注册版本
* @param key 缓存key
* @return Object 订阅消费之服务
* @throws Exception
*/
2.fills.tools.dubbo.CustomerDubboService.getDubboServiceMethods(Class)
/**
*
* @Function: CustomerDubboService.java
* @Description: 封装方法参数并缓存JVM
*
* @param: c3 订阅服务的反射对象
* @param:
* @return:List<Map<String,String>>
*
*
*/
fills.tools.dubbo.CustomerDubboCache-缓存订阅服务
1.fills.tools.dubbo.CustomerDubboCache.setCustomerDubbo(String, Object)
/**
* 缓存消费者服务JVM缓存
* @param key 缓存key
* @param obj 消费者服务
*/
2.fills.tools.dubbo.CustomerDubboCache.getCustomerDubbo(String)
/**
* 从JVM缓存获取消费者服务
* @param key 缓存key
* @return Object 消费者服务
*/
fills.tools.dubbo.MethodCache-缓存反射对象方法信息
1.fills.tools.dubbo.MethodCache.setMethod(String, Class)
/**
*
* @Function: MethodCache.java
* @Description: 将反射对象的方法缓存至JVM
*
* @param: key 缓存key
* @param: c3 订阅服务的反射对象
* @return:void
*
*/
2.fills.tools.dubbo.MethodCache.getMethod(String)
/**
* 获取方法
* @param key 缓存key
* @return Method
*/
fills.tools.dubbo.MethodParamsTypeChange-调用方法的数据类型转换
1.fills.tools.dubbo.MethodParamsTypeChange.dataTypeChange(String[], Parameter[])
/**
*
* @Function: MethodParamsTypeChange.java
* @Description: 请求域的请求参数数据类型转换消费者服务方法的对象
*
* @param: params 请求域参数
* @param: paramsArr Method对应的参数数据类型
* @return:Object[] Method方法对应的参数结果
*
*/
fills.tools.dubbo.MethodProxy 调用方法代理类
1.fills.tools.dubbo.MethodProxy.proxy(Object, Method, Object[])
/**
*
* @Function: MethodProxy.java
* @Description: 执行代理方法
*
* @param: obj 订阅服务代理类对象
* @param: methods 调用的方法对象
* @param: params 调用方法对象的参数
* @return:Object 返回调用结果
*/
fills.tools.java.ClassLoaderUtil 类加载器
1.fills.tools.java.ClassLoaderUtil.addJar(File)
/**
*
* @Function: ClassLoaderUtil.java
* @Description: 加载新的jar或者jar目录
*
* @param: file 加载新的jar或者jar目录的文件
* @return:void
*/
2.fills.tools.java.ClassLoaderUtil.addJar(URL[])
/**
* 加载jar的URL至类加载器
* @Function: ClassLoaderUtil.java
* @Description: 加载新的jar转换成URL
*
* @param: urls jar路径的URLS
* @return:void
*/
3.fills.tools.java.ClassLoaderUtil.getClass(String, String)
/**
* 如果第一次反射,报错提示嘞不存在,会加载jarPath至加载器,再次发射获取对象
* @Function: ClassLoaderUtil.java
* @Description: 通过反射获取类Class
*
* @param: classPath 反射对象的地址
* @param: jarPath 待加载类的地址
* @return:Class<?> 反射对象
*/
4.fills.tools.java.ClassLoaderUtil.getClass(String)
/**
*
* @Function: ClassLoaderUtil.java
* @Description: 通过反射获取类Class
*
* @param: classPath
* @return:Class<?>
*/
5.fills.tools.java.ClassLoaderUtil.getClassLoader()
/**
*
* @Function: ClassLoaderUtil.java
* @Description: 获取加载器当前加载jar列表信息
*
* @param:@return
* @return:List<String> 加载Jar列表地址信息
*/
fills.tools.jna.ToolkitUtil-剪切板工具
1.fills.tools.jna.ToolkitUtil.setContents(Object)
/**
*
* @Function: ToolkitUtil.java
* @Description: 将contents赋值到剪切板
*
* @param: contents 复制内容
* @return:void
*/
执行exe
注:支持windows,jdk1.8环境