乐趣区

关于dubbo:泛化调用

本篇文章次要介绍 dubbo 的泛化调用。次要知识点如下:

  • 什么是泛化调用
  • 如何应用泛化调用
  • 泛化调用原理

    什么是泛化调用

    泛化接口调用形式次要用于客户端没有 API 接口及模型类元的状况,这是官网的说法,对于新人我认为太形象了,这里解释一下。咱们在做失常的 dubbo 调用时,服务端会提供一个所有接口的 jar 包让客户端引入,此时客户端就晓得服务端提供了哪些接口并进行应用,参考 如何搭建并进行调用,而对于泛化调用,咱们还是须要晓得服务端提供了哪些接口,只不过是程序不晓得而已,此时咱们在程序中应用泛化调用,显示填入须要调用的接口名称,dubbo 会进行匹配并进行调用后返回。

    如何应用泛化调用

    下面介绍了泛化调用的概念,这里介绍一下如何应用。
    假如服务端提供如下接口

    package com.example.dubboprovider.rpc;
     
    public interface CityService {String getCityName();
    }

    泛化调用最重要的就是 GenericService,首先咱们定义一个服务援用

        @Reference(interfaceName = "com.example.dubboprovider.rpc.CityService", generic = true)
        GenericService genericService;

    下面的代码里定义了一个 GenericService,留神下面的注解 @Reference,在之前的文章中说到过这个注解表明是一个 dubbo 援用,注解外面 interfaceName 用来表明你要应用的接口类,generic 为 true 用来表明是泛化调用,这样一个泛化接口就实现了。
    再来看下调用

    Object name = genericService.$invoke("getCityName", new String[]{}, new Object[]{});

    通过以上几个步骤,一个简略的泛化调用就实现了。

    原理

    顺着下面的例子讲述,介绍一下泛化调用的原理。
    首先援用服务(参考服务调用过程解析,前面会写),dubbo 会为下面定义的 genericService 生成一个代理类,在代码逻辑 genericService.$invoke 的时候就会走到 dubbo 生成的代理类中。在讲 dubbo filter 的时候咱们讲到 dubbo 内置了一些 filter,其中就有两个 filter 别离叫做 GenericImplFilterGenericFilter
    GenericImplFilter

    GenericFilter

    这两个 filter 就是对泛化调用的解决,其中 GenericImplFilter 是生产端的解决,而 GenericFilter 是服务端的解决。生产端的解决就是对参数做一些预处理(非内置的进行序列化、以及取得后果之后的反序列化,内置的进行校验以及传递 generic 值),而服务端的解决就是对内置的泛化调用进行解决(序列化以及返序列化),从逻辑中咱们能够看到其实 generic 能够有三种赋值形式,别离为 true、nativejava 以及 bean,其实就是对应的对于咱们传递的参数的解析形式,上面别离介绍一下:

  • true
    这个是最简略的解决形式,dubbo 内置的 PojoUtils 工具类就会进行解析。
  • nativejava
    如果参数是 byte 数组类型的,则咱们能够通过实现 Serialization 接口来自定义实现序列化和反序列化。
  • bean
    如果你的参数类继承 JavaBeanDescriptor,则能够通过该种形式来转换对象。
    dubbo 内置的类型转换曾经很全了,如果你有本人的转换需要,能够思考在这一块进行革新。
    从源码中咱们也能够看进去,其实泛化调用就是通过 filter 过滤对传递的参数进行了一层转换,而后找到匹配的接口以及办法进行调用。

    总结

    泛化调用的确是一种非常灵活的形式,其实现也很简略,然而对于调用者来说,绝对一般调用显得麻烦一些。在理论业务中,咱们能够联合具体场景应用泛化调用,比方测试、网关路由等。

退出移动版