前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >他们总说Dubbo泛化是啥啊?

他们总说Dubbo泛化是啥啊?

作者头像
疯狂的KK
发布2020-06-11 10:17:49
8010
发布2020-06-11 10:17:49
举报
文章被收录于专栏:Java项目实战Java项目实战

前几天听同事讨论问题,偶然间冒出来一句,那用Dubbo泛化解决,我就惊奇了一下,要在实际场景用到泛化了吗?我在有道云笔记的2020.3.31篇中首次记录了泛化的出现。

泛化是啥?

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

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

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

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

关键字:generic

通过 Spring 使用泛化调用

在 Spring 配置申明 generic="true"

代码语言:javascript
复制
<dubbo:reference id="barService" interface="com.foo.BarService" generic="true" />

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

代码语言:javascript
复制
GenericService barService = (GenericService) applicationContext.getBean("barService");
Object result = barService.$invoke("sayHello", new String[] { "java.lang.String" }, new Object[]

通过 API 方式使用泛化调用

代码语言:javascript
复制
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 方式暴露泛化实现

代码语言:javascript
复制
...
// 用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实现

代码语言:javascript
复制
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));
    }

仅是了解到泛化的基础概念,适用场景不多,结合官网及资料,需要实际项目了解下实际实现。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 赵KK日常技术记录 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 通过 Spring 使用泛化调用
  • 通过 API 方式使用泛化调用
  • 通过 API 方式暴露泛化实现
相关产品与服务
微服务引擎 TSE
微服务引擎(Tencent Cloud Service Engine)提供开箱即用的云上全场景微服务解决方案。支持开源增强的云原生注册配置中心(Zookeeper、Nacos 和 Apollo),北极星网格(腾讯自研并开源的 PolarisMesh)、云原生 API 网关(Kong)以及微服务应用托管的弹性微服务平台。微服务引擎完全兼容开源版本的使用方式,在功能、可用性和可运维性等多个方面进行增强。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档