Spring-Clould-Alibaba-sentinel控制台

Spring-Clould-Alibaba-sentinel控制台

  • 什么是Sentinel
  • 使用sentinel
  • sentinel功能介绍
    • 流控模式:直接
    • 流控模式:关联
    • 流控效果
    • 代码配置
    • 降级
    • 热点规则
    • 系统规则
    • 授权规则
  • sentinel整合Feign
    • 规则持久化
      • 使用AHAS实现规则持久化

什么是Sentinel

Sentinel是阿里开源的项目,提供了流量控制、熔断降级、系统负载保护等多个维度来保障服务之间的稳定性。

使用sentinel

  1. 下载sentinel控制台服务器
    下载地址 链接

  2. 使用控制台
    在jar目录当中打开控制台,输入java -jar sentinel-dashboard-1.7.0.jar
    例:指定端口为8088 并且监控sentinel本身

java -Dserver.port=8088 -Dcsp.sentinel.dashboard.server=localhost:8088
-jar sentinel-dashboard-1.7.0.jar
Spring-Clould-Alibaba-sentinel控制台_第1张图片
在浏览器当中输入localhost:8088
Spring-Clould-Alibaba-sentinel控制台_第2张图片
用户名和密码为sentinel
Spring-Clould-Alibaba-sentinel控制台_第3张图片

  1. 添加依赖
    Spring-Clould-Alibaba-sentinel控制台_第4张图片
<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

  1. 添加配置
    Spring-Clould-Alibaba-sentinel控制台_第5张图片
sentinel:
      transport:
        dashboard: localhost:8088

启动服务访问 :http://localhost:8000/getGoodsWithID/1Spring-Clould-Alibaba-sentinel控制台_第6张图片
查看控制台
Spring-Clould-Alibaba-sentinel控制台_第7张图片

sentinel功能介绍

资源名称,访问的路径,唯一名称** 针对来源:

  1. 可以针对调用者进行限流
  2. 假设两个微服务a和b调用,可以对a和b单独的设置限流规则
  3. default为不区别来源

阈值类型:

  1. QPS 当调用api的QPS达到阈值时,就去做限流
  2. 线程数
  3. 流控(限流) 当调用api的线程数达到一定的域值时就去做限流

设置阈值 一秒种超过一次时, 就会触发限流

流控模式:直接

Spring-Clould-Alibaba-sentinel控制台_第8张图片
在这里插入图片描述
Spring-Clould-Alibaba-sentinel控制台_第9张图片

流控模式:关联

当联的资源达到域值时, 限流自己
查询接口调用过快, 如果影响修改接口,或者修改接口影响查询接口, 根据业务需求,来进行关联限流

示例:

  1. 在控制台关联访问路径
    Spring-Clould-Alibaba-sentinel控制台_第10张图片
  2. 在代码编写方法
    Spring-Clould-Alibaba-sentinel控制台_第11张图片Spring-Clould-Alibaba-sentinel控制台_第12张图片
 @RequestMapping("/test")
    public void test(){
        System.out.println("test-------");
    }

    public static void main(String[] args) throws InterruptedException {
        for (int i=0;i<1000;i++){
            RestTemplate restTemplate = new RestTemplate();
            restTemplate.getForObject("http://localhost:8000/test",Object.class);
            Thread.sleep(500);
        }
    }
  1. 启动main方法 执行test方法,getGoods因为设置了关联,就会被限流
    Spring-Clould-Alibaba-sentinel控制台_第13张图片
  2. 链路:指定资源从入口资源进来的流量,如果达到阈值,就开启限流

流控效果

  1. 快速失败:直接失败,抛出异常信息
  2. Warm Up:

根据codeFactor从设置的阈值除以codeFactor,经过预热时长,才到达设置的QPS阈值 假设设置的阈值为90
那么就会90/3(默认) 30 作为最初的阈值 ,预热指定的时长 才去达到90的值限流

  1. 排队等待

匀速排队,让请求以均匀的速度通过,阈值类型必须设置成QPS,否则无效 超过了定义的时长, 就会抛出异常

代码配置

  1. 引入依赖
    Spring-Clould-Alibaba-sentinel控制台_第14张图片
<dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-core</artifactId>
            <version>1.7.0</version>
        </dependency>
  1. 定义资源名称
    Spring-Clould-Alibaba-sentinel控制台_第15张图片
private static final String GETGOODS_KEY = "getMyGoods";
  1. 定义限流规则
    Spring-Clould-Alibaba-sentinel控制台_第16张图片
