(轉)dubbo泛型化調用原理


背景:在開發mapi的過程中,自以為很了解其中的原理。實際上並不了解,主要是使用了dubbo中的泛型化調用的思想;

 原理總結

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

 

Dubbo泛化調用入門到精通

里面關於泛型化調用的例子比較詳細,概念也比較清晰,可以參考


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM