从开始干IT,已经经历了三家公司了,三家公司是采用dubbo作为服务的治理框架
遇到一些公司没有搭建各个环境的dubbo调试环境,今天给各位小伙伴支一招,转化dubbo接口为http接口,然后在页面进行调用,这样就可以在各个h5页面进行调用了
demo
@Slf4j
@RestController
@RequestMapping("dubbo")
public class DubboInvokerController {
@Resource
private ApplicationContext context;
@RequestMapping("invoke/put")
public Object invoke(@RequestBody InvokeInfo invokeInfo) {
try {
Class clazz = Class.forName(invokeInfo.getClassName());
Object object = context.getBean(clazz);
Method[] declaredMethods = clazz.getDeclaredMethods();
for (Method method : declaredMethods) {
if (!Objects.equals(method.getName(), invokeInfo.getMethodName())) {
continue;
}
Class[] paramTypes = method.getParameterTypes();
if (paramTypes.length != invokeInfo.getParams().size()) {
continue;
}
List<Object> paramObjs = new ArrayList<>();
List<String> params = invokeInfo.getParams();
for (int i = 0; i < paramTypes.length; i++) {
String param = params.get(i);
Object paramObj = JSONObject.parseObject(param, paramTypes[i]);
paramObjs.add(paramObj);
}
return method.invoke(object, paramObjs.toArray());
}
} catch (Exception e) {
log.error("invoke error", e);
return "fail";
}
return "fail";
}
@RequestMapping("invoke/get")
public Object invoke(String className, String methodName, String params) {
try {
InvokeInfo invokeInfo = new InvokeInfo();
invokeInfo.setClassName(className);
invokeInfo.setMethodName(methodName);
String[] split = params.split(",");
invokeInfo.setParams(Arrays.asList(split));
Class clazz = Class.forName(invokeInfo.getClassName());
Object object = context.getBean(clazz);
Method[] declaredMethods = clazz.getDeclaredMethods();
for (Method method : declaredMethods) {
if (!Objects.equals(method.getName(), invokeInfo.getMethodName())) {
continue;
}
Class[] paramTypes = method.getParameterTypes();
if (paramTypes.length != invokeInfo.getParams().size()) {
continue;
}
List<Object> paramObjs = new ArrayList<>();
List<String> paramsStr = invokeInfo.getParams();
for (int i = 0; i < paramTypes.length; i++) {
String param = paramsStr.get(i);
Object paramObj = JSONObject.parseObject(param, paramTypes[i]);
paramObjs.add(paramObj);
}
return method.invoke(object, paramObjs.toArray());
}
} catch (Exception e) {
log.error("invoke error", e);
return "fail";
}
return "fail";
}
}
在h5页面调用这些接口就可以了
http://localhost:8081/dubbo/invoke/get?className=com.javashitang.producer.service.UserServiceImpl&methodName=hello¶ms=10,20