泛化调用,无需业务接口类进行远程调用,用于测试平台,开放网关桥接等(可用于生产环境)
泛化调用也可做回声测试genericService.$echo(ok);
说明:泛化引用主要是针对服务消费者,服务提供方正常暴露服务即可,无须做任何修改。
用途:泛接口调用方式主要用于客户端没有API接口及模型类元(但是可以集成dubbo)的情况,参数及返回值中的所有POJO均用Map表示,通常用于框架集成,比如:实现一个通用的服务测试框架,可通过GenericService调用所有服务实现。
好处:无须将model和api暴露出去,服务消费方只需要知道调用的接口名称、方法名、参数、参数类型等等就可以实现远程调用。
简单Demo:
(1)API(在泛化引用的情况下,不暴露给消费者):
public interface IMenusService {
public String test(String id);
}
(2)服务提供者(接口实现):
public class IndexMenusServiceImpl implements IMenusService {
@Override
public String test(String id) {
return id + "测试";
}
}
(3)在服务消费方配置:
(4)调用(基于SpringMvc):
基本类型以及Date,List,Map等不需要转换,直接调用:
@Controller
@RequestMapping("generic")
public class GenericAction {
@Resource
private GenericService genericService; //GenericService dubbo泛化类,genericService我们定义的业务接口名称(接口名)
@ResponseBody
@RequestMapping("getGeneric")
public String Generic(){
// 基本类型以及Date,List,Map等不需要转换,直接调用
Object result = genericService.$invoke("test", new String[] { "java.lang.String" }, new Object[] { "2" });// 如果返回POJO将自动转成Map
return result.toString();
}
}
如果是POJO参数
// 用Map表示POJO参数,如果返回值为POJO也将自动转成Map
Map
menus.put("menuSeq", "222");
menus.put("menuName", "远程测试");
// 如果返回POJO将自动转成Map
Object result = genericService.$invoke("getMenusModel", new String[] { "com.sic777.modules.menus.model.Menus" }, new Object[] { menus });
这样就能够在客户端没有API接口及模型类元的情况下远程调用服务。