private static final String GETGOODS_KEY = "getMyGoods";

    @RequestMapping("/initFlowRules")
    public void initFlowRules(){
        List<FlowRule> rules = new ArrayList<>();
        FlowRule rule = new FlowRule();
        //设置资源名称
        rule.setResource(GETGOODS_KEY);
        //设置针对来源
        rule.setLimitApp("default");
        //设置阈值类型
        rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        // 设置阈值
        rule.setCount(1);
        rules.add(rule);
        FlowRuleManager.loadRules(rules);
    }
  1. 应用到被限流的接口上
    Spring-Clould-Alibaba-sentinel控制台_第17张图片
 @RequestMapping("/getMyGoods")
    public String getMyGoods(){
        try (Entry entry = SphU.entry(GETGOODS_KEY)) {
            // 被保护的逻辑
            return "getMyGoods";
        } catch (BlockException ex) {
            // 处理被流控的逻辑
            return "被限流了";
        }
    }

启动运行 首先执行 initFlowRules 方法开启限流
http://localhost:8000/initFlowRules

然后执行http://localhost:8000/getMyGoods

当刷新次数超过一秒一次的时候就会被限流
Spring-Clould-Alibaba-sentinel控制台_第18张图片
Spring-Clould-Alibaba-sentinel控制台_第19张图片
但是每次启动都需要先访问开启initFlowRules方法,所以要设置服务启动时开启限流

  1. 自动执行流控代码
    使用springboot自带的ApplicationRunner接口
    使用方式,实现ApplicationRunner接口,在run方法当中执行流控代码
    Spring-Clould-Alibaba-sentinel控制台_第20张图片
    Spring-Clould-Alibaba-sentinel控制台_第21张图片
  2. 使用注解改进代码
  1. Sentinel 支持通过 @SentinelResource 注解定义资源并配置 blockHandler
  2. 和 fallback 函数来进行限流之后的处理
  3. blockHandler 函数会在原方法被限流/降级/系统保护的时候调用
  4. fallback 函数会针对所有类型的异常
    Spring-Clould-Alibaba-sentinel控制台_第22张图片
private static final String GET_GOODS_KEY = "getMyGoods";
    @SentinelResource(value = GET_GOODS_KEY,blockHandler = "blockHandlerMethod")
    @RequestMapping("/getMyGoods")
    public String getMyGoods(){
        return "getMyGoods";
    }
    public String blockHandlerMethod(BlockException e){
        e.printStackTrace();
        return "被限流了---";
    }

Spring-Clould-Alibaba-sentinel控制台_第23张图片

降级

Spring-Clould-Alibaba-sentinel控制台_第24张图片
降级策略:
RT:

  1. 平均响应时间 (DEGRADE_GRADE_RT):当 1s 内持续进入 5 个请求,
  2. 对应时刻的平均响应时间(秒级)均超过阈值(count,以 ms 为单位)
  3. 那么在接下的时间窗口之内,对这个方法的调用都会自动地熔断

异常比例:

  1. 当资源的每秒请求量 >= 5,并且每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后
  2. 资源进入降级状态

异常次数:

  1. 当资源近 1 分钟的异常数目超过阈值之后会进行熔断。
  2. 注意由于统计时间窗口是分钟级别的,若 timeWindow 小于 60s,则结束熔断状态后仍可能再进入熔断状态。

热点规则

指定索引参数,如果在时间窗口内超过了指定的阈值,就会触发熔断

参数例外项 可以对指定的参数再进行设置限流 参数级别
对指定的参数限流,甚至对指定参数的值进行限流
注意事项 :
参数必须是基本数据类型或String类型

Spring-Clould-Alibaba-sentinel控制台_第25张图片
Spring-Clould-Alibaba-sentinel控制台_第26张图片
在这里插入图片描述
Spring-Clould-Alibaba-sentinel控制台_第27张图片

系统规则

  1. 和其他的规则不太一样,它是针对应用来设的
  2. 前面设置的都是争对某一个资源。某一个方法来设置的
    阈值类型
  1. load load是负载,只有在linux机器上才会生效。根据当前系统的负载来决定是不是触发保护。
  2. RT 这个应用上所有的流量的平均的响应时间,所有服务的平均响应时间超过一个值,那么我就停止接收新的请求,
  3. 线程数 所有服务访问的线程数加起来
  4. 入口qps 所有服务的qps加起来达到一个值
  5. cpu使用率 cpu的使用率超过一个百分比

发生以上这些情况的时候把你整个应用给你断掉。所有服务都不提供了
Spring-Clould-Alibaba-sentinel控制台_第28张图片

授权规则

使用授权时要先指定来源,对指定来源的内容进行限流

指定来源方式
新建配置类
Spring-Clould-Alibaba-sentinel控制台_第29张图片

@Component
public class RequestOrigin implements RequestOriginParser {
    @Override
    public String parseOrigin(HttpServletRequest httpServletRequest) {
        //从请求参数中获取origin的参数并返回
        String origin = httpServletRequest.getParameter("origin");
        //如果获取不到origin 就抛出异常
        if (StringUtils.isBlank(origin)){
            throw new IllegalArgumentException("必须指定origin");
        }
        //有参数就返回
        return origin;
    }
}

Spring-Clould-Alibaba-sentinel控制台_第30张图片
Spring-Clould-Alibaba-sentinel控制台_第31张图片
指定降级 .设置为黑名单,我这里截图没截好Spring-Clould-Alibaba-sentinel控制台_第32张图片
Spring-Clould-Alibaba-sentinel控制台_第33张图片

sentinel整合Feign

  1. 开启feign与Sentinel集成
    Spring-Clould-Alibaba-sentinel控制台_第34张图片
feign:
  sentinel:
    enabled: true
  1. 创建一个类实现服务GoodsFeignClient接口
    Spring-Clould-Alibaba-sentinel控制台_第35张图片
@Component
public class GoodsFeignClientFalback implements GoodsFeignClient {
    @Override
    public Object getGoods() {
        return ResponseResult.error("GoodsFeignFallback服务器正在维护,请稍后重试--");
    }

    @Override
    public ResponseResult getgoodsWithID(Integer id) {
        return ResponseResult.error("GoodsFeignFallback服务器正在维护,请稍后重试--");
    }

    @Override
    public ResponseResult getgoodsObj(Goods goods) {
        return ResponseResult.error("GoodsFeignFallback服务器正在维护,请稍后重试--");
    }
}
  1. 在GoodsFeignClient接口
    Spring-Clould-Alibaba-sentinel控制台_第36张图片
FeignClient(name = "goods-provide",fallback = GoodsFeignClientFalback.class)

正常访问
Spring-Clould-Alibaba-sentinel控制台_第37张图片
设置流控
Spring-Clould-Alibaba-sentinel控制台_第38张图片
刷新多次
Spring-Clould-Alibaba-sentinel控制台_第39张图片

规则持久化

使用Nacos配置中心实现规则持久化

  1. 在nacos配置中心当中添加配置josn规则
    Spring-Clould-Alibaba-sentinel控制台_第40张图片
  2. 添加依赖
    Spring-Clould-Alibaba-sentinel控制台_第41张图片
<!--添加此依赖,项目一启动时, 就去到nacos当中读取配置中心-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <version>1.7.0</version>
        </dependency>
  1. 在配置文件当中添加sentinel读取nacos地址
    Spring-Clould-Alibaba-sentinel控制台_第42张图片
	  eager: true
      datasource:
          ds:
            nacos:
              server-addr: localhost:8849
              group-id: DEFAULT_GROUP
              rule-type: flow
              data-id: getGoods
              data-type: json

Spring-Clould-Alibaba-sentinel控制台_第43张图片
启动 读取nacos的流控规则
在这里插入图片描述

使用AHAS实现规则持久化

  1. https://help.aliyun.com/document_detail/90323.html
    Spring-Clould-Alibaba-sentinel控制台_第44张图片
    Spring-Clould-Alibaba-sentinel控制台_第45张图片
    Spring-Clould-Alibaba-sentinel控制台_第46张图片
    选择公网
    Spring-Clould-Alibaba-sentinel控制台_第47张图片
    勾选java、sdk、Springboot
    Spring-Clould-Alibaba-sentinel控制台_第48张图片
  2. 添加依赖Spring-Clould-Alibaba-sentinel控制台_第49张图片
  3. 去除sentinel的部分依赖 避免冲突
    Spring-Clould-Alibaba-sentinel控制台_第50张图片
 <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.alibaba.csp</groupId>
                    <artifactId>sentinel-transport-simple-http</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

Spring-Clould-Alibaba-sentinel控制台_第51张图片
Spring-Clould-Alibaba-sentinel控制台_第52张图片
Spring-Clould-Alibaba-sentinel控制台_第53张图片
访问一次服务后 看AHAS控制台
Spring-Clould-Alibaba-sentinel控制台_第54张图片
Spring-Clould-Alibaba-sentinel控制台_第55张图片
Spring-Clould-Alibaba-sentinel控制台_第56张图片
和本地的sintinel一样的操作

你可能感兴趣的:(Spring-Clould-Alibaba-sentinel控制台)