傳統的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