dubbo版本
- dubbo版本2.6.7
泛化调用
-
泛化调用就是服务消费者端因为某种原因并没有该服务接口,此时通过
GenericService
来invoke
需要调用的服务方法- 比如其他语言调用java的接口
consumer
没有provider
所定义的接口
-
泛接口调用方式主要用于客户端没有API接口及模型类元的情况,参数及返回值中的所有POJO均用Map表示,通常用于框架集成,比如:实现一个通用的服务测试框架或者Mock框架等,可通过GenericService调用所有服务实现。
public interface GenericService { //$invoke的三个参数分别为,方法名,方法参数类型数组,方法参数数组 Object $invoke(String method, String[] parameterTypes, Object[] args) throws GenericException; }
-
Dubbo泛化有三种不同的序列化方式
- generic = true:对参数使用 PojoUtils 进行序列化
- generic = bean : 对参数使用 JavaBean 方式进行序列化
- generic = nativejava:对参数使用 nativejava 方式进行序列化
Dubbo2.6.x案例
-
接口
public interface DemoService { String sayHello(String name); SayResponseDTO sayHello(SayRequestDTO sayRequestDTO); }
-
consumer配置
generic="true"
<dubbo:reference id="demoService" check="false" interface="cn.jannal.dubbo.facade.DemoService" group="group0" generic="true" version="1.0.0"/>
-
调用代码
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新特性
-
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