Sentinel自定义受保护的资源

该博客介绍了如何使用 Sentinel 在 Java 代码中进行流量控制。首先展示了通过代码形式检查秒杀场次并从 Redis 获取商品信息,同时处理限流异常。然后,介绍了使用 Sentinel 注解方式定义资源并配置限流后的处理函数 blockHandler,当资源被限流时会触发自定义的异常处理。两种方式都确保了在被限流后有默认的返回处理。
摘要由CSDN通过智能技术生成

1、代码形式

 try (Entry entry = SphU.entry("zyy")) {
    for (String key : keys) {
        //seckill:sessions:1594396764000_1594453242000
        String replace = key.replace(SESSION_CACHE_PREFIX, "");
        String[] s = replace.split("_");
        //获取存入Redis商品的开始时间
        long startTime = Long.parseLong(s[0]);
        //获取存入Redis商品的结束时间
        long endTime = Long.parseLong(s[1]);

        //判断是否是当前秒杀场次
        if (currentTime >= startTime && currentTime <= endTime) {
            //2、获取这个秒杀场次需要的所有商品信息
            List<String> range = redisTemplate.opsForList().range(key, -100, 100);
            BoundHashOperations<String, String, String> hasOps = redisTemplate.boundHashOps(SECKILL_CHARE_PREFIX);
            List<String> listValue = hasOps.multiGet(range);
            if (listValue != null && listValue.size() >= 0) {

                List<SeckillSkuRedisTo> collect = listValue.stream().map(item -> {
                    SeckillSkuRedisTo redisTo = JSON.parseObject((String) item, SeckillSkuRedisTo.class);
                    // redisTo.setRandomCode(null);当前秒杀开始需要随机码
                    return redisTo;
                }).collect(Collectors.toList());
                return collect;
            }
            break;
        }
    }
} catch (BlockException e) {
    log.error("资源被限流,{}", e.getMessage());
}

2、注解方式

public List<SeckillSkuRedisTo> blockHandler(BlockException ex){
	log.error("blockHandler");
    return null;
}

@SentinelResource(value = "getCurrentSeckillSkusResource", blockHandler = "blockHandler")
@Override
public List<SeckillSkuRedisTo> getCurrentSeckillSkus() {
...
}

PS:两种方式都需要配置被限流之后的默认返回。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值