微服务feign调用的实例

微服务调用实例:

两个服务,一个商品服务(Product) 一个库存服务(Ware)

场景:商品服务查询库存服务使用有库存。

1.库存服务(ware)做好支持查询业务
    /**
     * 查询是否有库存
     * @param skuIds
     * @return
     */
    @PostMapping("/hasstock")
    public R getSkusHasStock(@RequestBody List<Long> skuIds){
     
        //sku_id stock
        List<SkuHasStockVo> vos = wareSkuService.getSkusHasStock(skuIds);
        return R.ok().put("data",vos);
    }
2.商品服务pom导入openfeign
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-openfeignartifactId>
        dependency>
3.建立专属feign远程业务的包(文件夹)
位置:个人习惯 这里与controller目录平级
config
controller
dao
entity
exception
roductApplication
service
vo
增加一个  --> feign 包
4.写远程调用接口

1.建立类文件 WareFeignService

2.接口注解FeignClient客户端 调用远程服务的服务名

@FeignClient("ware")
public interface WareFeignService {
     
}

3.在feign类方法编写远程接口方法。 直接去被调用方法复制签名

 @PostMapping("/hasstock")
 R getSkusHasStock(@RequestBody List<Long> skuIds)

4.把这个方法,补齐被调用方法的访问路径

 @PostMapping("/ware服务路径/远程getSkusHasStock所在控制器路径/hasstock")
 R getSkusHasStock(@RequestBody List<Long> skuIds)

5.在product的需要远程调用库存的地方 引入这个远程调用接口 当作service试用

@Autowired
WareFeignService wareFeignService;
...
如:
skusHasStock = wareFeignService.getSkusHasStock(skuIdList);

至此,调用完成。

小笔记本解释一段stream()代码:

解释1List<SkuHasStockTo> listSku 
 
Map<key, value> map =listSku.stream().collect(Collectors.toMap(SkuHasStockTo::getSkuId, item -> item.getHasStock()));

//遍历listSku  把它的每一个对象(SkuHasStockTo)的 getSkuId 作为键 SkuHasStockTo的每一个hasStock属性作为值,做成map键值对


解释2List<SkuInfoEntity> skus
    
 List<Long> skuIdList = skus.stream().map(SkuInfoEntity::getSkuId).collect(Collectors.toList());

//遍历 skus的每一个对象(SkuInfoEntity) 取出它的skuId 生成一个新的skuId的List

解释3List<ProductAttrValueEntity> baseAttrs 
    
 List<Long> attrIds = baseAttrs.stream().map(attr -> {
      
    return attr.getAttrId();
 }).collect(Collectors.toList());

//遍历 baseAttrs的每一个对象(ProductAttrValueEntity) AttrId 生成一个新的skuId的List

解释4public static class Attrs{
     
   private Long  attrId;
   private String attrName;
   private String attrValue;
 }   
    
 Set<Long> idSet
 List<ProductAttrValueEntity> baseAttrs   
    
 List<Attrs> attrList = baseAttrs.stream().filter(item -> {
     
    return idSet.contains(item.getAttrId());
 }).map(item -> {
     
    Attrs attrs1 = new SkuEsModel.Attrs();
    BeanUtils.copyProperties(item, attrs1);
    return attrs1;
 }).collect(Collectors.toList());   

//遍历 baseAttrs的每一个对象(ProductAttrValueEntity) 
//filter 过滤筛选出集合idSet 包含 ProductAttrValueEntity属性值attrId的
//把过滤后的ProductAttrValueEntity 按照 Attrs的属性 生成  List



你可能感兴趣的:(java养成系列,DevOps养成,微服务,java,spring,cloud)