Sentinel:服务限流

news2024/11/18 6:33:01

文章目录

  • 创建工程测试工程
    • 流控
    • 熔断
    • 热点
    • 授权规则
    • 系统规则
    • @SentinelResource
  • 配置持久化
  • 执行流程

创建工程测试工程

1.导入依赖

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.12.RELEASE</version>
</parent>

<dependencyManagement>
    <dependencies>
        <!-- spring cloud 总体依赖版本管理 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Hoxton.SR12</version>
            <scope>import</scope>
            <type>pom</type>
        </dependency>
        <!-- spring cloud alibaba 总体依赖版本管理 -->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2.2.7.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
</dependencies>

2.yml配置

server:
  port: 9000
spring:
  application:
    name: nacos-sentinel
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.8.128:8848
    sentinel: # 配置sentinel信息
      transport:
        dashboard: 192.168.8.128:8858 # 配置sentinel服务器地址,客户端连接sentinel
        port: 8719 # 代表sentinel客户端和控制台通信的端口,默认为8719,sentinel监控客户端

4.创建控制器

@RestController	
public class SentinelController {
    @RequestMapping("/fs")
    public String show(){
        return "hello world!";
    }
}

访问: http://localhost:9000/fs
在这里插入图片描述

流控

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

1.资源名: 标识资源的唯一名称,默认为请求路径,也可以在客户端中使用@SentinelResource配置。
2.针对来源: Sentinel可以针对服务调用者进行限流,填写微服务名称即spring.application.name,默认为default,不区分来源。
3.阈值类型:
QPS(每秒钟的请求数量): 当调用该api的QPS达到阈值的时候,进行限流。
线程数: 当调用该api的线程数达到阈值的时候,进行限流。
4.单机阈值: 定义QPS或线程数的具体控制阈值。
5.是否集群: 默认不集群。
6.流控模式:
直接: 当api调用达到限流条件的时,直接限流。
关联: 当关联的资源请求达到阈值的时候,限流自己,例: 设置/aa和/bb,在/bb的关联中填入/aa,/aa在1s被访问5次(假设限制)则限流/bb
链路: 只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,则进行限流),例: 从指定/aa下访问/fs的请求才统计限流
7 流控效果:
快速失败: 直接失败。
Warm Up(预热): 设置预热时长,在预热时长内,处理请求上线为 请求数/预热时长,预热时长过后,恢复原单机阈值
排队等待: 匀速排队,让请求匀速通过,阈值类型必须设置为QPS,否则无效。

熔断

在这里插入图片描述

下图表示访问/fs控制单元的5次请求内,有50%的请求的响应时长超过100ms,则熔断3秒,熔断期间直接降级
在这里插入图片描述
熔断策略:
1 慢调用比例: 按照响应时间进行判断,比例,数量进行判断。
2.异常比例: 按照异常比例进行判断。
3 异常数量: 按照异常的数量进行判断。

最大RT: 响应时间,单位毫秒。指请求及响应的时间。最大RT :300,表示如果请求及响应时间超过300毫秒则为慢调用。
比例阈值: 取值[0.0-1.0],0表示0%,1.0表示100%。表示慢调用出现的比例。
熔断时长: 当满足熔断条件后,熔断时间。
最小请求数: 进行判断的最小请求的数量。

热点

简单说: 就是更具请求携带的不同的参数值,来采取不同的限制.
添加控制层代码: 在方法前加@SentinelResource(value = “firstResource(随意指定)”)
注意 热点 只能在 @SentinelResource该注解指定的名称中添加,不能直接添加到对应的控制单元上
在这里插入图片描述

@RestController
public class DemoController {
    @RequestMapping("/fs")
    @SentinelResource(value = "firstResource")
    public String show(String name){
        System.out.println(name);
        return "hello world!";
    }
}

下图就是在请求参数不为aa时,一秒内超过2个请求就降级,请求参数为aa时,一秒内超过5个请求就降级才降级
在这里插入图片描述
参数索引: 请求传入的参数索引,从0开始计数。即控制器方法参数表中的热点参数索引。
单机阈值: 与流控规则中的单机阈值含义相同。
统计窗口时长: 对单机阈值的流控限制统计窗口时长。如:单机阈值 3, 统计窗口时长 1 ,则1秒内QPS阈值为3。
设置热点参数: 当创建热点规则后,会在Sentinel Dashboard中热点规则中出现我们建立的规则。

