秒杀服务的sentinel保护

# 秒杀服务的Sentinel保护 ## 参考文档 [参考](https://sentinelguard.io/zh-cn/docs/circuit-breaking.html) ## sentinel的持久化 ```xml <dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-datasource-nacos</artifactId> </dependency> ``` [参考博客](https://blog.csdn.net/qq_36763419/article/details/121560105) > **一开始, 我们发现没有出现持久化的流控或降级规则, 我们只需要多请求这个资源几次就会重新出现了** ## 流控规则的增加 ![image.png](https://cos.easydoc.net/13568421/files/lmunu19z.png) 1. 针对所有的秒杀来源, 都需要做限制 2. 阈值类型是QPS, 重点监测前端发送的每秒请求数, 阈值为5W 3. 流控模式采取直接, 我们不需要针对其他业务, 也没有特定的入口, 因此直接监控 4. **这里我采取的是warm-up策略, 因为我觉得一开始JVM没有执行过该代码(用解释器执行, 效率较低), 如果一开始就赋予极高的请求, 会导致服务器的级联崩溃, 因此, 我们需要逐步放开, 保证系统的稳定性** ```yaml datasource: flow: # 流控规则的数据源(这个名字随意, 因为这里就是一个数组) nacos: server-addr: localhost:8848 # nacos 地址 data-id: bitmall-seckill-flow-config group-id: DEFAULT_GROUP namespace: a4ad222b-b132-4d3e-a87d-e606bc5e1fb7 data-type: json # 数据类型 rule-type: flow # 规则类型(流控) ``` ![image.png](https://cos.easydoc.net/13568421/files/lmupc4e2.png) ## 熔断规则的增加 ### 说在前面 > 如果秒杀之前的所有判断都符合, 那么, 该用户可以秒杀, 并获取信号量, 但是, 有可能MQ微服务全部宕机, 导致没能正常发送消息, 这问题就很严重了, 这样会导致消息丢失, 而导致订单, 库存等信息都没有同步到数据库, 相当于你白花钱了 > **如果我们不熔断, 理论上是可以的, 但是feign会不断的重复, 虽然对用户没什么影响, 但是会浪费后台资源, 因此, 我们需要杜绝浪费, 直接熔断, 返回一个默认结果, 不让他尝试了, 而且熔断还能自动释放信号量(要自己写)** ### 熔断的配置 ```xml feign: sentinel: enabled: true # feign和sentinel整合 ``` ```java @FeignClient(value = "bitmall-mq", fallback = MQServiceFusingHandler.class) public interface MQService { @PostMapping("/mq/seckill/send") R sendMessageWithSecKill(@RequestBody SecKillOrderTO secKillOrderTO); } ``` ```java @Service public class MQServiceFusingHandler implements MQService { @Autowired private RedissonClient redissonClient; /** * 发送消息失败, 意味着无法构建订单, 订单项详情 以及 锁定库存等, 当前秒杀应该失败 * 这里需要释放信号量 * @param secKillOrderTO * @return */ @Override public R sendMessageWithSecKill(SecKillOrderTO secKillOrderTO) { RSemaphore semaphore = redissonClient.getSemaphore(SecKillConstant.SEC_KILL_RANDOM_CODE_SEMAPHORE + secKillOrderTO.getRandomToken()); semaphore.release(); return R.error("很不幸构建订单失败, 你秒杀成功了, 但是后台不给力"); } } ``` ## 降级规则的增加 ![image.png](https://cos.easydoc.net/13568421/files/lmvbxjpj.png) ```yaml degrade: # 降级规则的数据源 nacos: server-addr: localhost:8848 # nacos 地址 data-id: bitmall-seckill-degree-config group-id: DEFAULT_GROUP namespace: a4ad222b-b132-4d3e-a87d-e606bc5e1fb7 data-type: json # 数据类型 rule-type: degrade # 规则类型(流控) ``` ![image.png](https://cos.easydoc.net/13568421/files/lmvbyoix.png)