Dubbo具体的Java调用方式可以参考这篇文章《Dubbo接口泛化调用》。
列表展示大概如下:
前端配置页,则是对入参进行二次封装。
返回结果的处理部分,与http请求基本一致
bean文件
@Data public class DubboCase { /** 主键id */ private int id; /** 创建人 */ private String createrName; /** 创建人code */ private String createrCode; /** 创建时间 */ @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd") private Date createDate; /** 更新人 */ private String updaterName; /** 更新人 */ private String updaterCode; /** 更新时间 */ @JsonFormat(locale="zh", timezone="GMT+8", pattern="yyyy-MM-dd") private Date updateDate; /** 所属系统名称 */ private String systemName; /** 前端填写的apiName */ private String apiName; /** 传给dubbo服务器的接口名 */ private String apiNameValue; /** zookeeper地址 */ private String zkAddress; /** 服务名 */ private String serviceName; /** 分组 */ private String groupName; /** zookeeper版本 */ private String version; /** 入参 */ private String params; /** 函数名 */ private String functionName; /** 类名 */ private String className; /** 备注 */ private String description; /** 需要保存的变量 */ private String variableListValue; private List<VariableSave> variableList; /** 校验方式 */ private String expectedListValue; private List<Expected> expectedList; /** 最后一次请求状态 */ private Boolean status; /** 响应结果 */ private String result; } |
service层
与http请求的处理基本一致,都是逐条case遍历进行处理,区别在于String result = ApiTestUtils.doDubboRequest(dubboCase);
@Override public ResponseVo excuteRequest(Integer[] ids) { ResponseVo responseVo = new ResponseVo(); // 全局变量赋值 List<Variable> variableList = apiTestConfigMapper.selectGlobalVariable(); for (Variable variable:variableList){ ApiTestConfig.globalVariableMap.put(variable.getVariableName(), variable.getVariableValue()); } // 获取当前选中的所有case List<DubboCase> caseList = dubboCaseMapper.selectDubboCaseListByIds(ids); // 遍历caseList,进行http请求 for (DubboCase dubboCase :caseList){ String result = ApiTestUtils.doDubboRequest(dubboCase); // 保存变量 ApiTestUtils.saveVariable(result, dubboCase.getVariableListValue(), ApiTestConfig.GLOBAL_COLLECTION_ID); // 判断是否通过了所有校验条件 if (ApiTestUtils.verifyResult(result, dubboCase.getExpectedListValue(), ApiTestConfig.GLOBAL_COLLECTION_ID)){ dubboCase.setStatus(Boolean.TRUE); } else { dubboCase.setStatus(Boolean.FALSE); } // 给testCase的执行状态进行赋值 dubboCase.setResult(result); // 更新数据库保存的信息 setJsonValue(dubboCase); dubboCaseMapper.updateDubboCase(dubboCase); // 将执行后的结果返回给前端 responseVo.setIsSuccess(Boolean.TRUE); responseVo.setResult(dubboCase); } return responseVo; } |
ApiTestUtils
public static String doDubboRequest(DubboCase dubboCase){ ApplicationConfig application = new ApplicationConfig(); application.setName(getVariable(dubboCase.getApiNameValue())); // 连接注册中心配置 RegistryConfig registry = new RegistryConfig(); registry.setAddress(getVariable(dubboCase.getZkAddress())); ReferenceConfig<GenericService> reference = new ReferenceConfig<>(); reference.setApplication(application); reference.setRegistry(registry); reference.setInterface(getVariable(dubboCase.getServiceName())); // 声明为泛化接口 reference.setGeneric(true); reference.setGroup(getVariable(dubboCase.getGroupName())); reference.setVersion(getVariable(dubboCase.getVersion())); try { ReferenceConfigCache cache = ReferenceConfigCache.getCache(); GenericService genericService = cache.get(reference); HashMap<String, Object> maps = EntityUtil.jsonToMap(getVariable(dubboCase.getParams())); // 基本类型以及Date,List,Map等不需要转换,直接调用 Object result = genericService.$invoke(getVariable(dubboCase.getFunctionName()), new String[]{getVariable(dubboCase.getClassName())}, new Object[]{maps}); return JSON.toJSONString(result); } catch (Exception e) { e.printStackTrace(); } return null; } |
目前Dubbo请求只支持调试执行,最近考虑在场景执行里,支持http与dubbo的混合执行。emm,如果场景支持多类型接口了,可能顺便会把sql执行,显示等待,函数助手等功能都加进去。这样,预计开源时间会推迟到3月以后。
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理