sentinel配置
(1)在csmall-stock-webapi模块中
添加sentinel的依赖
<!-- sentinel依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
(2)application-dev.yml文件添加配置
spring:
application:
# 为当前项目起名,这个名字会被Nacos记录并使用
name: nacos-stock
cloud:
sentinel:
transport:
dashboard: localhost:8080 # 配置sentinel的位置(运行状态仪表盘)
# 执行限流的端口号,每个项目都不同(别的项目例如cart模块,要再向设置限流就不能用8721了)
port: 8721
nacos:
discovery:
# 配置Nacos所在的位置,用于注册时提交信息
server-addr: localhost:8848
(3)Sentinel启动---直接双击start-sentinel.bat
![](https://i-blog.csdnimg.cn/blog_migrate/7971689fa243e0f58669ff4aa0bbbe88.png)
会看到下面的界面
![](https://i-blog.csdnimg.cn/blog_migrate/2fa488af82c78ae1e8a1ed1b63ce705e.png)
账号和密码都是sentinel
但是我们要在knife4j里面先把功能测试了,才能够看得到簇点链路上有相应的服务方法的列表。
方法上自定义限流
自定义限流方法
对于被限流的请求,我们可以自定义限流的处理方法
默认情况下可能不能正确给用户提示,一般情况下,对被限流的请求也要有"服务器忙请重试"或类似的提示
StockController类中@SentinelResource注解中,可以自定义处理限流情况的方法
@PostMapping("/reduce/count")
@ApiOperation("减少商品库存数")
// @SentinelResource注解要标记控制层的方法才能生效,会在该方法运行时,被Sentinel管理
// 这个控制器方法第一次运行后,会在Sentinel仪表台中看到限流选项
// "减少商品库存数",会定义仪表台中代表该方法的选项名称
// blockHandler能够指定当前方法被限流时运行的方法名称
@SentinelResource(value = "减少商品库存数",blockHandler = "blockError")
public JsonResult reduceCommodityCount(StockReduceCountDTO stockReduceCountDTO){
// 调用业务逻辑层
stockService.reduceCommodityCount(stockReduceCountDTO);
return JsonResult.ok("库存减少已执行");
}
// Sentinel 自定义限流方法,规则如下
// 1.访问修饰符必须是public
// 2.返回值类型必须和控制器方法一致
// 3.方法名必须和对应的限流控制器方法定义的blockHandler属性值一致
// 4.方法的参数列表必须和控制器一致,而且还要额外添加BlockException类型的参数
public JsonResult blockError(StockReduceCountDTO stockReduceCountDTO,
BlockException e){
// 运行这个方法就是被限流了,直接返回被限流的提示即可
return JsonResult.failed(ResponseCode.INTERNAL_SERVER_ERROR,
"服务器忙,请稍后再试");
}
![](https://i-blog.csdnimg.cn/blog_migrate/8770f2c3ce090f710d2bbb58f91565a0.png)
我这里QPS写了1,然后就是回到knife4j上面,不断发送10遍左右,里面有成功的200状态,也有如下500状态码所对应的状态
![](https://i-blog.csdnimg.cn/blog_migrate/e05c30d874b7b6520355a7a0d305b953.png)