控制台下载https://github.com/alibaba/Sentinel/releases
# 控制台启动
java -Dserver.port=10888 -Dcsp.sentinel.dashboard.server=localhost:10888 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar
- 引入依赖
xml
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<!-- 支持nacos作为数据源 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
- 使用nacos作为数据源,定义流控规则
yml
spring:
cloud:
sentinel:
transport:
dashboard: localhost:10888
datasource:
#流控规则
flow: # 指定数据源名称 限流
# 指定nacos数据源
nacos:
server-addr: http://127.0.0.1:8848
# 指定配置文件
dataId: ${spring.application.name}-flow-rules
# 指定分组
groupId: SENTINEL_GROUP
# 指定配置文件规则类型
rule-type: flow
# 指定配置文件数据格式
data-type: json
- 流控配置内容为
在 Sentinel 中,可以使用 JSON 格式的配置文件来配置流量控制规则。以下是一个简单的示例,演示了如何编写一个 JSON 格式的 Sentinel 流量控制规则配置文件:
限流
${spring.application.name}-flow-rules
json
[
{
"resource":"findByPage",
"limitApp":"default",
"grade": 1 ,
"count":1,
"strategy": 0,
"controlBehavior": 0
}
]
对应一个com.alibaba.csp.sentinel.slots.block.flow.FlowRule
的对象列表
resource:需要限流的资源名称,可以是路径名称,也可以是SentinelResource注解的value值
limitApp:对应的黑名单/白名单,不同 origin 用 , 分隔,如 appA,appB
grade:限流类型,这里使用 QPS(每秒查询率)。
count:每秒查询率的阈值,例如 100。
strategy:流控模式,此处直接使用直接方式
controlBehavior: 流控效果, 0 快速失败 1 Warm Up 2 排队等待
4.流控代码中使用
@Service("goodsFishInfoService")
public class GoodsFishInfoServiceImpl extends ServiceImpl<GoodsFishInfoMapper, GoodsFishInfo> implements GoodsFishInfoService {
@Resource
private TokenUtil tokenUtil;
@Resource
GoodsFishInfoMapper goodsFishInfoMapper;
@Resource
FilterKeyWordMapper filterKeyWordMapper;
@Override
@SentinelResource(value = "findByPage", blockHandler = "handleException", blockHandlerClass = ExceptionUtil.class)
public ResultModelPage<GoodsFishInfo> findByPage(GoodsFishInfoVO goodsFishInfoVO) {
PageHelper.startPage(goodsFishInfoVO.getPage(), goodsFishInfoVO.getPageSize());
goodsFishInfoVO.setDelFlag(DelFlagEnum.ENABLE.getStatus());
Page<GoodsFishInfo> page = (Page<GoodsFishInfo>) baseMapper.findByPageVo(goodsFishInfoVO);
return ResultModelPage.resultModelTrue(Paging.of(page));
}
}
public final class ExceptionUtil {
/**
* 此处返回值和参数必须要和注解对应的方法一致 且后面添加一个BlockException参数
* 必须为 public static 方法
* @param goodsFishInfoVO
* @param ex
* @return
*/
public static ResultModelPage handleException(GoodsFishInfoVO goodsFishInfoVO, BlockException ex) {
System.out.println("Oops: " + ex.getClass().getCanonicalName());
return ResultModelPage.resultModelFalse("系统繁忙稍后再试");
}
}
结果展示: