Dubbo泛化调用

本文介绍了在Dubbo中,如何通过GenericService接口在消费端进行泛化调用,无需引入API接口,参数和返回值使用Map表示。文章详细讲解了如何注入GenericService,调用接口的方法以及参数处理方式,并提供了官方文档链接作为参考。
摘要由CSDN通过智能技术生成

场景

泛化调用主要用于消费端没有 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/

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值