该文章内容发布已经超过一年,请注意检查文章中内容是否过时。
以下几种场景可以考虑使用泛化调用:
泛化调用主要用于消费端没有 API 接口的情况;不需要引入接口 jar 包,而是直接通过 GenericService 接口来发起服务调用,参数及返回值中的所有 POJO 均用 Map
表示。泛化调用对于服务端无需关注,按正常服务进行暴露即可。
下面来看看消费端如何使用泛化调用进行服务调用。
在 Spring 配置申明 generic="true"
,如:
需要使用的地方,通过强制类型转化为 GenericService 进行调用:
其中:
$invoke
,它接受三个参数,分别为方法名、方法参数类型数组和参数值数组;int.class.getName()
获取其类型;int[].class.getName()
;com.alibaba.dubbo.samples.generic.api.Params
。通过 API 的方式,不需要像 XML 的方式需要提前将服务配置好,可以动态构建 ReferenceConfig;相对 XML 来说,API 的方式更常见。
比如方法签名是 User get(Params params);
其中 User 有 id 和 name 两个属性,Params 有 query 一个属性。
以下是消费端的调用代码:
上述代码的输出结果为:
这里,Dubbo 框架会自动将 POJO 的返回值转换成 Map。可以看到,返回值 user
是一个 HashMap,里面分别存放了 name、id、class 三个 k/v。
泛接口实现方式主要用于服务端没有 API 接口的情况,参数及返回值中的所有 POJO 均用 Map 表示,通常用于框架集成,如实现一个通用的远程服务 Mock 框架,可通过实现 GenericService 接口处理所有服务请求。
同样,也可以使用 XML 配置的方式暴露服务;此时服务端是没有依赖 HiService 和 HelloService 这两个接口的。
同样,消费端也可以使用 XML 配置的方式引用服务,然后进行调用。这里可以看到调用方式为普通的服务调用,并非泛化调用。当然使用泛化调用也是可以的。
到这里为止,一个简易的服务 Mock 平台就成功上线了!
Dubbo
协议之上的。在 2.6.2 版本之前,其他协议如 http/hessian 等是不支持泛化调用的,2.6.3 版本将会对这两个协议的泛化调用做支持。