美文网首页
3.泛化调用

3.泛化调用

作者: 山海树 | 来源:发表于2020-09-04 09:10 被阅读0次

通常是服务调用方没有引入API包,也就不包含接口中的实体类,故服务调用方只能提供Map形式的数据,由服务提供者根据Map转化成对应的实体。

1.generic=true
只需要将参数列表Object[]反序列化为pojo即可,具体的反序列化为PojoUtils#realize

ReferenceConfig<GenericService> referenceConfig = new ReferenceConfig<>();
        referenceConfig.setApplication(new ApplicationConfig("true-generic-consumer"));
        referenceConfig.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
        referenceConfig.setVersion("1.0.0");
        referenceConfig.setGroup("dubbo");
        referenceConfig.setInterface("service.GreetingService");
        referenceConfig.setTimeout(5000);
        //泛化引用,类型为true
        referenceConfig.setGeneric(true);
        GenericService genericService = referenceConfig.get();
        //泛型调用,基本类型以及Date、List、Map等不需要转换,直接调用,如果返回值是POJO,也净自动转为Map
        Object result = genericService.$invoke("sayHello", new String[] {"java.lang.String"}, new Object[] {"world"});
        System.out.println(JSON.json(result));
        //POJO参数转换为MAP
        Map<String, Object> map = new HashMap<>();
        map.put("class","entity.Pojo");
        map.put("id","1990");
        map.put("name","linjunjie");
        result = genericService.$invoke("testGeneric",new String[]{"entity.Pojo"},new Object[]{map});
        System.out.println(result);

2.generic=bean
使用javabean序列化参数,在服务端这边通过javabean反序列化参数成pojo对象

 ReferenceConfig<GenericService> referenceConfig = new ReferenceConfig<>();
        referenceConfig.setApplication(new ApplicationConfig("true-generic-consumer"));
        referenceConfig.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
        referenceConfig.setVersion("1.0.0");
        referenceConfig.setGroup("dubbo");
        referenceConfig.setInterface("service.GreetingService");
        referenceConfig.setTimeout(5000);
        //泛化引用,类型为true
        referenceConfig.setGeneric("bean");

        GenericService genericService = referenceConfig.get();

        //泛型调用,参数使用JavaBean进行序列化
        JavaBeanDescriptor param = JavaBeanSerializeUtil.serialize("world");
        Object result = genericService.$invoke("sayHello", new String[] {"java.lang.String"}, new Object[] {param});
        result = JavaBeanSerializeUtil.deserialize((JavaBeanDescriptor) result);
        System.out.println(result);
/*
        //POJO参数转换为MAP
        Map<String, Object> map = new HashMap<>();
        map.put("class","entity.Pojo");
        map.put("id","1990");
        map.put("name","linjunjie");
        param = JavaBeanSerializeUtil.serialize(map);
        result = genericService.$invoke("testGeneric",new String[]{"entity.Pojo"},new Object[]{param});
        result = JavaBeanSerializeUtil.deserialize((JavaBeanDescriptor) result);
        System.out.println(result);*/

3.generic=nativejava
使用nativejava序列化参数,在服务端这边通过nativejava反序列化参数成pojo对象

 ReferenceConfig<GenericService> referenceConfig = new ReferenceConfig<>();
        referenceConfig.setApplication(new ApplicationConfig("true-generic-consumer"));
        referenceConfig.setRegistry(new RegistryConfig("zookeeper://127.0.0.1:2181"));
        referenceConfig.setVersion("1.0.0");
        referenceConfig.setGroup("dubbo");
        referenceConfig.setInterface("service.GreetingService");
        referenceConfig.setTimeout(5000);
        //泛化引用,类型为true
        referenceConfig.setGeneric("nativejava");

        GenericService genericService = referenceConfig.get();

        //泛型调用,参数使用JavaBean进行序列化
        UnsafeByteArrayOutputStream out = new UnsafeByteArrayOutputStream();
        ExtensionLoader.getExtensionLoader(Serialization.class)
                .getExtension(Constants.GENERIC_SERIALIZATION_NATIVE_JAVA)
                .serialize(null, out)
                .writeObject("world");
        Object result = genericService.$invoke("sayHello", new String[] {"java.lang.String"}, new Object[] {out.toByteArray()});
        UnsafeByteArrayInputStream in  = new UnsafeByteArrayInputStream((byte[])result);
        System.out.println(ExtensionLoader.getExtensionLoader(Serialization.class)
        .getExtension(Constants.GENERIC_SERIALIZATION_NATIVE_JAVA)
        .deserialize(null, in)
        .readObject());
/*
        //POJO参数转换为MAP
        UnsafeByteArrayOutputStream out = new UnsafeByteArrayOutputStream();
        Pojo pojo = new Pojo();
        pojo.setId("abcdefg");
        pojo.setName("七月的风");
        ExtensionLoader.getExtensionLoader(Serialization.class)
                .getExtension(Constants.GENERIC_SERIALIZATION_NATIVE_JAVA)
                .serialize(null, out)
                .writeObject(pojo);
        Object result = genericService.$invoke("testGeneric",new String[]{"entity.Pojo"},new Object[]{out.toByteArray()});
        UnsafeByteArrayInputStream in  = new UnsafeByteArrayInputStream((byte[])result);
        System.out.println(ExtensionLoader.getExtensionLoader(Serialization.class)
                .getExtension(Constants.GENERIC_SERIALIZATION_NATIVE_JAVA)
                .deserialize(null, in)
                .readObject());*/

综述:由demo可以看出,如果没有引入第三方包的情况下,但是参数类型不是基本类型,则只能用generic=true这中方式来实现,如果参数不是基本类型,则三种都可以。

相关文章

  • 3.泛化调用

    通常是服务调用方没有引入API包,也就不包含接口中的实体类,故服务调用方只能提供Map形式的数据,由服务提供者根据...

  • 泛化调用

    什么是泛化调用 通常我们想调用别人的服务时,我们需要在项目中引入对应的jar包。而泛化调用的作用是,我们无需依赖相...

  • 24.Dubbo泛化调用实现

    泛化调用的核心实现类GenericImplFilter, 消费端:GenericImplFilter将泛化参数进行...

  • dubbo泛化调用

    为什么要使用泛化调用? 一般使用dubbo,provider端需要暴露出接口和方法,consumer端要十分明确服...

  • dubbo泛化调用

    为什么要使用泛化调用? 一般使用dubbo,provider端需要暴露出接口和方法,consumer端要十分明确服...

  • Dubbo泛化调用

    泛化调用示例: 原理:泛化调用本质是在filter过滤链上执行的序列化和反序列化操作消费者端对应的过滤器是Gene...

  • java 泛型

    1,如何实例化泛型 2,如何获取java中的泛型类型 调用(通常在构造方法中调用):

  • Dubbo-泛化调用-泛型

    背景 今天刚好有需求需要用到dubbo的泛化调用,涉及到了泛型问题:服务端无法获取泛型对象的数据,特此记录。 解决...

  • 泛型

    泛型概述 1:什么是泛型?: 泛型:“参数化类型”,可以从字面理解,参数化,在我们用参数中,定义方法用形参,调用传...

  • dubbo泛化调用指南

    在如今的各种大型分布式系统中,dubbo框架已成为一颗明星。而作为内部rpc,它无法承担对外输出的功能,此...

网友评论

      本文标题:3.泛化调用

      本文链接:https://www.haomeiwen.com/subject/rlkosktx.html