【博客】泛化调用实战,Dubbo入门你必须学会的技能

本文大纲

  • 简述
  • 为什么需要泛化
  • 泛化实现
  • 参数对照表
  • 总结

一、简述

阅读过上一篇《Dubbo一直都很好用的功能,你或许蒙在鼓里》,有经验的同学早已驾轻就熟,但对于刚涉入Dubbo的同学而言或许苦不堪言。然而,Dubbo泛化调用在实际应用场景中有举无轻重的作用。所以,觉着将泛化这个知识点切碎嚼烂是一件非常有意义的事儿。便有了这一篇关于Dubbo泛化的实战。

二、为什么需要泛化

就Dubbo框架而言,服务提供者需要暴露出接口和方法,服务消费者需要明确知道服务暴露的接口、方法、参数、返回值,然后两者之间才能通信。

而在实际开发过程中,存在以下几种情况:

1、开发工程中 有时候想要测试dubbo接口 需要自定义用例,比较麻烦
2、无法调用服务器上的dubbo测试
3、无法随意调用多版本的服务
4、dubbo中跨语言调用tars协议、thrift协议、grpc协议、http或http2协议
5、如果一个网关调用了N个服务,那就需要引入N个Jar依赖,这样网关系统难以维护
为了应对这样的需求,dubbo 提供了泛化实现和泛化引用,不再需要传统的接口、方法定义,甚至接口可以只有一个名字而没有具体 interface 定义。
三、泛化实现
服务提供者
//接口类public interface DemoService {  String hello(String name);}//接口实现类public class DemoServiceImpl implements DemoService {  public String hello(String name) {    return "hello " + name;  }}
泛化调用
public class GenericServiceDemo {    public static void main(String[] args) {        RegistryConfig registryConfig = new RegistryConfig();        registryConfig.setAddress("zookeeper://127.0.0.1:2181");        // 应用配置        ApplicationConfig applicationConfig = new ApplicationConfig();        applicationConfig.setName("demo-consumer");        // 引用远程服务        // 该实例很重量,里面封装了所有与注册中心及服务提供方连接,请缓存        ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();        reference.setRegistry(registryConfig);        reference.setApplication(applicationConfig);        // 弱类型接口名        reference.setInterface("com.leizi.service.DemoService");        // 版本号        reference.setVersion("1.0.0");        // 超时        reference.setTimeout(12001);        // 声明为泛化接口        reference.setGeneric(true);        GenericService genericService = reference.get();        // 基本类型以及Date,List,Map等不需要转换,直接调用;更多请看参考表        Object result = genericService.$invoke("hello"new String[]{"java.lang.String"}, new Object[]{"world"});        System.out.println(result.toString());    }}

注:
GenericService 这个接口只有一个方法,名为$invoke,它接受三个参数,分别为方法名、方法参数类型数组和参数值数组;通过以上,就可以在没有 API 接口的情况下,不依赖服务提供方jar包,进行Dubbo接口的调用。进行Dubbo服务调用的时候,只需要知道接口名称,方法名称,入参类型即可完成调用。

四、参数对照参考表

参数对照参考表如下

Java类型 paramType paramValue
int int 1
double double 1.2
short short 1
float float 1.2
long long 1
byte byte 字节
boolean boolean true或false
char char A,如果字符过长取值为:”STR”.charAt(0)
java.lang.String java.lang.String或String或string 字符串
java.lang.Integer java.lang.Integer或Integer或integer 1
java.lang.Double java.lang.Double或Double 1.2
java.lang.Short java.lang.Short或Short 1
java.lang.Long java.lang.Long或Long 1
java.lang.Float java.lang.Float或Float 1.2
java.lang.Byte java.lang.Byte或Byte 字节
java.lang.Boolean java.lang.Boolean或Boolean true或false
JavaBean com.package.Bean {“service”:“test1”,“url”:“test”,“action”:“GET”,

“enabled”:true,“isPublic”:false,“appId”:8,“menuId”:30001}

java.util.Map以及子类 java.util.Map以及子类 {“service”:“test1”,“url”:“test”,“action”:“GET”,

“enabled”:true,“isPublic”:false,“appId”:8,“menuId”:30001}

java.util.Map<String,JavaBean> java.util.Map {“name”:{“service”:“test1”,“url”:“test”,“action”:“GET”,

“enabled”:true,“isPublic”:false,“appId”:8,“menuId”:30001},“value”:{“service”:“test1”,“url”:“test”,“action”:“GET”,

“enabled”:true,“isPublic”:false,“appId”:8,“menuId”:30001}}

java.util.HashMap<Object,Object> java.util.HashMap {“name”:{“service”:“test1”,“url”:“test”,“action”:“GET”,

“enabled”:true,“isPublic”:false,“appId”:8,“menuId”:30001},“value”:{“service”:“test1”,“url”:“test”,“action”:“GET”,

“enabled”:true,“isPublic”:false,“appId”:8,“menuId”:30001}}

java.util.Collection以及子类 java.util.Collection以及子类 [“a”,“b”]
java.util.List<String> java.util.List [“a”,“b”]
java.util.List<JavaBean> java.util.List [{“service”:“test1”,“url”:“test”,“action”:“GET”,

“enabled”:true,“isPublic”:false,“appId”:8,“menuId”:30001},{“service”:“test1”,“url”:“test”,“action”:“GET”,

“enabled”:true,“isPublic”:false,“appId”:8,“menuId”:30001}]

java.util.List<Map<Object, JavaBean>> java.util.List [{“name”:{“service”:“test1”,“url”:“test”,“action”:“GET”,

“enabled”:true,“isPublic”:false,“appId”:8,“menuId”:30001},“value”:{“service”:“test1”,“url”:“test”,“action”:“GET”,

“enabled”:true,“isPublic”:false,“appId”:8,“menuId”:30001}},{“name”:{“service”:“test1”,“url”:“test”,“action”:“GET”,

“enabled”:true,“isPublic”:false,“appId”:8,“menuId”:30001},“value”:{“service”:“test1”,“url”:“test”,“action”:“GET”,

“enabled”:true,“isPublic”:false,“appId”:8,“menuId”:30001}}]

java.util.List<Long> java.util.List [1,2,3]
java.util.ArrayList<Object> java.util.ArrayList [“ny”,1,true]


五、总结

泛化调用可以方便用户对dubbo服务消费者端的扩展,可以方便,丰富了服务消费者的调用方式,甚至可以做变相的Rest调用、跨语言、跨协议,这些都是可以的。不过,它的缺点也是很明显的,参数传递复杂,不方便使用。但是这种方式是不能缺失的。

1、网军编程学院为非营利性网站,全站所有资料仅供网友个人学习使用,禁止商用。
2、本站所有文档、视频、书籍等资料均由网友分享,本站只负责收集不承担任何技术及版权问题。
3、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意。
4、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责。
5、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户。
6、其他单位或个人使用、转载或引用本文时必须同时征得该帖子作者和网军编程学院的同意。
7、网军编程学院管理员和版主有权不事先通知发贴者而删除本文。

发表评论

发表评论

电子邮件地址不会被公开。