场景
泛化调用主要用于消费端没有 API 接口的情况;不需要引入接口 jar 包,而是直接通过 GenericService 接口来发起服务调用,参数及返回值中的所有 POJO 均用 Map 表示
。泛化调用对于服务端无需关注,按正常服务进行暴露即可。
Code示例
注入GenericService
@Bean
public GenericService getAuthGeneric(){
// 引用远程服务
ReferenceConfig<GenericService> reference = new ReferenceConfig<>();
// 弱类型接口名(服务提供者的全类名)
reference.setInterface("com.demo.provider.OperLogProvider");
// 声明为泛化接口
reference.setGeneric(true);
reference.setCheck(false);
return ReferenceConfigCache.getCache().get(reference);
}
调用接口
// 先注入依赖
//@Resource
//private GenericService genericService;
Map<String, Object> model = new HashMap<>();
model.put("name", "Alice");
Object respObj = genericService.$invoke("sayHello", new String[]{"com.demo.provider.ro.OperLogRo"}, new Object[]{model});
参数说明:
GenericService 这个接口只有一个方法,名为 $invoke,它接受三个参数,分别为方法名
、方法参数类型数组
和参数值数组
;
对于方法参数类型数组
- 如果是基本类型
- 如 int 或 long,可以使用 int.class.getName()获取其类型;
- 如果是基本类型数组,如 int[],则可以使用 int[].class.getName();
- 如果是 POJO
- 直接使用全类名,如 com.alibaba.dubbo.samples.generic.api.Param
- 如果是泛型的POJO
- 泛型对象使用
class
的key,value使用泛型对象全类名
- 泛型对象使用
对于参数值数组
- 直接使用Map不需要关心具体的POJO、Dubbo会自行处理相关逻辑
补充泛型示例:
// com.demo.dubbo.request.BasePageRequest
// BasePageRequest<User>
Map<String,Object> parameters = new HashMap<>();
parameters.put("pageNo", 1);
parameters.put("pageSize", 20);
Map<String,String> obj = new HashMap<>();
obj.put("name", "Alex");
obj.put("class", "com.demo.dubbo.modle.User" );
parameters.put("obj", obj);`
验证
参考官方地址:https://cn.dubbo.apache.org/zh-cn/blog/2018/08/14/dubbo%E7%9A%84%E6%B3%9B%E5%8C%96%E8%B0%83%E7%94%A8/