背景:在開發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的序列化和反序列化
里面關於泛型化調用的例子比較詳細,概念也比較清晰,可以參考