接口測試-dubbo泛化調用

一、爲什麼要用dubbo泛化調用

泛化接口調用方式主要用於客戶端沒有 API 接口及模型類元的情況,參數及返回值中的所有 POJO 均用 Map 表示,通常用於框架集成,比如:實現一個通用的服務測試框架,可通過 GenericService 調用所有服務實現。

二、查找dubbo地址和端口

進行dubbo接口測試之前首先需要知道dubbo接口的端口號,如果provider註冊時已經指定了dubbo端口,直接使用就可以,如果沒有指定就需要連接註冊中心查看對應的端口,以下是在zookeeper查看dubbo端口的方法:

  • 連接zk查看
    # 切換到zookeeper的bin目錄下
    ./zkCli.sh -server zk服務地址:zk服務端口
    ls /dubbo_group/com.xxx.xxx.xxxService/providers
    
  • 解碼zk結果
    zk查看結果是經過編碼的URL,所以通過URL解碼的方式解碼就可以,貼一個我自己使用的解碼網址:在線解碼
三、使用telnet命令進行接口調試

從 2.0.5 版本開始,dubbo 開始支持通過 telnet 命令來進行服務治理。

  • 使用telnet命令連接dubbo
    telnet dubbo_provider_ip dubbo_port
    
  • telnet常用命令
    # 顯示服務列表
    ls
    # 顯示服務詳細信息列表
    ls -l
    # 顯示服務的方法列表
    ls xxxService
    # 顯示服務的方法詳細信息列表
    ls -l xxxService
    # 調用服務的方法
    invoke xxxService.method
    # 調用服務的方法(自動查找包含此方法的服務)
    invoke method
    
四、泛化調用核心代碼
public Object dubboGeneric(DubboDto dto){
        logger.info(">>>>>調用dubbo服務接口,入參:{}", dto);
        // 引用遠程服務
        // 該實例很重量,裏面封裝了所有與註冊中心及服務提供方連接,請緩存
        ReferenceConfig<GenericService> reference = new ReferenceConfig<>();
        // 弱類型接口名
        reference.setInterface(dto.getInterfaceName());
        // 聲明爲泛化接口
        reference.setGeneric(true);
        reference.setApplication(new ApplicationConfig(dto.getApplication()));
        reference.setVersion(dto.getVersion());
        reference.setTimeout(dto.getTimeout());
        reference.setUrl(dto.getUrl());
        // 獲取緩存中的實例
        ReferenceConfigCache cache = ReferenceConfigCache.getCache();
        GenericService genericService = cache.get(reference);
        // 用org.apache.dubbo.rpc.service.GenericService可以替代所有接口引用
        // 基本類型以及Date,List,Map等不需要轉換,直接調用
        // 調用實例
        Object result = genericService.$invoke(dto.getMethod(), dto.getParameterTypes(), dto.getArgs());
        logger.info(">>>>>調用dubbo服務接口,出參:{}", result);
        return result;
    }

歡迎大家一起交流,完整代碼傳送門:dubbo泛化調用完整代碼

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