• dubbo接口泛化调用例子


    @ApiOperation(value = "dubbo泛化调用工具接口")
        public Result dubboApiTool(
                @ApiParam(value = "interfaceName", defaultValue = "com.shop.api.ShopService") @Param(value = "interfaceName", required = true) String interfaceName,
                @ApiParam(value = "methodName", defaultValue = "loadShopByCode") @Param(value = "methodName", required = true) String methodName,
                @ApiParam(value = "接口入参列表", defaultValue = "[]")
                @Json(value = "methodParams", array = Object.class, defaultValue = "[]") List<Object> methodParams,
                HttpServletRequest request) throws ClassNotFoundException {
    
            // 校验登录
            Result checkLoginResult = CommonUtil.loginAuthVerify(request);
            if (!checkLoginResult.isSuccess()) {
                log.error("未登录用户无权限执行此操作");
                return checkLoginResult;
            }
    
            if (!OptimusConfig.getValue("TOOL_API_OPERATORS_MOBILES")
                    .contains(((Principal) checkLoginResult.getData()).getUserPhone())) {
                return Result.fail("401", "当前用户无操作权限");
            }
    
            ApplicationConfig application = new ApplicationConfig();
            application.setName("api-generic-consumer-zjt");
    
            RegistryConfig registry = new RegistryConfig();
            registry.setAddress(OptimusConfig.getValue("dubbo.registry.address", "zookeeper://stable.zk.scsite.net:2181"));
            application.setRegistry(registry);
    
            ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
            // 弱类型接口名
            reference.setInterface(interfaceName);
            // 声明为泛化接口
            reference.setGeneric(true);
    
            reference.setApplication(application);
    
            // 用com.alibaba.dubbo.rpc.service.GenericService可以替代所有接口引用
            GenericService genericService = reference.get();
    
            /**
             * GenericService 这个接口只有一个方法,名为 $invoke,它接受三个参数,分别为方法名、方法参数类型数组和参数值数组;
             * 对于方法参数类型数组 如果是基本类型,如 int 或 long,可以使用 int.class.getName()获取其类型; 如果是基本类型数组,如
             * int[],则可以使用 int[].class.getName(); 如果是 POJO,则直接使用全类名,如
             * com.alibaba.dubbo.samples.generic.api.Params。
             */
    
            //全部方法
            Method[] methods = Class.forName(interfaceName).getMethods();
    
            Method method = Arrays.stream(methods).filter(m ->
                    methodName.equalsIgnoreCase(m.getName())
                            && methodParams.size()==m.getParameterTypes().length)
                    .findFirst().get();
    
            Class[] params = method.getParameterTypes();
    
            List<String> paramNameList = Arrays.stream(params).map(p -> p.getName()).collect(Collectors.toList());
    
    
            Map map = (Map) genericService.$invoke(methodName,
                    paramNameList.toArray(new String[paramNameList.size()]),
                    methodParams.toArray(new Object[methodParams.size()]));
    
            return Result.success(new JSONObject(map).toJSONString());
    
        }
  • 相关阅读:
    项目开发日志——第三篇
    项目开发日志——第二篇
    项目开发日志——第一篇
    实时控制软件设计第四周作业
    实时控制软件设计第三周作业
    实时控制软件设计第二周作业
    关于开放式CNC系统实时软件控制系统的一些简单分析
    初学者的卡尔曼滤波——扩展卡尔曼滤波(一)
    C++_Eigen函数库用法笔记——The Array class and Coefficient-wise operations
    C++_Eigen函数库用法笔记——Block Operations
  • 原文地址:https://www.cnblogs.com/zhaojiatao/p/11238480.html
Copyright © 2020-2023  润新知