(转)dubbo泛型化调用原理
背景:在开发mapi的过程中,自以为很了解其中的原理。实际上并不了解,主要是使用了dubbo中的泛型化调用的思想;
原理总结
ps:主要原理讲解,参考原文
什么是泛化调用?
泛接口调用方式主要用于客户端没有API接口及模型类元的情况,参数及返回值中的所有POJO均用Map表示,通常用于框架集成,比如:实现一个通用的服务测试框架,可通过GenericService调用所有服务实现。
ps. GenericService
实际上是Dubbo
提供的通用接口,解决使用通用接口调用任何服务方法
好处:最最直接的表现就是服务消费者不需要有任何接口的实现,就能完成服务的调用。
dubbo泛型化实现的流程:
+-------------------------------------------+ +-------------------------------------------+ | consumer 端 | | provider 端 | | | | | | | | | | | | | | | | | | +------------------+ | | +--------------+ | | |GenericImplFilter | | Invocation | |GenericFilter | | | +----> | +-------------------------> | | | | | +------------------+ | | +--------------+ | | +-----------+ | | | +-----------+ | | | | | | | | | | | |Client | | | +--> | Service | | | | | | | | | | | +-----------+ | | +-------+---+ | | | | | | | ^ +------------------+ | | +--------------+ | | | | |GenericImplFilter | | | |GenericFilter | <----------+ | | +-------------+ | <-------------------------+ | | | +------------------+ | | +--------------+ | | | | | | | | | | | | | | | | | +-------------------------------------------+ +-------------------------------------------+
GenericFilter: 负责provider端参数的转换.
1、调用时,将hashmap结构的参数转换成对应的pojo
2、返回结果时, 将pojo转换成hashmap
// 调用时 args = PojoUtils.realize(args, params, method.getGenericParameterTypes() // 返回结果时 return new RpcResult(PojoUtils.generalize(result.getValue()));
GenericImplFilter: 负责consumer端参数的转换, 将POJO转换成hashmap结构
Object[] args = PojoUtils.generalize(arguments);
这样consumer端传过来的只是一个map, 并不要有provider端的jar包, 根据这个就可以实现dubbo接口的测试平台.
核心方法:GenericService
这个接口和java的反射调用非常像, 只需提供调用的方法名称, 参数的类型以及参数的值就可以直接调用对应方法了.
package com.alibaba.dubbo.rpc.service; /** * 通用服务接口 * * @author william.liangf * @export */ public interface GenericService { /** * 泛化调用 * * @param method 方法名,如:findPerson,如果有重载方法,需带上参数列表,如:findPerson(java.lang.String) * @param parameterTypes 参数类型 * @param args 参数列表 * @return 返回值 * @throws Throwable 方法抛出的异常 */ Object $invoke(String method, String[] parameterTypes, Object[] args) throws GenericException; }
PojoUtils 提供了对象和map的序列化和反序列化
里面关于泛型化调用的例子比较详细,概念也比较清晰,可以参考
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,让更多的人能够享受到获取知识的快乐!因为本人初入职场,鉴于自身阅历有限,所以本博客内容大部分来源于网络中已有知识的汇总,欢迎各位转载,评论,大家一起学习进步!如有侵权,请及时和我联系,切实维护您的权益!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程