`
m635674608
  • 浏览: 5003725 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

dubbo泛化处理

 
阅读更多

关于泛化,dubbo文档这样描述的。

http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E6%B3%9B%E5%8C%96%E5%BC%95%E7%94%A8

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

http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E6%B3%9B%E5%8C%96%E5%AE%9E%E7%8E%B0

泛接口实现方式主要用于服务器端没有API接口及模型类元的情况,参数及返回值中的所有POJO均用Map表示,通常用于框架集成,比如:实现一个通用的远程服务Mock框架,可通过实现GenericService接口处理所有服务请求。

 

总的意思来说,某些环境(通用网关、服务端Mock),dubbo接口和类的参数、返回值的类型可能不能加载。为了这些环境也能调用/实现 dubbo服务,dubbo框架会对参数和返回值进行泛化(序列)处理,默认处理为Map表示的字符串。虽然文档没有介绍,实际上,dubbo还支持另外 两种泛化处理--nativejava(利用java原生序列化)、bean(序列化为JavaBeanDescriptor)。

 

dubbo通过filter实现泛化:

调用 <-> GenericImplFilter <->网络<->GenericFilter <-> 服务实现

GenericImplFilter和GenericFilter分别在消费者端和提供者端进行序列化的检查和处理。

 

我们的网关也是直接调用dubbo的,因为dubbo的接口类不能在网关侧加载,所以,需要泛化调用。但是,我们网关调用的dubbo服务的参数和 返回值都是通用类型,在网关侧也能加载的。并且,网关侧还需要对返回值进行进一步处理。所以,如果像默认dubbo泛化那样序列化为包含String的 Map,那我处理前还需要再反序列化,这比较麻烦(需要确保被反序列化的POJO),性能也不高。

 

要解决这种问题,可以新增一种泛化类型。

public static final String GENERIC_SERIALIZATION_NOCHANGE      = "nochange";

    public static boolean isGeneric(String generic) {
        return generic != null
            && !"".equals(generic)
            && (Constants.GENERIC_SERIALIZATION_DEFAULT.equalsIgnoreCase(generic)  /* 正常的泛化调用 */
            || Constants.GENERIC_SERIALIZATION_NATIVE_JAVA.equalsIgnoreCase(generic) /* 支持java序列化的流式泛化调用 */
            || Constants.GENERIC_SERIALIZATION_BEAN.equalsIgnoreCase(generic)
            || Constants.GENERIC_SERIALIZATION_NOCHANGE.equalsIgnoreCase(generic));
    }

 

并且,GenericFilter中发现如果是这种泛化类型,那么不对服务实现的返回值进行序列化处理。

                } else if (ProtocolUtils.isBeanGenericSerialization(generic)) {
                    return new RpcResult(JavaBeanSerializeUtil.serialize(result.getValue(), JavaBeanAccessor.METHOD));
                } else if (ProtocolUtils.isNoChangeGenericSerialization(generic)) {
                    return new RpcResult(result.getValue());

                } else {
                    return new RpcResult(PojoUtils.generalize(result.getValue()));
                }

 

这样,只要初始化时设置好泛化类型,genericService.$invoke获得的返回值就直接是服务端的值,不是Map等表示的值。

        ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
        reference.setApplication(application);
        reference.setRegistries(registries);
        reference.setInterface(serverInterface);
        reference.setGeneric(Constants.GENERIC_SERIALIZATION_NOCHANGE);

 

http://my.oschina.net/zhaojy/blog/646662?p={{page}}

分享到:
评论

相关推荐

    dubbo泛化的简单应用

    本篇文章将深入探讨“dubbo泛化的简单应用”。 首先,我们要理解什么是泛化调用。在传统的Dubbo调用中,服务提供者定义了一组固定的接口和方法,消费者通过这些接口进行调用。然而,泛化调用允许消费者传递任意的...

    从零开始手写 dubbo rpc 框架-12-generic泛化调用.docx

    "从零开始手写 Dubbo RPC 框架-泛化调用" Dubbo 是一个基于 Java 实现的 RPC 框架,主要用于个人学习和理解 RPC 的底层实现原理。在这个文件中,我们将深入探讨 Dubbo 的泛化调用机制。 泛化调用 泛化调用是一种...

    基于groovy实现 java脚本动态编译、部署、发布;可以通过脚本直接调用dubbo接口.zip

    在IT行业中,动态编程是一种非常重要的能力,尤其是在大型企业级应用和微服务架构中。...在实际项目中,我们可以利用这种技术实现动态配置、自动化测试、数据处理等场景,充分发挥Groovy和Dubbo的优势。

    dubbo-用户指南.pdf

    - 泛化引用、泛化实现:允许不同服务之间的通用通信,增加了 Dubbo 的互操作性。 - 异步调用、本地存根、本地伪装:提供了异步处理能力和本地代理,以提升性能和用户体验。 - 并发控制、连接控制:为服务调用提供了...

    dubbo中文文档说明

    - **集群容错**:提供了多种容错策略,如Failover、Failfast等,以处理服务调用中的异常情况。 - **负载均衡**:介绍了Dubbo支持的几种负载均衡算法,如RoundRobin、Random等。 - **线程模型**:如何配置线程池模型...

    dubbo samples

    这些示例可以帮助开发者快速上手,通过实践来掌握如何配置、启动和调用Dubbo服务,以及如何实现服务的注册与发现、负载均衡、容错处理等关键特性。 【标签】"dubbo" 明确了这个资源的主题,Dubbo是一个广泛应用于...

    dubbo_user_book

    ### Dubbo概述与核心特性 #### 一、Dubbo简介 Dubbo是一个分布式服务框架,旨在提供高性能且透明化的远程过程调用(RPC)服务,是阿里巴巴SOA服务化治理方案的核心框架。它每天能够为超过2000个服务提供超过30亿次...

    dubbo示例demo

    在实践中,它可能包含服务引用的配置、服务调用的方法以及如何处理调用结果。这里,你可以学习到如何配置远程调用的参数,如超时时间、重试次数等,并理解如何通过Dubbo的API来消费服务。 通过分析这两个部分,你...

    dubbo-demo

    - **服务调用**:学习 Consumer 如何通过 Dubbo 进行远程调用(RPC),包括异步调用、泛化调用等方式。 - **服务监控**:查看如何开启服务的监控,如统计调用次数、耗时等,以便于系统性能的监控和优化。 通过这个 ...

    dubbo-user-book

    - **泛化引用与泛化实现**:在服务消费者和提供者之间可以不共享接口,实现完全的泛化调用。 - **回声测试(Echo)**:用于检测服务提供者是否存活。 - **上下文信息传递**:在Dubbo调用链中,可以传递一些上下文...

    dubbo第四节1

    4. **泛化调用 - 救急方案**:在无法获取接口类的情况下,Dubbo 提供了泛化调用,允许通过 JSON 字符串直接调用服务,提供了一种灵活的应急解决方案。 接着,我们深入了解了 Dubbo 的初始化过程: 1. **...

    Dubbo+Zookeeper+SpringMVC实现分布式服务治理框架(附件含源码)

    在Dubbo的架构中,SpringMVC可以作为服务消费者,调用Dubbo服务提供者提供的接口,处理HTTP请求,实现业务逻辑。 接下来,我们将详细讨论如何整合这三个组件: 1. **配置服务提供者**:首先,在服务提供者项目中...

    dubbo源码视频教程

    5. **服务调用模型**:探讨Dubbo的服务调用模型,包括同步调用、异步调用、回调和泛化调用,以及如何通过配置调整调用行为。 6. **服务治理**:讲解服务的元数据管理,如服务版本、分组、接口和方法的定义,以及...

    史上最全40道Dubbo面试题!.zip

    13. **Dubbo如何处理服务的超时和重试?** 可以设置服务调用的超时时间和重试次数,超时后会自动触发重试机制。 14. **Dubbo如何实现服务的版本管理?** 通过服务接口或实现类的版本注解,可以区分不同版本的服务...

    2.基于Dubbo微服务框架亿级网关架构解密1

    3. 权限认证分散处理,状态码不统一,管理困难。 4. 限流和熔断策略各自独立,不易于整体优化。 5. 开发效率低,日志分散,接口文档更新不及时。 6. 缺乏统一的接口测试平台。 **技术选型与解决方案** 1. **Zuul**...

    dubbo用户指南

    在服务化实践中,Dubbo还提供了一些扩展功能,如泛化引用、泛化实现、回声测试等,开发者可以根据实际情况选择使用。泛化引用允许开发者在不依赖于服务接口的情况下引用服务;泛化实现则是为了在某些特殊场景下,...

    dubbo-demo.tar.gz

    3. **服务调用**:学习Dubbo的RPC调用机制,包括同步调用、异步调用和泛化调用等模式。 4. **负载均衡策略**:了解Dubbo内置的多种负载均衡策略,如Random、RoundRobin等,并知道如何根据业务需求选择合适的策略。 ...

    Dubbo Developer Guide.pdf

    - **异常处理**:统一的异常处理机制,提升错误处理的效率和用户体验。 - **调用推荐用法**:给出推荐的服务调用方式,以达到最佳性能。 - **容量规划、基准测试工具包、性能测试报告**:为服务的性能评估提供详细的...

Global site tag (gtag.js) - Google Analytics