Sentinel+openFeign实现“调度服务的限流熔断”(简约版)

Sentinel+openFeign实现“调度服务的限流熔断”(简约版)

首先假设一个场景:有一个使用SpringCloudAlibaba框架构建的订购系统,其中订单服务(order)调度库存服务(inventory)。且订单服务库存服务均已注册进nacossentinel

库存服务

接口(忽略具体CRUD操作)

@Autowired
ReduceServer reduceServer;

@GetMapping(path = {"/reduce"})
@SentinelResource(value = "reduce")//库存服务压力不能过大,必须限流
public Map reduce(@RequestParam(value="quantity") int quantity){
    Map result = new HashMap<String,Object>();
    // 调用server中减少库存的方法
    result = reduceServer.reduce(result,quantity);//请忽略这一行代码,他是调用的CRUD操作,和本文记述无太大关系
    return result;
}

订单服务

调度库存服务接口(忽略具体CRUD操作)

@Component
@FeignClient(value = "inventory-server",fallback = InventoryOpenFeignFallback.class)
public interface InventoryOpenFeign {
    @GetMapping(path = {"/reduce"})
    public Map reduce(@RequestParam("quantity") int quantity);
}

调度库存服务的熔断方法(兜底方法)

public class InventoryOpenFeignFallback implements InventoryOpenFeign{
    @Override
    public Map reduce(int quantity) {
        Map result = new HashMap();
        ... // 忽略中间的CRUD等业务代码,包括回滚,报错等
        result.put("message","quantity-server ERROR");
        return result;
    }
}

⚠️ 注意

  1. 限流不能在订单服务中布置,必须在被调用的端口处布置,如上述的库存服务
  2. @FeignClient 注解必须和 @Component 搭配使用
  3. 订单服务的”调度库存服务接口“中定义的方法在方法名,参数名,参数个数,参数顺序,返回值类型这5点上必须和库存服务的接口一致
posted @ 2024-02-17 21:53  勤匠  阅读(66)  评论(0)    收藏  举报