关于泛化,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调用中,服务提供者定义了一组固定的接口和方法,消费者通过这些接口进行调用。然而,泛化调用允许消费者传递任意的...
在IT行业中,动态编程是一种非常重要的能力,尤其是在大型企业级应用和微服务架构中。...在实际项目中,我们可以利用这种技术实现动态配置、自动化测试、数据处理等场景,充分发挥Groovy和Dubbo的优势。
"从零开始手写 Dubbo RPC 框架-泛化调用" Dubbo 是一个基于 Java 实现的 RPC 框架,主要用于个人学习和理解 RPC 的底层实现原理。在这个文件中,我们将深入探讨 Dubbo 的泛化调用机制。 泛化调用 泛化调用是一种...
- 泛化引用、泛化实现:允许不同服务之间的通用通信,增加了 Dubbo 的互操作性。 - 异步调用、本地存根、本地伪装:提供了异步处理能力和本地代理,以提升性能和用户体验。 - 并发控制、连接控制:为服务调用提供了...
- **集群容错**:提供了多种容错策略,如Failover、Failfast等,以处理服务调用中的异常情况。 - **负载均衡**:介绍了Dubbo支持的几种负载均衡算法,如RoundRobin、Random等。 - **线程模型**:如何配置线程池模型...
这些示例可以帮助开发者快速上手,通过实践来掌握如何配置、启动和调用Dubbo服务,以及如何实现服务的注册与发现、负载均衡、容错处理等关键特性。 【标签】"dubbo" 明确了这个资源的主题,Dubbo是一个广泛应用于...
### Dubbo概述与核心特性 #### 一、Dubbo简介 Dubbo是一个分布式服务框架,旨在提供高性能且透明化的远程过程调用(RPC)服务,是阿里巴巴SOA服务化治理方案的核心框架。它每天能够为超过2000个服务提供超过30亿次...
在实践中,它可能包含服务引用的配置、服务调用的方法以及如何处理调用结果。这里,你可以学习到如何配置远程调用的参数,如超时时间、重试次数等,并理解如何通过Dubbo的API来消费服务。 通过分析这两个部分,你...
- **服务调用**:学习 Consumer 如何通过 Dubbo 进行远程调用(RPC),包括异步调用、泛化调用等方式。 - **服务监控**:查看如何开启服务的监控,如统计调用次数、耗时等,以便于系统性能的监控和优化。 通过这个 ...
- **泛化引用与泛化实现**:在服务消费者和提供者之间可以不共享接口,实现完全的泛化调用。 - **回声测试(Echo)**:用于检测服务提供者是否存活。 - **上下文信息传递**:在Dubbo调用链中,可以传递一些上下文...
4. **泛化调用 - 救急方案**:在无法获取接口类的情况下,Dubbo 提供了泛化调用,允许通过 JSON 字符串直接调用服务,提供了一种灵活的应急解决方案。 接着,我们深入了解了 Dubbo 的初始化过程: 1. **...
在Dubbo的架构中,SpringMVC可以作为服务消费者,调用Dubbo服务提供者提供的接口,处理HTTP请求,实现业务逻辑。 接下来,我们将详细讨论如何整合这三个组件: 1. **配置服务提供者**:首先,在服务提供者项目中...
5. **服务调用模型**:探讨Dubbo的服务调用模型,包括同步调用、异步调用、回调和泛化调用,以及如何通过配置调整调用行为。 6. **服务治理**:讲解服务的元数据管理,如服务版本、分组、接口和方法的定义,以及...
13. **Dubbo如何处理服务的超时和重试?** 可以设置服务调用的超时时间和重试次数,超时后会自动触发重试机制。 14. **Dubbo如何实现服务的版本管理?** 通过服务接口或实现类的版本注解,可以区分不同版本的服务...
3. 权限认证分散处理,状态码不统一,管理困难。 4. 限流和熔断策略各自独立,不易于整体优化。 5. 开发效率低,日志分散,接口文档更新不及时。 6. 缺乏统一的接口测试平台。 **技术选型与解决方案** 1. **Zuul**...
在服务化实践中,Dubbo还提供了一些扩展功能,如泛化引用、泛化实现、回声测试等,开发者可以根据实际情况选择使用。泛化引用允许开发者在不依赖于服务接口的情况下引用服务;泛化实现则是为了在某些特殊场景下,...
3. **服务调用**:学习Dubbo的RPC调用机制,包括同步调用、异步调用和泛化调用等模式。 4. **负载均衡策略**:了解Dubbo内置的多种负载均衡策略,如Random、RoundRobin等,并知道如何根据业务需求选择合适的策略。 ...
- **异常处理**:统一的异常处理机制,提升错误处理的效率和用户体验。 - **调用推荐用法**:给出推荐的服务调用方式,以达到最佳性能。 - **容量规划、基准测试工具包、性能测试报告**:为服务的性能评估提供详细的...