手動調用指定Dubbo接口(三)----GenericService篇

我寫了個方法,可以給方法傳遞指定的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的GenericService簡介和基本使用

 

本文結束

 

三篇手動調用指定Dubbo接口的文章:

手動調用指定Dubbo接口(一)----Spring注入篇

手動調用指定Dubbo接口(二)----Reference篇

手動調用指定Dubbo接口(三)----GenericService篇

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章