传统的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