【Spring Cloud】Sentinel限流

控制台下载https://github.com/alibaba/Sentinel/releases

# 控制台启动
java -Dserver.port=10888 -Dcsp.sentinel.dashboard.server=localhost:10888 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

  1. 引入依赖
<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>
  1. 使用nacos作为数据源,定义流控规则
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
  1. 流控配置内容为

在 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("系统繁忙稍后再试");
    }
}

结果展示:
在这里插入图片描述

相关推荐

  1. Redis实现

    2024-03-19 22:44:04       58 阅读
  2. Nginx详解

    2024-03-19 22:44:04       66 阅读
  3. Redisson实现

    2024-03-19 22:44:04       43 阅读
  4. go的

    2024-03-19 22:44:04       32 阅读
  5. 算法学习

    2024-03-19 22:44:04       39 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-19 22:44:04       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-19 22:44:04       106 阅读
  3. 在Django里面运行非项目文件

    2024-03-19 22:44:04       87 阅读
  4. Python语言-面向对象

    2024-03-19 22:44:04       96 阅读

热门阅读

  1. 爬虫基本原理实现以及问题解决

    2024-03-19 22:44:04       46 阅读
  2. 系统架构设计师笔记第37期:数据访问层设计

    2024-03-19 22:44:04       41 阅读
  3. PyTorch学习笔记之基础函数篇(十二)

    2024-03-19 22:44:04       39 阅读
  4. [LLM]大模型八股知识点(一)

    2024-03-19 22:44:04       33 阅读
  5. 常见的几个Python技术难题

    2024-03-19 22:44:04       39 阅读
  6. 有什么小程序适合个人开发?

    2024-03-19 22:44:04       45 阅读
  7. 开发指南013-国际化-前台部分

    2024-03-19 22:44:04       43 阅读
  8. 协同导航的MATLAB程序,采用EKF作为滤波算法

    2024-03-19 22:44:04       34 阅读