本文主要是介绍Openfeign远程调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在实际开发中,Openfeign远程调用要避免在循环中使用,这个是比较耗时的。如使用不当可能会把远程服务压垮。正确的用法是在循环外一次查询获得条件的Map集合,然后在循环里边通过给map传入key,从而获得map对应的值,从而避免在循环体多次使用openfeign。下面是示意代码:
//1.构造查询条件
List<Long> skuIds = skus.stream().map(SkuInfoEntity::getSkuId).collect(Collectors.toList());
//2.发送远程服务调用库存服务查询库存数据
R<List<SkuHasStockVo>> skuHasStock = wareFeignService.getSkuHasStock(skuIds);
List<SkuHasStockVo> data = skuHasStock.getData();
//3.获得符合条件的map对象
Map<Long, Boolean> stockMap = data.stream().collect(Collectors.toMap(SkuHasStockVo::getSkuId, item -> item.getHasStock()));
List<SkuEsModel> skuEsModels = skus.stream().map(sku -> {
SkuEsModel skuEsModel = new SkuEsModel();
//在循环体内给map传入key,从而获得对应的值
skuEsModel.setHasstock(stockMap.get(sku.getSkuId()));
}
由于远程调用服务存在不稳定性,为了防止出现异常时,业务继续执行下去而不会因此中断,最好在远程服务调用时捕捉异常,这样,即使出现异常,程序也会继续往下执行,改进版如下:
Map<Long, Boolean> stockMap = null; try {R<List<SkuHasStockVo>> skuHasStock = wareFeignService.getSkuHasStock(skuIds);List<SkuHasStockVo> data = skuHasStock.getData();stockMap = data.stream().collect(Collectors.toMap(SkuHasStockVo::getSkuId, item -> item.getHasStock())); } catch (Exception e) {log.error("远程调用库存服务出现异常:{}",e); } //这里需要设置一个中间变量来接收 Map<Long, Boolean> finalStockMap = stockMap; List<SkuEsModel> skuEsModels = skus.stream().map(sku -> {SkuEsModel skuEsModel = new SkuEsModel();//如果远程调用失败返回为空,则赋一个默认值,反之则赋从远程服务获得的值skuEsModel.setHasstock(finalStockMap==null?true:finalStockMap.get(sku.getSkuId())); }
这篇关于Openfeign远程调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!