IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> 分布式防御系统Sentinel从应用到源码:流量控制、服务熔断、降级等 -> 正文阅读

[Java知识库]分布式防御系统Sentinel从应用到源码:流量控制、服务熔断、降级等

网页右边,向下滑有目录索引,可以根据标题跳转到你想看的内容
如果右边没有就找找左边
Sentinel
  1. 分布式防御系统。以流量为切入点,通过动态设置的流量控制、服务熔断等手段达到保护系统的目的,通过服务降级增强服务被拒后用户的体验
  2. 阿里巴巴的开源项目,提供了系统负载保护等多个维度来保障服务之间的稳定性。
历史
  1. 2012年,Sentinel诞生,主要功能为入口流量控制
  2. 2013~2017年,Sentinel在阿里巴巴集团内部迅速发展,成为基础技术模块,覆盖了所有的核心场景。Sentinel也因此积累了大量的流量归整场景以及生产实践。
  3. 2018年,Sentinel开源,并持续演进
  4. 2019年,Sentinel朝着多语言扩展的方向不断探索,推出C++原生版本,同时针对Service Mesh场景也推出了Envoy集群流量控制支持,以解决Service Mesh架构下多语言限流的问题。
  5. 2020年,推出Sentinel Go版本,继续朝着云原生方向演进。
Sentinel特征

在这里插入图片描述

  1. 丰富的应用场景:Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景,例如秒杀(即突发流量控制在系统容量可以承受范围)、消息削峰填谷、集群流量控制、实时熔断下游不可用应用等
  2. 完备的实时监控:Sentinel同时提供实时的监控功能。您可以在控制台中看到接入应用的单台机器秒级数据,甚至500台以下规模的集群的汇总运行情况。
  3. 广泛的开源生态:Sentinel提供开箱即用的与其它开源框架/库的整合模块,例如与Spring Cloud、Dubbo、GRPC的整合。您只需要引入相应的依赖并进行简单配置即可快速地接入Sentinel。
  4. 完善的SPI扩展点:Sentinel提供简单易用、完善的SPI扩展接口。您可以通过实现扩展接口来快速的定制逻辑。例如定制规则管理、适配动态数据源等。
开源生态

在这里插入图片描述

两个部分
  1. 核心库(java 客户端)不依赖任何框架和第三方库,能够运行于所有java运行时环境,同时对Dubbo/Spring Cloud等框架也有较好的支持
  2. 控制台(Dashboard)基于Spring Boot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器
基本概念
  1. 资源:是关键概念,可以是java应用程序中的任何内容,例如,有应用程序提供的服务,或由应用程序调用的其它应用提供的服务,甚至可以是一段代码。后面我们用资源来描述代码块,只要通过Sentinel API定义的代码,就是资源,能够被Sentinel保护起来,大部分情况下,可以使用方法签名,URL,甚至服务名称作为资源名来标示资源
  2. 规则:围绕资源的实时状态设定的规则,可以包括流量控制规则、熔断降级规则以及系统保护规则。所有规则可以动态实时调整。
