如何通过API方式使用dubbo泛化调用

这篇文章主要介绍“如何通过API方式使用dubbo泛化调用”,在日常操作中,相信很多人在如何通过API方式使用dubbo泛化调用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何通过API方式使用dubbo泛化调用”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

    泛化是啥?

    官网解释:泛化接口调用方式主要用于客户端没有 API 接口及模型类元的情况,参数及返回值中的所有 POJO 均用 Map 表示,通常用于框架集成,比如:实现一个通用的服务测试框架,可通过 GenericService 调用所有服务实现。

我跑去问组长,他们那天说的泛化是啥?我们什么场景要用啊?

泛化就是你不知道你不关心下层实现,只需要约定接口及参数,实现由下层实现,但是这样一来扩展性和可用性极低,不如你约定一个接口,提供方注册到ZK上,消费方去ZK去拉,或者干脆提供个jar包,然后通过普通的注册去调用就可以。

至于场景是因为临时接入的第三方数据服务,不能直接调用,我们中间提供了接口,实现是他们实现的。

通过 Spring 使用泛化调用

在 Spring 配置申明 generic="true"

<dubbo:reference id="barService" interface="com.foo.BarService" generic="true" />

在 Java 代码获取 barService 并开始泛化调用:

GenericService barService = (GenericService) applicationContext.getBean("barService");
Object result = barService.$invoke("sayHello", new String[] { "java.lang.String" }, new Object[]

通过 API 方式使用泛化调用

import org.apache.dubbo.rpc.service.GenericService;
...

// 引用远程服务
// 该实例很重量,里面封装了所有与注册中心及服务提供方连接,请缓存
ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
// 弱类型接口名
reference.setInterface("com.xxx.XxxService");
reference.setVersion("1.0.0");
// 声明为泛化接口
reference.setGeneric(true);

// 用org.apache.dubbo.rpc.service.GenericService可以替代所有接口引用
GenericService genericService = reference.get();

// 基本类型以及Date,List,Map等不需要转换,直接调用
Object result = genericService.$invoke("sayHello", new String[] {"java.lang.String"}, new Object[] {"world"});

// 用Map表示POJO参数,如果返回值为POJO也将自动转成Map
Map<String, Object> person = new HashMap<String, Object>();
person.put("name", "xxx");
person.put("password", "yyy");
// 如果返回POJO将自动转成Map
Object result = genericService.$invoke("findPerson", new String[]
{"com.xxx.Person"}, new Object[]{person});

...

泛化的实现

通过 API 方式暴露泛化实现

...
// 用org.apache.dubbo.rpc.service.GenericService可以替代所有接口实现
GenericService xxxService = new XxxGenericService();

// 该实例很重量,里面封装了所有与注册中心及服务提供方连接,请缓存
ServiceConfig<GenericService> service = new ServiceConfig<GenericService>();
// 弱类型接口名
service.setInterface("com.xxx.XxxService");
service.setVersion("1.0.0");
// 指向一个通用服务实现
service.setRef(xxxService);

// 暴露及注册服务
service.export();

注册到ZK实现

public static void main(String[] args) {        ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();        // 当前dubbo consumer的application配置,不设置会直接抛异常        ApplicationConfig applicationConfig = new ApplicationConfig();        applicationConfig.setName("xxx_test_service");        // 注册中心配置        RegistryConfig registryConfig = new RegistryConfig();        // 注册中心这里需要配置上注册中心协议,例如下面的zookeeper        registryConfig.setAddress("zookeeper://127.0.0.1:2181");        registryConfig.setGroup("test_group");        reference.setApplication(applicationConfig);        reference.setRegistry(registryConfig);        // 设置调用的reference属性,下面只设置了协议、接口名、版本、超时时间        reference.setProtocol("dubbo");        //约定接口        reference.setInterface("com.xxx.test.TestService");        reference.setVersion("1.0.0");        reference.setTimeout(1000);        // 声明为泛化接口        reference.setGeneric(true);        // GenericService可以接住所有的实现        GenericService genericService = reference.get();        // 构造复杂参数,下面的示例中,头两个参数为string类型,后一个是一个复杂类型,但都可以通过map构造。        Map<String, Object> param = new HashMap<>();        param.put("test1", "a");        param.put("test2", "b");        Map<String,Object> thirdParam = new HashMap<>();        thirdParam.put("class","java.util.Map");        thirdParam.put("subParam1","c");        thirdParam.put("subParam2","d");        param.put("test3",thirdParam);        Object result = genericService.$invoke("myMethod", new String[]{"java.lang.String", "java.lang.String", "com.xxxtest.MyParam"}, new Object[]{"123", "ddd",param});        System.out.println(JSON.toJSONString(result));    }

到此,关于“如何通过API方式使用dubbo泛化调用”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注蜗牛博客网站,小编会继续努力为大家带来更多实用的文章!

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:niceseo99@gmail.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

评论

有免费节点资源,我们会通知你!加入纸飞机订阅群

×
天气预报查看日历分享网页手机扫码留言评论Telegram