秒杀服务的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)
> **一开始, 我们发现没有出现持久化的流控或降级规则, 我们只需要多请求这个资源几次就会重新出现了**
## 流控规则的增加

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 # 规则类型(流控)
```

## 熔断规则的增加
### 说在前面
> 如果秒杀之前的所有判断都符合, 那么, 该用户可以秒杀, 并获取信号量, 但是, 有可能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("很不幸构建订单失败, 你秒杀成功了, 但是后台不给力");
}
}
```
## 降级规则的增加

```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 # 规则类型(流控)
```
