ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

(转)dubbo泛化调用原理

2021-04-08 11:02:18  阅读:10  来源: 互联网

标签:dubbo 调用 泛化 args PojoUtils 参数


背景:在开发mapi的过程中,自以为很了解其中的原理。实际上并不了解,主要是使用了dubbo中的泛型化调用的思想;

 原理总结

dubbo泛化调用原理

ps:主要原理讲解,参考原文

什么是泛化调用?

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

使用泛化调用时,服务消费端不再需要依赖于二方的SDK。

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的序列化和反序列化

 

Dubbo泛化调用入门到精通

里面关于泛型化调用的例子比较详细,概念也比较清晰,可以参考

标签:dubbo,调用,泛化,args,PojoUtils,参数
来源: https://www.cnblogs.com/lixuwu/p/14631231.html

专注分享技术,共同学习,共同进步。侵权联系[admin#icode9.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有