功能和设计理念
  1. 流量控制:在网络传输中的一个常用概念,用于调整网络包的发送数据,然而,从系统稳定性角度考虑,在处理请求的速度上,也有非常多的讲究。任意时间到来的请求往往是随机不可控的,而系统的处理能力是有限的。我们需要根据系统的处理能力对流量进行控制。Sentinel作为一个调配器,可以根据需要把随机的请求调整成合适的形状
    在这里插入图片描述
  1. 设计理念(让您自由选择控制角度,并灵活组合,从而达到想要的效果),有以下几个角度
  1. 资源的调用关系,例如资源的调用链路,资源和资源之间的关系
  2. 运行指标,例如QPS、线程池、系统负载等
  3. 控制的效果,例如直接限流、冷启动、排队等。
  1. 熔断降级:除了流量控制外,及时对调用链路中的不稳定因素进行熔断也是Sentinel的使命之一。由于调用关系的复杂性,如果调用链路中的某个资源出现了不稳定,可能会导致请求发生堆积,进而导致级联错误。
  1. 当检测到调用链路中某个资源出现不稳定的表现,例如请求响应时间长或异常比例升高的时候,则对这个资源的调用进行限制,让请求快速失败,避免影响到其它的资源而导致级联故障(和Hystrix原则一致)
    在这里插入图片描述
  2. 限制手段上,和Hystrix采取完全不一样的方法
  1. Hystrix通过线程池隔离的方式,来对依赖(Sentinel中的资源)进行隔离,好处是资源和资源之间做到最彻底的隔离,缺点是增加了线程切换的成本(过多的线程池导致线程数目过多),还需要预先给各资源做线程池大小的分配。
  1. Sentinel对这个问题采取了两种手段
  1. 通过并发线程数进行限制:和资源池隔离不同,Sentinel通过限制并发线程数量,减少不稳定资源对其它资源的影响。这样不但没有线程切换的损耗,也不需要您预先分配线程池大小。那么当某资源不稳定,线程数逐步堆积到一定数量后,新的请求就会被拒,堆积线程完成任务后,才开始继续接收请求
  2. 通过响应时间对资源进行降级:通过响应时间来快速降级不稳定资源。当依赖的资源出现响应时间过长后,所有对改资源的访问都会被直接拒绝,直到过了指定的时间窗口后才重新恢复。
  1. 系统自适应保护:Sentinel同时提供系统维度的自适应保护能力。防止雪崩,是系统防护中重要的一环。当系统负载较高时,如果还持续让请求进入,可能会导致系统崩溃,无法响应。集群环境下,网络负载均衡会把本应当前机器承载的流量转发到其它机器上,如果这个时候其它机器也处于濒临崩溃的状态,此时Sentinel的对应保护机制将会发挥作用。让系统的入口流量和系统的负载达到一个平衡,保证系统在能力范围之外处理最多的请求
主要工作机制
  1. 对主流框架提供适配或者显示API,来定义需要保护的资源,并提供设施对资源进行实时统计和调用链路分析
  2. 根据预设的规则,结合对资源的实时统计信息,对流量进行控制,同时,Sentinel提供开放的接口,方便您定义及改变规则
  3. Sentinel提供实时的监控系统,方便快速了解目前系统的状态

一、快速入门案例

1. 创建父工程,引入依赖(设置父工程< packaging >pom</ packaging>)

在这里插入图片描述

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <spring-cloud.version>Hoxton.SR8</spring-cloud.version>
        <springboot.version>2.3.2.RELEASE</springboot.version>
        <springcloudalibaba.version>2.2.4.RELEASE</springcloudalibaba.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${springboot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${springcloudalibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
2. 创建子模块sentinel-test 引入依赖,做相关配置
  1. 引入依赖
    在这里插入图片描述
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-core</artifactId>
        </dependency>
    </dependencies>
  1. 配置文件
    在这里插入图片描述
server:
  port: 80
  servlet:
    context-path: "/"
  1. 启动类
    在这里插入图片描述
3. 定义规则和使用限流规则,然后测试

在这里插入图片描述

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
import java.util.ArrayList;

@RestController
public class SentinelController {

    /**
     * 定义限流规则
     * PostConstruct 构造方法执行完成后执行方法 定义和加载限流规则
     */
    @PostConstruct
    public void initFlowRules(){
        ArrayList<FlowRule> flowRules = new ArrayList<>();//定义限流规则集合
        FlowRule flowRule = new FlowRule();//定义限流规则
        flowRule.setResource("HelloWorld");//定义限流资源
        flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);//定义限流规则类型
        flowRule.setCount(2);//定义QPS阈值 每秒最多通过的请求个数
        flowRules.add(flowRule);//添加规则到集合
        FlowRuleManager.loadRules(flowRules);//加载规则集合
    }

    @RequestMapping("helloWorld")
    public String helloWorld(){
        try(Entry entry = SphU.entry("HelloWorld")){//使用限流规则HelloWorld
            return "Sentinel "+System.currentTimeMillis();
        }catch (Exception e){
            e.printStackTrace();
            return "系统繁忙,请稍后!";//降级处理
        }
    }
}

二、Sentinel dashboard控制台

  1. 流量控制、熔断降级规则统一配置和管理入口,它为用户提供了机器自发现、簇点链路自发现、监控、规则配置等功能。在Sentinel控制台上,我们可以配置规则并实时查看流量控制效果。

1. 控制台

下载地址:https://github.com/alibaba/Sentinel/releases

在这里插入图片描述

通过cmd运行jar包启动,然后访问web页面,用户名密码都是sentinel

在这里插入图片描述

//这里通过-Dserver.port=8080指定端口为8080,你可以指定成其它
java -Dserver.port=8080 -Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-dashboard -jar sentinel-dashboard.jar

在这里插入图片描述

2. java接入控制台

1. 引入依赖jar

在这里插入图片描述

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-transport-simple-http</artifactId>
    <version>1.8.0</version>
</dependency>
2. IDEA配置JVM启动参数

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

// -Dcsp.sentinel.dashboard.server=localhost:8080 指定控制台地址和端口
// -Dproject.name=sentinel-helloWorld 设置控制台上显示的项目名称
-Dcsp.sentinel.dashboard.server=localhost:8080 -Dproject.name=sentinel-helloWorld
3. 重启项目,测试

在这里插入图片描述

3. 设置限流规则

  1. 之前我们设置规则,是通过代码设置,不方便修改和维护,推荐使用Sentinel控制台设置规则
操作步骤

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

4. 定义资源(推荐使用注解方式,掌握抛异常,布尔值,其它了解一下即可)

  1. 资源可以是任何东西,服务、服务里面的方法,甚至一段代码,使用Sentinel来进行资源保护,主要步骤如下:
  1. 定义资源
  2. 定义规则
  3. 检验规则是否生效
  1. 先把可能需要保护的资源定义好(埋点),之后再配置规则,也可以理解为,只要有了资源,我们就可以在随时灵活地定义各种流量控制规则。在编码的时候,只需要考虑这个代码是否需要保护,如果需要保护,就将之定义为一个资源。对于主流框架,我们提供适配,只需要按照适配中的说明配置,Sentinel就会默认定义提供的服务,方法等资源。
方法一:主流框架的默认适配
  1. 为了减少开发复杂度,大部分主流框架(Web Servlet,Dubbo,Spring Cloud,gRPC、Spring WebFlux、Reactor等)都做了适配,只需要引入对应的依赖即可方便的整合Sentinel。
方法二:抛异常的方式定义资源(就是入门案例中使用的)
  1. SphU包含了try-catch风格的API。这种方式,当资源发生了限流之后会抛出BlockException。这时可以捕捉遗产,进行限流之后的逻辑处理,具体参考快速入门案例中的controller
  2. 通过SphU.entry(“资源名”)方法,定义资源。若entry的时候传入热点参数,那么exit的时候也移动要带上对应参数(exit(count,args)),否则会统计错误。
  3. 可通过Tracer.trace(ex) 来统计异常信息
方法三:返回布尔值方式定义资源
  1. SphO提供if-else风格API,用这种方法,当资源发送限流后,返回false,这时根据返回值,进行限流后逻辑处理
    在这里插入图片描述
  2. 小例子
    在这里插入图片描述
   @RequestMapping("helloWorld2")
    public String helloWorld2(){
        if(SphO.entry("HelloWorld")){
            try{
                //被保护资源代码
                return "boolean "+System.currentTimeMillis();
            }finally {
                SphO.exit();
            }
        }else{
            //降级或限流处理
            return "系统繁忙,请稍后!";
        }
    }
方法四:注解方式定义资源
  1. 通过@SentinelResource注解定义资源并配置blockHandler和fallback函数来进行限流之后的处理
  2. 需要额外依赖,提供注解以及AspectJ的扩展用于自动定义资源,处理BlockException等
    在这里插入图片描述
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-annotation-aspectj</artifactId>
            <version>1.8.0</version>
        </dependency>
  1. 配置类
    在这里插入图片描述
import com.alibaba.csp.sentinel.annotation.aspectj.SentinelResourceAspect;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class SentinelAspectConfiguration {
    @Bean
    public SentinelResourceAspect sentinelResourceAspect(){
        return new SentinelResourceAspect();
    }
}
  1. 使用注解看效果
    在这里插入图片描述
    @SentinelResource(value = "HelloWorld",blockHandler = "blockHandlerForHelloWorld3")
    @RequestMapping("helloWorld3")
    public String helloWorld3(){
        return "SentinelResource" + System.currentTimeMillis();
    }

    /**
     * 源方法被限流/降级/系统保护时调用
     */
    public String blockHandlerForHelloWorld3(BlockException e){
        e.printStackTrace();
        return "系统繁忙,请稍后!";
    }
方法五:异步调用支持
  1. Sentinel支持异步调用链路统计。在异步调用中,需要通过SphU.asyncEntry(xxx)方法定义资源,并通常需要在异步的回调函数中调用exit方法。
  2. 启动类添加注解@EnableAsync,让项目支持异步调用支持
    在这里插入图片描述
  3. 创建AsyncService异步调用类以及方法
    在这里插入图片描述
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class AsyncService {
    @Async
    public void doSomethingAsync(){
        System.out.println("async start...");
        try{
            Thread.sleep(4000);
        }catch (InterruptedException e){
            e.printStackTrace();
        }
        System.out.println("async end...");

    }
}
  1. controller测试
    在这里插入图片描述
    @Autowired
    private AsyncService asyncService;

    @RequestMapping("helloWorld4")
    public void helloWorld4(){
        AsyncEntry asyncEntry = null;
        try {
            asyncEntry = SphU.asyncEntry("HelloWorld");
            asyncService.doSomethingAsync();
        }catch (BlockException e){
            System.out.println("系统繁忙,请稍后!");
        }finally {
            if(asyncEntry!=null){
                asyncEntry.exit();
            }
        }
    }

5. 规则(了解一下即可,掌握web管理器的使用)

  1. Sentinel的所有规则,都可以在内存中动态的查询及修改,修改后立即生效。同时Sentinel也提供相关API,来定制自己的规则策略

1. 流量控制规则

  1. 原理就是监控应用流量的QPS或并发线程等指标,当达到指定的阈值时对流量进行控制,以避免被瞬时的流量高峰冲垮,从而保障应用的高可用性。
  2. 重要属性如下(Field字段,代表代码设置时的方法名):
    在这里插入图片描述
Field说明默认值
resource资源名,限流规则的作用对象
count限流阈值
grade限流阈值类型,QPS模式(1)或并发线程数模式(0)QPS模式
limitApp流控针对的调用来源default,代表不区分调度来源
strategy调用关系限流策略:直接、链路、关联根据资源本身(直接)
controlBehavior流控效果(直接拒绝/WarmUp/均速+排队等待),不支持按调用关系限流直接拒绝
clusterMode是否集群限流
限流类型
  1. QPS:每秒请求数限制
  2. 线程数:资源使用线程数限制
流控模式
  1. 直接:资源直接限流,这个就是简单的限流
  2. 关联:关联模式需要填写关联资源的路径,意为如果关联资源的流量超额之后,限流自己(自己为资源名填写的路径)
  3. 链路:如果是链路模式需要填写入口资源,限制入口资源对自己的调用
流控效果(同一个资源可以同时有多个限流规则,检查规则时会依次检查)
  1. 快速失败:默认的流控方式,当QPS超过任意规则阈值后,新请求会立即被拒绝,抛出FlowException。此方式适用于对系统处理能力确切已知的情况线下,比如通过压测确定了系统的准确水位时
  2. Warm Up:预热/冷启动方式。当系统长期处于低水位情况下,流量突然增加,直接把系统拉升到高水可能瞬间把系统压垮。通过冷启动,让通过的流量缓慢增加,在一定时间内逐渐增加到阈值上限,给冷系统一个预热的时间,避免冷系统被压垮
  3. 排队等待:严格控制请求通过的间隔时间,也让请求以均匀的速度通过,对应的是漏桶算法

2. 熔断降级规则

  1. 对不稳定资源进行熔断降级是保障高可用的重要措施之一,一个服务常常会调用别的模块,可能是远程服务、数据库、第三方API等,例如支付时远程调用支付宝,银联API。然而被依赖服务的稳定性是不能保证的,如果依赖的服务出现不稳定,请求响应时间变长,那么调用服务的方法的响应时间也会变长,线程会产生堆积,最终可能耗尽业务自身的线程池,服务本身也变得不可用
  2. 现代微服务架构都是分布式的,不同服务之间相互调用,组成复杂的调用链路,复杂链路某一环不稳定,就可能会层层级联,最终导致整个链路都不可用,因此我们需要对不稳定的弱依赖服务调用进行熔断降级,暂时切断不稳定调用,避免局部不稳定因素导致整体的雪崩。熔断降级作为保护自身的手段,通常在客户端(调用端)进行配置。
属性如下

在这里插入图片描述

Field说明默认值
resource资源名,规则的作用对象
grade熔断策略,支持慢调用比例/异常比率/异常数策略慢调用比例
count慢调用比例模式下为慢调用临界RT(超出该值记为慢调用);异常比例/异常数模式下为对应的阈值QPS模式
timeWindow熔断时长,单位s
minRequestAmount熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断5
statIntervalMs统计时长(单位ms),如60*1000代表分钟级1000ms
slowRatioThreshold慢调用比例阈值,仅慢调用比例模式有效

在这里插入图片描述

        List<DegradeRule> rules = new ArrayList<>();
        DegradeRule degradeRule = new DegradeRule();
        degradeRule.setResource("HelloWorld");
        degradeRule.setCount(10);
        degradeRule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
        degradeRule.setTimeWindow(10);
        rules.add(degradeRule);
        DegradeRuleManager.loadRules(rules);
熔断策略
  1. 慢调用比例(SLOW_REQUEST_RATIO):选择以慢调用比例作为阈值,需要设置允许的慢调用RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用,单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN),若接下来的一个请求响应时间小于设置的慢调用RT则结束熔断,若大于设置的慢调用RT则会再次被熔断
  2. 异常比例(ERROR_RATIO):当单位统计时长内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态,若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是[0.0,1.0]代表0%~100%
  3. 异常数(ERROR_COUNT):当单位统计时长内的异常数目超过阈值后会自动进行熔断,经过熔断时长后熔断器会进入探测恢复状态,若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断
  4. 注意:异常降级仅仅针对业务异常,对Sentinel限流降级本身的异常(BlockException)不生效。为了统计异常比率或异常数,需要通过Tracer.trace(ex)记录业务异常,示例如下(开源整合模块,Sentinel Dubbo Adapter,Sentinel Web Servlet Filter或@SentinelResource注解会自动统计业务异常,需要手动调用)
    在这里插入图片描述

3. 系统保护规则

  1. Sentinel系统自适应限流从整体维度对应入口流量进行控制,结合应用的Load、CPU使用率、总体平均RT、入口QPS和并发线程数等几个维度的监控指标,通过自适应的流控策略,让系统的入口流量和系统的负载达到一个平衡,让系统尽可能跑在最大吞吐量的同时保证系统整体的稳定性
目的
  1. 保证系统不被拖垮
  2. 在系统稳定的前提下,保持系统的吞吐量
    在这里插入图片描述
属性

在这里插入图片描述

Field说明默认值
highestSystemLoadload1触发值,用于触发自适应控制阶段-1(不生效)
avgRt所有入口流量的平均响应时间-1(不生效)
maxThread入口流量的最大并发数-1(不生效)
qps所有入口资源的QPS-1(不生效)
highestCpuUsage当前系统的CPU使用率(0.0~1.0)-1(不生效)
  1. 代码设置
    在这里插入图片描述
        ArrayList<SystemRule> rules = new ArrayList<>();
        SystemRule systemRule = new SystemRule();
        systemRule.setHighestSystemLoad(10);
        rules.add(systemRule);
        SystemRuleManager.loadRules(rules);

4. 来源访问控制规则

  1. 很多时候,我们需要根据调用来源来判断该次请求是否允许,这时候可以使用此功能。此功能提供黑白名单,配置白名单则只有请求来源位于白名单内时才可通过,若配置黑名单,则请求来源不在黑名单中,才能通过
  2. 调用放信息通过ContextUtil.enter(resourceName,origin)方法中的origin参数传入
规则配置

在这里插入图片描述

  1. resource:资源名,限流规则作用的对象
  2. limitApp:对应的黑名单/白名单,不同origin用逗号分隔,如appA,appB.
  3. strategy:限制模式,AUTHORITY_WHITE为白名单模式,AUTHORITY_BLACK为黑名单模式,默认白名单模式
示例:希望控制对资源test的访问设置白名单,只有来源为appA和appB的请求才可通过
        AuthorityRule authorityRule = new AuthorityRule();
        authorityRule.setResource("test");
        authorityRule.setStrategy(RuleConstant.AUTHORITY_WHITE);
        authorityRule.setLimitApp("appA,appB");
        AuthorityRuleManager.loadRules(Collections.singletonList(authorityRule));
官方示例

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

5. 热点参数规则

  1. 热点:经常访问的数据
  2. 很多时候,我们希望统计某个热点数据中访问频次最高的Top K数据,并对其访问进行限制
  1. 商品ID为参数,统计一段时间内最常购买的商品ID并进行限制
  2. 用户ID为参数,针对一段时间内频繁访问的用户ID进行限制
  1. 热点参数限流会统计传入参数的热点参数,并根据配置的限流阈值与模式,对包含特点参数的资源调用进行限流,热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。(Sentinel利用LRU策略统计最近最常访问的热点参数,结合令牌桶算法来进行参数级别的流控,热点参数限流支持集群模式)
    在这里插入图片描述
属性

在这里插入图片描述

在这里插入图片描述

        ParamFlowRule param1 = new ParamFlowRule("param1");
        param1.setParamIdx(0)
                .setCount(5);
        ParamFlowItem paramFlowItem = new ParamFlowItem().setObject(String.valueOf(param1));
        paramFlowItem.setClassType(int.class.getName())
                .setCount(10);
        param1.setParamFlowItemList(Collections.singletonList(paramFlowItem));
        ParamFlowRuleManager.loadRules(Collections.singletonList(param1));
基本使用
  1. 加入依赖
        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-parameter-flow-control</artifactId>
            <version>1.8.0</version>
        </dependency>
  1. 编写controller
    在这里插入图片描述
    @RequestMapping("helloWorld")
    public String helloWorld(){
        Entry entry = null;
        try{//使用限流规则HelloWorld
            entry = SphU.entry("HelloWorld", EntryType.IN,1, param1);
            System.out.println(param1);
            return "Sentinel "+System.currentTimeMillis();
        }catch (Exception e){
            e.printStackTrace();
            return "系统繁忙,请稍后!";//降级处理
        }finally {
            entry.exit(0,EntryType.IN,1,param1);
        }
    }

三、Spring Cloud整合Sentinel(重点)

1. 和Spring Cloud集成

  1. Spring Cloud Alibaba默认为Sentinel整合了Servlet、RestTemplate、FeignClient和Spring WebFlux,它不仅补全了Hystrix在Servlet和RestTemplate这一块的空白,还完全兼容了Hystrix在FeignClient中限流降级的用法,并支持灵活配置和调整流控规则
1. 依赖
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
        </dependency>
2. 配置文件

在这里插入图片描述

server:
  port: 80
  servlet:
    context-path: "/"

spring:
  application:
    name: sentinel_springcloud # 设置应用名称
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080 # 设置Sentinel连接控制台的主机地址和端口
3. controller

在这里插入图片描述

@RestController
public class SentinelController {

    @SentinelResource(value = "HelloWorld",blockHandler = "blockHandlerForHelloWorld3")
    @RequestMapping("helloWorld3")
    public String helloWorld3(){
        return "SentinelResource" + System.currentTimeMillis();
    }

    /**
     * 源方法被限流/降级/系统保护时调用
     */
    public String blockHandlerForHelloWorld3(BlockException e){
        e.printStackTrace();
        return "系统繁忙,请稍后!";
    }

}

2. 整合nacos实现配置持久化

  1. 前面的例子中,每次重启,客户端中数据将会消失,需要重新定义规则,因为默认是将规则放在内存
  2. 我们可以将规则保存到Nacos配置中心中,实现持久化
1. 启动nacos 添加依赖

在这里插入图片描述

        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>
2. 在nacos中定义策略

类型选择为json
在这里插入图片描述
在这里插入图片描述

[
    {
        "resource":"HelloWorld",
        "limitApp":"default",
        "grade":1,
        "count":2,
        "strategy":0,
        "controlBehavior":0,
        "clusterMode":false
    }
]
3. 配置文件中配置spring cloud和nacos中获取规则
server:
  port: 80
  servlet:
    context-path: "/"

spring:
  application:
    name: sentinel_springcloud # 设置应用名称
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8080 # 设置Sentinel连接控制台的主机地址和端口
      datasource:
        ds:
          nacos:
            server-addr: localhost:8848 # nacos 连接地址
            group-id: DEFAULT_GROUP # nacos组名,要和nacos中配置的一致
            rule-type: flow # 流控规则,rule-type配置表示该数据源中的规则属于哪种类型的规则(flow ,degrade,authority,system,param-flow,gw-glow,gw-api-group)
            data-id: sentinel-test # 读取配置文件的data-iid
            data-type: json # 读取配置文件类型
4. 重启项目看效果

在这里插入图片描述

四、源码

篇幅原因,我将其放在另一篇文章,请参考https://blog.csdn.net/grd_java/article/details/119819705
  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-08-21 15:13:47  更:2021-08-21 15:15:57 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 0:18:31-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码