Spring-Clould-Alibaba-sentinel控制台

2020-04-23 16:06:30来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

Spring-Clould-Alibaba-sentinel控制台

什么是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
在这里插入图片描述
在浏览器当中输入localhost:8088
在这里插入图片描述
用户名和密码为sentinel
在这里插入图片描述

  1. 添加依赖
    在这里插入图片描述
<dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>

  1. 添加配置
    在这里插入图片描述
sentinel:
      transport:
        dashboard: localhost:8088

启动服务访问 :http://localhost:8000/getGoodsWithID/1在这里插入图片描述
查看控制台
在这里插入图片描述

sentinel功能介绍

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

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

阈值类型:

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

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

流控模式:直接

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

流控模式:关联

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

示例:

  1. 在控制台关联访问路径
    在这里插入图片描述
  2. 在代码编写方法
    在这里插入图片描述在这里插入图片描述
 @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因为设置了关联,就会被限流
    在这里插入图片描述
  2. 链路:指定资源从入口资源进来的流量,如果达到阈值,就开启限流

流控效果

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

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

  1. 排队等待

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

代码配置

  1. 引入依赖
    在这里插入图片描述
<dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-core</artifactId>
            <version>1.7.0</version>
        </dependency>
  1. 定义资源名称
    在这里插入图片描述
private static final String GETGOODS_KEY = "getMyGoods";
  1. 定义限流规则
    在这里插入图片描述
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. 应用到被限流的接口上
    在这里插入图片描述
 @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

当刷新次数超过一秒一次的时候就会被限流
在这里插入图片描述
在这里插入图片描述
但是每次启动都需要先访问开启initFlowRules方法,所以要设置服务启动时开启限流

  1. 自动执行流控代码
    使用springboot自带的ApplicationRunner接口
    使用方式,实现ApplicationRunner接口,在run方法当中执行流控代码
    在这里插入图片描述
    在这里插入图片描述
  2. 使用注解改进代码
  1. Sentinel 支持通过 @SentinelResource 注解定义资源并配置 blockHandler
  2. 和 fallback 函数来进行限流之后的处理
  3. blockHandler 函数会在原方法被限流/降级/系统保护的时候调用
  4. fallback 函数会针对所有类型的异常
    在这里插入图片描述
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 "被限流了---";
    }

在这里插入图片描述

降级

在这里插入图片描述
降级策略:
RT:

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

异常比例:

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

异常次数:

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

热点规则

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

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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

系统规则

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

发生以上这些情况的时候把你整个应用给你断掉。所有服务都不提供了
在这里插入图片描述

授权规则

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

指定来源方式
新建配置类
在这里插入图片描述

@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;
    }
}

在这里插入图片描述
在这里插入图片描述
指定降级 在这里插入图片描述
在这里插入图片描述

sentinel整合Feign

  1. 开启feign与Sentinel集成
    在这里插入图片描述
feign:
  sentinel:
    enabled: true
  1. 创建一个类实现服务GoodsFeignClient接口
    在这里插入图片描述
@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接口
    在这里插入图片描述
FeignClient(name = "goods-provide",fallback = GoodsFeignClientFalback.class)

正常访问
在这里插入图片描述
设置流控
在这里插入图片描述
刷新多次
在这里插入图片描述

规则持久化

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

  1. 在nacos配置中心当中添加配置josn规则
    在这里插入图片描述
  2. 添加依赖
    在这里插入图片描述
<!--添加此依赖,项目一启动时, 就去到nacos当中读取配置中心-->
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
            <version>1.7.0</version>
        </dependency>
  1. 在配置文件当中添加sentinel读取nacos地址
    在这里插入图片描述
	  eager: true
      datasource:
          ds:
            nacos:
              server-addr: localhost:8849
              group-id: DEFAULT_GROUP
              rule-type: flow
              data-id: getGoods
              data-type: json

在这里插入图片描述
启动 读取nacos的流控规则
在这里插入图片描述

使用AHAS实现规则持久化

  1. https://help.aliyun.com/document_detail/90323.html
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    选择公网
    在这里插入图片描述
    勾选java、sdk、Springboot
    在这里插入图片描述
  2. 添加依赖在这里插入图片描述
  3. 去除sentinel的部分依赖 避免冲突
    在这里插入图片描述
 <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>

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
访问一次服务后 看AHAS控制台
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
和本地的sintinel一样的操作


原文链接:https://www.cnblogs.com/joker-dj/p/12761740.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:2020年已经过去4/1:七年老兵分享Java程序员突破能力需要的那些

下一篇:基于netty实现rpc框架-spring boot客户端