在热点规则中点击编辑
参数类型: 热点参数数据类型。
参数值: 热点参数具体值。
限流阈: 当请求参数值与热点参数值相同时的QPS阈值。
添加按钮: 当设置好热点参数例外项后,一定要点击添加按钮,否则热点参数不生效

授权规则

就是让那些ip和访问,哪些ip不能访问

使用授权规则,必须在被Sentinel管理的应用这增加解析类型,根据IP实现授权规则限制

/**
 * 自定义解析器。用于配合Sentinel实现授权管理的。
 * 要求当前类型的对象,必须被spring容器管理。
 *
 * RequestOriginParser - 用于解析每个请求的解析器。
 *  可以获取客户端IP地址。
 */
@Component
public class MyParser implements RequestOriginParser {
    /**
     * 接口中定义的唯一解析方法。用于解析请求对象的。
     * @param httpServletRequest
     * @return 解析后的结果。一般是客户端IP地址。
     */
    @Override
    public String parseOrigin(HttpServletRequest httpServletRequest) {
        System.out.println("remoteAddr = " + remoteAddr);
        System.out.println("remoteHost = " + httpServletRequest.getRemoteHost());
        System.out.println("remotePort = " + httpServletRequest.getRemotePort());

        return httpServletRequest.getRemoteAddr();
    }
}

在这里插入图片描述
表示只有127.0.0.1才能访问该地址
在这里插入图片描述
1.流控应用: 具体访问这个资源的客户端,即客户端IP地址。多个地址使用逗号 ‘,’ 分隔。
2 授权类型: 即流控应用是否可访问当前被授权规则管理的资源。

  • 白名单:可以访问。
  • 黑名单:不可访问。

系统规则

在这里插入图片描述

系统规则是对整个系统进行设置的规则。阈值类型包含以下五种:
​1.Load: 自适应(仅对 Linux/Unix-like 机器生效),系统的 load 作为启发指标,进行自适应系统保护。当系统 load超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR 阶段)。系统容量由系统的 maxQps minRt 估算得出。设定参考值一般是 CPU cores 2.5。
2.CPU使用率: 当系统 CPU 使用率超过阈值即触发系统保护(取值范围 0.0-1.0),比较灵敏。
3.RT平均 RT,当单台机器上所有入口流量的平均 RT 达到阈值即触发系统保护,单位是毫秒。
4.线程数: 并发线程数,当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
5.QPS: 入口 QPS,当单台机器上所有入口流量的 QPS 达到阈值即触发系统保护。

@SentinelResource

利用这个注解可以自定义降级和发生异常时调用的方法
1.fallback回退: 在标注了@SentinelResouce注解的方法,发生了Java异常时的回退处理。
2.block回退: @SentinelResource资源访问不符合Sentinel控制台定义的规则时的回退。当没有定义Block回退时默认为Blocked by Sentinel (flow limiting)

 *  fallback - 是当前服务逻辑,发生异常的时候,Sentinel辅助回调的降级方法名称。
 *   当方法抛出异常。触发fallback配置的方法,返回给客户端降级数据。
 *   没有默认值。
 *   方法定义要求:
 *    1. fallback方法签名和当前方法签名,除方法名称外其他都一致。

 *  blockHandler - 是当前服务逻辑,触发Sentinel限制阈值时,Sentinel辅助回调的降级方法名。
 *   当某限制规则被触发,blockHandler配置的方法运行,返回给客户端降级数据。
 *   没有默认值。
 *   方法定义要求:
 *    1. blockHandler方法签名和当前方法签名,除方法名称和参数表外,都一致。
 *    2. 参数表要求:包含当前方法所有参数,在参数表最后,增加BlockException参数。

 *   BlockException是Sentinel定义的规则异常顶级父类。有若干子类型。
 *       异常参数对象的具体类型,代表触发了Sentinel约束的哪一种规则。
 *        FlowException - 流控规则
 *        ParamFlowException - 热点规则
 *        DegradeException - 降级规则
 *        AuthorityException - 授权规则
 *        SystemBlockException - 系统规则
