我寫了個方法,可以給方法傳遞指定的Dubbo接口名,方法名,參數值,方法來調用我們指定的Dubbo接口,並返回結果。
這次用的是Dubbo的GenericService。
示例代碼:
@Controller
@RequestMapping("/test")
public class TestController {
/**
* @param interfaceName Dubbo接口名
* @param methodName 方法名
* @param parameter 參數值
* @return
*/
@RequestMapping(value = "/test2", method = RequestMethod.POST)
@ResponseBody
public static Object test2(@RequestParam(value = "interfaceName") String interfaceName,
@RequestParam(value = "methodName") String methodName,
@RequestParam(value = "parameter") String parameter) {
ApplicationConfig application = new ApplicationConfig("test-consumer"); //參數爲dubbo消費方的名稱
RegistryConfig registryConfig=new RegistryConfig();
registryConfig.setAddress("zookeeper://127.0.0.1:2181");
application.setRegistry(registryConfig);
ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
reference.setApplication(application);
reference.setInterface(interfaceName);
// reference.setGroup("my-group");
// reference.setVersion("1.0.0");
reference.setTimeout(3000);
reference.setGeneric(true);
GenericService genericService = reference.get();
Object object = genericService.$invoke(methodName, new String[]{"java.lang.String"}, new Object[]{parameter}); //調用泛化接口,返回單一元素
//列表查詢測試
Query query = new Query();
query.setOrderStatus(1);
Object object2 = genericService.$invoke("selectList", new String[]{"com.test.Query"}, new Object[]{query}); //調用泛化接口,返回列表
System.out.println(object2);
return object;
}
public static void main(String[] args) {
test2("com.test.OrderService","selectOne","ABC123");
}
}
注:
1,registryConfig.setAddress()方法填寫的zookeeper的地址。
2,調用泛化接口時,reference.setGeneric(true)是必要的。
GenericService簡介
GenericService是Dubbo提供的泛化接口。
當服務提供者使用這個接口時,可以省略Interface的代碼,省略方法和參數的聲明,通過指定接口名稱的方式接入zookeeper。這時GenericService變成了一個網關。
當服務消費者使用這個接口時,有個好處是不依賴服務提供者的Interface接口類,而是通過指定具體接口類地址的方式,創建消費者,並去zookeeper查找對應的提供者,然後發起調用。
GenericService接口只有一個方法:
Object $invoke(String var1, String[] var2, Object[] var3) throws GenericException;
其中第一個參數是方法名。
第二個參數是一個字符串數組,這是接口方法每個參數的類型全路徑。
第三個參數是Object數組,是傳給方法的具體參數列表。
$invoke()方法的返回值:當返回的是單個非簡單元素時,返回值類型實際上是HashMap,當返回的是列表時,返回值類型實際上是ArrayList<HashMap>。
詳細一點的介紹參見:
本文結束
三篇手動調用指定Dubbo接口的文章: