泛化调用实战,Dubbo入门你必须学会的技能
本文大纲
- 简述
- 为什么需要泛化
- 泛化实现
- 参数对照表
- 总结
一、简述
阅读过上一篇《Dubbo一直都很好用的功能,你或许蒙在鼓里》,有经验的同学早已驾轻就熟,但对于刚涉入Dubbo的同学而言或许苦不堪言。然而,Dubbo泛化调用在实际应用场景中有举无轻重的作用。所以,觉着将泛化这个知识点切碎嚼烂是一件非常有意义的事儿。便有了这一篇关于Dubbo泛化的实战。
二、为什么需要泛化
就Dubbo框架而言,服务提供者需要暴露出接口和方法,服务消费者需要明确知道服务暴露的接口、方法、参数、返回值,然后两者之间才能通信。
而在实际开发过程中,存在以下几种情况:
//接口类
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调用、跨语言、跨协议,这些都是可以的。不过,它的缺点也是很明显的,参数传递复杂,不方便使用。但是这种方式是不能缺失的。
2、如本帖侵犯到任何版权问题,请立即告知本站,本站将及时予与删除下载链接并致以最深的歉意。
3、本帖部分内容转载自其它媒体,但并不代表本站赞同其观点和对其真实性负责。
4、一经注册为本站会员,一律视为同意网站规定,本站管理员及版主有权禁止违规用户。
5、蚂蚁编程管理员有权不事先通知发贴者而删除本文。
蚂蚁编程学院 » 泛化调用实战,Dubbo入门你必须学会的技能