Dubbo之泛化调用

dubbo版本

  1. dubbo版本2.6.7

泛化调用

  1. 泛化调用就是服务消费者端因为某种原因并没有该服务接口,此时通过GenericServiceinvoke需要调用的服务方法

    • 比如其他语言调用java的接口
    • consumer没有provider所定义的接口
  2. 泛接口调用方式主要用于客户端没有API接口及模型类元的情况,参数及返回值中的所有POJO均用Map表示,通常用于框架集成,比如:实现一个通用的服务测试框架或者Mock框架等,可通过GenericService调用所有服务实现。

    public interface GenericService {
        //$invoke的三个参数分别为,方法名,方法参数类型数组,方法参数数组
        Object $invoke(String method, String[] parameterTypes, Object[] args) throws GenericException;
    }
  3. Dubbo泛化有三种不同的序列化方式

    • generic = true:对参数使用 PojoUtils 进行序列化
    • generic = bean : 对参数使用 JavaBean 方式进行序列化
    • generic = nativejava:对参数使用 nativejava 方式进行序列化

Dubbo2.6.x案例

  1. 接口

    public interface DemoService {
    
        String sayHello(String name);
    
        SayResponseDTO sayHello(SayRequestDTO sayRequestDTO);
    
    }
  2. consumer配置 generic="true"

    <dubbo:reference id="demoService"
                     check="false"
                     interface="cn.jannal.dubbo.facade.DemoService"
                     group="group0"
                     generic="true"
                     version="1.0.0"/>
  3. 调用代码

    GenericService genericService = (GenericService) context.getBean("demoService");
    Object result = genericService.$invoke(
            "sayHello",
            new String[]{"java.lang.String"},
            new Object[]{"World"});
    System.out.println(result);
    
    Map<String, Object> paramsMap = new HashMap<String, Object>();
    paramsMap.put("username", "jannal");
    //如果参数时POJO,则使用map即可,如果返回的是POJO,如果返回POJO将自动转成Map
    //{result=Hello jannal, response from provider: 10.0.75.1:20882, class=cn.jannal.dubbo.facade.dto.SayResponseDTO}
    Object result2 = genericService.$invoke(
            "sayHello",
            new String[]{"cn.jannal.dubbo.facade.dto.SayRequestDTO"},
            new Object[]{paramsMap});
    System.out.println("返回:" + result2);

Dubbo2.7.x新特性

  1. 2.7.12 之后, 对于Dubbo泛化调用,提供一种新的方式:直接传递字符串来完成一次调用。即用户可以直接传递参数对象的json字符串来完成一次Dubbo泛化调用

    //设置generic为gson (这个是必须的,否则会报java.lang.String cannot be cast to cn.jannal.dubbo.facade.dto.SayRequestDTO)
    RpcContext.getContext().setAttachment("generic", "gson");
    Object result3 = genericService.$invoke(
            "sayHello",
            new String[]{SayRequestDTO.class.getName()},
            new Object[]{"{'username':'jannal'}"});
    //{result=Version:V1,Hello jannal, response from provider: 172.16.117.33:20882, class=cn.jannal.dubbo.facade.dto.SayResponseDTO}
    lo
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值