dubbo泛化調用

一.前言

  傳統的dubbo服務面向接口編程,若是須要調用其餘服務則須要引入該服務對應的接口!可是有時候在遇到語言調用的時候,好比一個PHP工程師調用dubbo服務時因爲dubbo自身並不是跨平臺,所以只能對外提供一個controller而後引入對應的dubbo服務!
那麼泛化調用的出現完美的解決了這個問題,調用方並不須要引入服務接口也能夠完成調用!只須要對外暴露一個統一的接口,便可完成不一樣dubbo服務間的調用,實現了以前的跨平臺需求!

二.使用

本示例基於API方式進行泛化調用java

@RestController
public class DemoConsumerController {
    
    private static Logger logger = LoggerFactory.getLogger(DemoConsumerController.class);

    @RequestMapping(value="/call",method=RequestMethod.POST)
    public Object get(@RequestBody DubboDTO dto) {

        // 建立服務實例
        ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();
        reference.setGeneric(true);
        reference.setInterface(dto.getInterfaceName());
        reference.setVersion(dto.getVersion());
        
        // 獲取緩存中的實例
        ReferenceConfigCache cache = ReferenceConfigCache.getCache(); 
        GenericService genericService = cache.get(reference);
        
        // 調用實例
        Object result = genericService.$invoke(dto.getMethod(), dto.getParameterTypes(),dto.getArgs());
        logger.info(">>>>>調用dubbo服務接口,入參:{},出參:{}",dto.toString(),result);
        return result;
    }
}

三.注意點

ReferenceConfig是一個特別重的實例,它裏面封裝了全部與註冊中心及服務提供方鏈接,因此在使用的時候要注意緩存.若是直接使用 reference.get()方法而不是從 ReferenceConfigCache.getCache()獲取,那麼在dubbo管控臺會看到每一次調用都會生成一個服務消費者實例.而堆內存也隨着請求的不斷增長而變大
管控臺
堆內存

GitHub完整代碼,點我git

相關文章
相關標籤/搜索