@RestController
public class DemoController {
    @GetMapping("/sayHello")
    @SentinelResource(value = "firstResource", fallback = "sayHelloFallback", blockHandler = "sayHelloBlockHandler")
    public String sayHello(String name){
        System.out.println("sentinel name = " + name);
        // 用于测试异常处理
        if(name.equals("exception")){
            throw new RuntimeException("测试异常处理");
        }
        return "您好:" + name;
    }
    public String sayHelloFallback(String name){
        System.out.println("sayHelloFallback方法运行,参数是:" + name);
        return "服务器忙,请稍后重试!";
    }
    public String sayHelloBlockHandler(String name, BlockException ex){
        if(ex.getClass() == FlowException.class){
            System.out.println("流控规则");
            return "参与活动人数太多,请稍后重试!";
        }
        if(ex.getClass() == ParamFlowException.class){
            System.out.println("热点规则");
            return "查询的数据不存在!";
        }
        if(ex.getClass() == DegradeException.class){
            System.out.println("降级规则");
            return "服务器爆炸!";
        }
        if(ex.getClass() == AuthorityException.class){
            System.out.println("授权规则");
            return "您的权限不足,请联系管理员!";
        }
        if(ex.getClass() == SystemBlockException.class){
            System.out.println("系统规则");
            return "您访问的网站已下线,明天再来吧!";
        }
        System.out.println("其他问题");
        return "未知原因";
    }
}

配置持久化

Sentinel中各种流量控制可以借助持久化工具进行存储。示例中利用:Nacos配置中心存储相关配置。
1.在nocos中新增配置
在这里插入图片描述
2.配置内容:

[
{
"resource": "/demo01",
"limitApp": "default",
"grade": 1,
"count": 3,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]

配置详解:

  • resource:资源名,即限流规则的作用对象
  • limitApp:流控针对的调用来源,若为 default 则不区分调用来源
  • grade:限流阈值类型(QPS 或并发线程数);0代表根据并发线程数量来限流,1代表根据QPS来进行流量控制
  • count:限流阈值
  • strategy:流控模式,调用关系限流策略(0-直连,1-关联,2-链路)
  • controlBehavior:流量控制效果(0-快速失败、1-Warm Up、2-排队等待)
  • clusterMode:是否为集群模式

3.导入依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

4.yml配置

server:
  port: 8080
spring:
  application:
    name: nacos-sentinel
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
    sentinel: # 配置sentinel信息
      transport:
        dashboard: 127.0.0.1:8858 # 配置sentinel服务器地址。
        port: 8719 # 代表sentinel客户端和控制台通信的端口,默认为8719
      datasource: # 配置sentinel规则存储的数据源
        ds: # 定义数据源的key
          nacos: # 指定nacos作为数据源
            server-addr: 127.0.0.1:8848 # nacos服务器地址
            data-id: hello  # nacos中配置文件名称
            group-id: world # nacos中配置文件所属分组, 默认DEFAULT_GROUP
            data-type: json # nacos中配置文件类型, 默认json
            rule-type: flow # nacos中配置文件定义的规则类型。

5.重启后,访问 http://localhost:9000/fs?name=test在不做任何规则配置的前提下,查看Sentinel控制台中的流控规则面板,查看是否存在流控规则信息。
存在!

执行流程

1.微服务启动
2.根据配置文件application.yml中的配置,动态访问Sentinel Datasource,读取持久化规则配置3.sentinel客户端占用端口8719,连接sentinel服务器(端口是8858)
4.如果有持久化的规则配置,在连接sentinel服务器的同时,提交持久化规则配置内容5.客户端浏览器请求微服务
6.微服务中的sentinel客户端拦截请求,上报请求信息到sentinel服务器(端口8858)
7.sentinel服务器检测已配置的规则限制(如:流控、降级、热点等)
8.sentinel服务器返回规则限制是否被触发(返回到sentinel客户端,端口是8719)
9.如果流控规则已触发,sentinel客户端直接返回降级(Blocked by sentinel),或调用SentinelResource注解配置的blockHandler返回托底数据。
10.如果流控规则未触发,微服务正常执行,并返回运行结果给客户端。|

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/455439.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

开放原子训练营第三期:RT-Thread 学习有感

介绍 前几天有幸收到C站的训练营学习邀请&#xff0c;了解到这两天即将举行的开放原子 RTT 训练营。博主算是一名嵌入式方向的小白&#xff0c;主要还是在裸机上进行开发&#xff0c;但对嵌入式的操作系统和实时系统很感兴趣。在这次学习训练营中借助一些学习示例&#xff0c;…

【Linux】 1.2基本指令-part 2

文章目录 07. man指令08.cp指令(copy)&#xff08;重要&#xff09;09.mv指令(move)&#xff08;重要&#xff09;10.cat指令- 补充&#xff1a;echo 与 >11.more指令12.less指令&#xff08;重要&#xff09;13.head指令14.tail指令- 补充&#xff1a;管道 07. man指令 ma…

CV不存在了?体验用Segment Anything Meta分割清明上河图

目录 1 Facebook抠图神器2 本地版SAM配置3 Web版SAM体验4 总结 1 Facebook抠图神器 在图像处理与计算机视觉领域&#xff0c;图像分割(image segmentation)是在像素级别将一个完整图像划分为若干具有特定语义区域(region)或对象(object)的过程。每个分割区域是一系列拥有相似特…

IJKPLAYER源码分析-常用API

前言 本文简要介绍IJKPLAYER的几个常用API&#xff0c;以API使用的角度&#xff0c;来审视其内部运作原理。这里以iOS端直播API调用切入。 调用流程 init 创建播放器实例后&#xff0c;会先调用init方法进行初始化&#xff1a; - (IJKFFMediaPlayer *)init {self [super ini…

《深入浅出Embedding》随笔

ChatGPT的核心运行机制或许是Transformer&#xff0c; ChatGPT的核心数据机制或许就是嵌入&#xff08;Embedding&#xff09;了。什么是Embedding呢&#xff1f;了解Embedding可以为我们的软件研发工作带来哪些帮助呢&#xff1f;鉴于此&#xff0c;老码农阅读了《深入浅出Emb…

前端切图仔入门Docker,三分钟上线自己的博客平台

依稀记得2022年趁某平台优惠买了台云服务器&#xff0c;周未准备安装MySQL数据库&#xff0c;两天时间卡在MySQL环境配置上&#xff0c;实在是折磨一气之下把服务器给退了。 要是我早一点学会Docker&#xff0c;我的博客估计已上线一年啦&#xff01;前端切图仔学会Docker&…

AI魔法秀:D-ID助你打造视频虚拟数字人

随着ChatGPT的各种玩法&#xff0c;写文章、做PPT、编程、修bug等&#xff0c;大家都玩的不亦说乎&#xff0c;可以说真的给家人们提升的效率很高&#xff0c;最近个人尝试着制作一个虚拟数字人&#xff0c;也是一个玩法&#xff0c;可以帮助很多中小企业做企业文化宣讲或者是产…

闲谈【Stable-Diffusion WEBUI】的插件:美不美?交给AI打分

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;咖啡店艺术评价&#xff08;Cafe Aesthetic&#xff09; &#xff08;零&#xff09;前言 本篇主要提到了WEBUI的Cafe Aesthetic插件&#xff0c;这是一个相对独立的插件&#xff0c;单独标签页&#xff0c;…

周杰伦代言的蕉下,3年半广告宣传费超10亿,全靠营销?

五一假期将至&#xff0c;各地即将迎来旅游小热潮&#xff0c;不少游客也开始为自己的出行准备攻略。随着露营、徒步等城市户外运动的兴起&#xff0c;防晒理念“再度升温”&#xff0c;靠卖小黑伞起家的蕉下瞄准年轻世代消费者&#xff0c;又在疯狂收割“防晒焦虑”。 去年4月…

【JavaWeb】JavaScript

1、JavaScript 介绍 Javascript 语言诞生主要是完成页面的数据验证。因此它运行在客户端&#xff0c;需要运行浏览器来解析执行 JavaScript 代码。 JS 是 Netscape 网景公司的产品&#xff0c;最早取名为 LiveScript;为了吸引更多 java 程序员。更名为 JavaScript。 JS 是弱…

排序 - 冒泡排序(Bubble Sort)

文章目录 冒泡排序介绍冒泡排序实现复杂度和稳定性冒泡排序时间复杂度冒泡排序稳定性 代码实现核心&注意结尾 每日一道算法提高脑力&#xff0c;今天是第一天&#xff0c;来个最简单的算法–冒泡排序。 冒泡排序介绍 它是一种较简单的排序算法。它会遍历若干次要排序的数列…

对话庄表伟老师-文字实录

我内心有一套价值观&#xff0c;有一套世界观&#xff0c;它是一个完整的整体&#xff0c;无论我做任何的事情&#xff0c;工作也好、生活也好、学习也好、去做社区也好、或者是结识朋友也好、去聊天也好&#xff0c;背后的价值观在内心都是一整套的&#xff0c;互相之间是不会…

Python学习之简易图片浏览器

俗话说实践是学习最有效的方法。最近在学习python&#xff0c;于是就参考着各类文章&#xff0c;也倒腾了一个简易图片浏览器&#xff0c;效果图如下&#xff1a; 整个浏览器分为左右两侧&#xff0c;左侧是地址栏图片文件列表&#xff1b;右侧则是图片显示区域。 左侧地址栏有…

数据结构,二叉搜索树的详解

&#x1f9d1;‍&#x1f4bb;作者&#xff1a;程序猿爱打拳&#xff0c;Java领域新星创作者&#xff0c;阿里云社区博客专家。 &#x1f5c3;️文章收录于&#xff1a;数据结构与算法 &#x1f5c2;️JavaSE的学习&#xff1a;JavaSE &#x1f5c2;️MySQL数据库的学习: MySQL…

Python基础之类

一&#xff1a;什么是类 类即类别/种类&#xff0c;是面向对象分析和设计的基石&#xff0c;如果多个对象有相似的数据与功能&#xff0c;那么该多个对象就属于同一种类。有了类的好处是&#xff1a;我们可以把同一类对象相同的数据与功能存放到类里&#xff0c;而无需每个对象…

【AI绘画】Midjourney的使用及程序示例

Midjourney 1.背景2.Midjourney的原理3.Midjourney的使用方法4.Midjourney的示例代码 1.背景 Midjourney 是一款基于深度学习的图像转换工具&#xff0c;其可以将一张图像转换成具有不同风格的图像&#xff0c;例如将一张照片转换成卡通风格的图像。Midjourney 基于 TensorFlow…

Jetson Nano一步到位打开USB摄像头(Rosmaster小车)

背景&#xff1a;我用的rosmaster r2小车配的摄像头是Astra pro&#xff0c;也就是下图这款&#xff1a; 1. 支持的摄像头 Jetson开发包有多个用于连接相机的接口&#xff0c;包括USB、以太网和MIPI CSI-2。流行的相机是现成的支持&#xff0c;而Jetson生态系统合作伙伴支持广…

基于树莓派的OpenEuler基础实验二

文章目录 基于树莓派的OpenEuler基础实验二一、ROS中间件介绍1. ROS话题通信与服务通信2. 常见的ROS终端命令 二、中间件基础实验1. ROS的移植2. ROS的安装和环境配置3. 第一个ROS实践之开启小海龟4. ROS话题实践1&#xff09;ROS工作区与软件包的创建2&#xff09;ROS的话题通…

可能是最强的Python可视化神器,建议一试

数据分析离不开数据可视化&#xff0c;我们最常用的就是Pandas&#xff0c;Matplotlib&#xff0c;Pyecharts当然还有Tableau&#xff0c;看到一篇文章介绍Plotly制图后我也跃跃欲试&#xff0c;查看了相关资料开始尝试用它制图。 Plotly Plotly是一款用来做数据分析和可视化的…

《商用密码应用与安全性评估》第二章政策法规2.4商用密码应用安全性评估工作

商用密码应用安全性评估体系发展历程 第一阶段&#xff1a;制度奠基期&#xff08;2007年11月至2016年8月&#xff09; 第二阶段&#xff1a;再次集结期&#xff08;2016年9月至2017年4月&#xff09; 第三阶段&#xff1a;体系建设期&#xff08;2017年5月至2017年9月&…