本篇文章次要介绍 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 别离叫做GenericImplFilter
、GenericFilter
。
GenericImplFilter
GenericFilter
这两个 filter 就是对泛化调用的解决,其中GenericImplFilter
是生产端的解决,而GenericFilter
是服务端的解决。生产端的解决就是对参数做一些预处理(非内置的进行序列化、以及取得后果之后的反序列化,内置的进行校验以及传递 generic 值),而服务端的解决就是对内置的泛化调用进行解决(序列化以及返序列化),从逻辑中咱们能够看到其实generic
能够有三种赋值形式,别离为 true、nativejava 以及 bean,其实就是对应的对于咱们传递的参数的解析形式,上面别离介绍一下: - true
这个是最简略的解决形式,dubbo 内置的 PojoUtils 工具类就会进行解析。 - nativejava
如果参数是 byte 数组类型的,则咱们能够通过实现Serialization
接口来自定义实现序列化和反序列化。 -
bean
如果你的参数类继承 JavaBeanDescriptor,则能够通过该种形式来转换对象。
dubbo 内置的类型转换曾经很全了,如果你有本人的转换需要,能够思考在这一块进行革新。
从源码中咱们也能够看进去,其实泛化调用就是通过 filter 过滤对传递的参数进行了一层转换,而后找到匹配的接口以及办法进行调用。总结
泛化调用的确是一种非常灵活的形式,其实现也很简略,然而对于调用者来说,绝对一般调用显得麻烦一些。在理论业务中,咱们能够联合具体场景应用泛化调用,比方测试、网关路由等。