如何快速的在fat、uat、prod调用dubbo

84 阅读1分钟

从开始干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&params=10,20