Sentinel

Sentinel

1.什么是Sentinel

Sentinel 是一个开源的流量控制组件,它主要用于在分布式系统中实现稳定性与可靠性,如流量控制、熔断降级、系统负载保护等功能。简单来说,Sentinel 就像是一个交通警察,它可以根据系统的实时流量(请求)和系统的健康状况,动态地调整系统的流量规则,避免系统因为突发的高流量而崩溃,保证系统的稳定运行。

例如,假设你有一个在线商城的系统,在大促销活动期间,系统可能会突然接收到大量的访问请求,如果处理不当,系统可能会因为负载过高而变得响应缓慢甚至崩溃。这时,Sentinel 就可以发挥作用了,它可以限制访问速率,只允许一定数量的用户请求在同一时间进行,超过限制的请求可以被排队或直接拒绝,以此来保护系统不被过载。

总的来说,Sentinel 的目的是通过实时监控系统的流量和状态,动态地进行流量控制和服务降级,从而保证系统的高可用性和稳定性。

2.Sentinel的主要功能

1.流量控制
说明:就像是水坝控制水流一样,Sentinel 可以控制系统的请求流量,确保系统不会因为流量过大而崩溃。
场景:比如双十一期间,电商平台的订单系统可能会接收到海量订单请求,通过流量控制,Sentinel 可以限制每秒处理的订单数量,避免系统崩溃。

2.熔断降级
说明:当系统某部分出现问题,可能会拖垮整个系统。熔断降级就像是紧急刹车,暂时停用某些功能,保证系统的主体还能正常运行。
场景:如果一个在线视频网站的推荐服务出现故障,Sentinel 可以暂时关闭推荐功能,而不是让整个视频网站瘫痪,用户仍然可以搜索和观看视频。

3.系统负载保护
说明:保护系统不会因为过载(如CPU使用率过高)而崩溃,类似于电路中的过载保护器。
场景:在一个天气预报应用中,如果因为极端天气导致查询请求激增,超出了服务器的处理能力,Sentinel 可以限制请求量,保护系统不被过载。

4.热点参数限流
说明:对于频繁访问的“热点数据”,可以进行特别的流量控制,就像超市的促销区会特别安排工作人员维持秩序。
场景:在电商平台上,对于某个热门商品的购买请求可能会集中爆发,Sentinel 可以对这个商品的购买请求进行特别限流,保证服务器稳定。

5.授权规则
说明:根据请求来源(如IP地址)决定是否允许请求,类似于门卫根据身份决定是否让人进入。
场景:一个公司内部的管理系统,可以设置仅允许公司内部网络的请求访问,外部的任何请求都不允许,保证系统安全。

3.为什么需要Sentinel

1.防止雪崩效应:当某个服务器故障的时候,传统的做法是让请求一直等待,直到服务恢复正常,然而,这可能导致请求积压,进而导致其他服务也出现故障,最终形成雪崩效应,Sentinel可以通过熔断机制,及时返回错误信息,避免连锁故障。
2.流量控制:在高并发场景下,如果系统突然收到大量请求,可能会导致系统过载,影响正常的服务,Sentinel可以通过流量控制机制,限制并发请求的数量,确保系统的可用性和稳定性。
3.保护系统稳定性:在微服务架构中,多个服务之间互相依赖,一个服务的故障可能导致整个系统的崩溃,Sentinel可以对请求进行流量控制和熔断,避免由于某个服务器的故障导致整个系统不可用。

4.Sentinel基本概念

4.1什么是流量控制

流量控制是指对系统中的流量进行限制和请求,以确保在承受能力范围内正常运行

4.2流量控制算法

  1. 计数器流量控制算法
    解释:这个算法就像是超市入口的计数器,限定在一定时间内只允许一定数量的顾客进入。每当有顾客进入时,计数器就加一;时间到了后,计数器清零重新开始。
    例子:一个网站设置了每分钟只能处理100个请求。如果这一分钟有101个请求,当第101个请求在同一分钟内到来时,系统会拒绝这个请求,直到下一分钟开始;如果不到100个请求的话,这一分钟时间到了之后,计数器就清零,然后重新计数。
  2. 漏桶流量控制算法
    解释:想象一个水桶有一个固定速度的漏洞,无论向桶内倒水的速度多快,桶里的水只能通过漏洞以固定的速度流出。这个算法用于平滑流量,使得处理请求的速率保持恒定。
    例子:一个服务器被设置为每秒只能发送10个数据包。即使在某一刻服务器收到了一大批数据包,它也只会以每秒10个包的速率发送这些数据包,多余的数据包会在“桶”里排队等待处理。
  3. 令牌桶流量控制算法
    解释:令牌桶算法更加灵活。系统会以恒定的速度往桶里添加令牌,每个请求处理前都需要从桶里取出一个令牌。如果桶里没有令牌,请求就需要等待。但是,桶里可以存储令牌,允许短时间内处理大量请求,只要有足够的令牌。
    例子:一个API限制每秒可处理10个请求,但是它可以处理突发的20个请求,只要之前有足够的令牌积累在桶里。如果有一瞬间来了20个请求,系统可以处理这20个请求,但之后在没有足够令牌的情况下,新的请求就需要等待令牌的生成。

4.3流量控制角度

Sentinel流量控制主要有以下几个角度:
1.资源的调用关系,例如资源的调用链路,资源和资源之间的关系
2.运行指标,例如(QPS—每秒查询数)、线程池、系统负载等。
3.控制的效果:例如直接限流、冷启动、排队等
Sentinsl的设计理念是这三个角度自由选择,根据需求灵活的组合,来达到想要的目的
在这里插入图片描述
流控效果如下:
1.快速失败:这种方式是默认的流量控制方式,比如QPS超过任意规则的阈值之后,新的请求就会被立即拒绝,拒绝方式为抛出FlowException。这种方式适用于对系统处理能力确切已知的情况下,比如通过压测确定了系统的准确水位的时候。
2.Warm up :此项叫做预热/冷启动 方式,此模式主要是防止流量突然增加时,直接把系统的流量拉升到一个很高的程度,直接让系统垮了,通过冷启动,让通过的流量缓慢的增加,在一定的时间内逐渐增加到阈值上限,给系统一个预热的时间,避免直接被压垮。
3.排队等待(也叫匀速通过):排队等待会严格控制请求通过的间隔时间,让请求稳定且匀速的通过,可以用来处理间隔性突发的高流量。比如抢票软件,在某一秒内有大量的请求到来,而接下来的一段时间里处于空闲状态,我们希望在接下来的空闲时间里也能出去这些请求,而不是直接拒绝,让他们排队等待。在设置排队等待的时候,需要填写超时时间。

4.3什么是熔断

Sentinel 熔断是指在分布式系统中,为了防止系统雪崩,当某个微服务的错误率或响应时间超过预设的阈值时,自动停止对该服务的调用的机制。Sentinel 是阿里巴巴开源的面向分布式服务架构的高可用性保障组件,主要功能包括流量控制、熔断降级和系统负载保护等。
在微服务架构中,服务间的依赖错综复杂,任何一个服务的不稳定或失败都可能引起连锁反应,导致整个系统的不可用。熔断机制的引入,就是为了避免这种连锁反应,当检测到调用服务的失败率或延迟超过一定的阈值时,自动切断对该服务的调用,触发熔断,同时可能会提供一个备用方案(如返回一个默认值或调用一个备用服务),直到该服务恢复正常。

Sentinel 实现熔断主要有以下几种策略:
在这里插入图片描述

1.慢调用比例策略:当资源的平均响应时间超过阈值(如200ms),并且在一段时间内(如最近1分钟)的慢调用比例超过设定的比例(如50%),则对该资源进行熔断。
2.异常比例策略:当资源在一段时间内的异常比例超过设定的阈值(如50%),则对该资源进行熔断。
3.异常数策略:当资源在一段时间内的异常数超过设定的阈值,则对该资源进行熔断。
Sentinel 熔断的目的是通过对不稳定服务的及时隔离,保护系统的整体稳定性,同时也给出现问题的服务一个自我恢复的机会。一旦服务熔断后,Sentinel 会进入一个时间窗口,在这个时间窗口内部分请求(根据预设规则)仍然会尝试执行,如果这些尝试请求成功,则服务可能会从熔断状态恢复。这个过程称为“半开”状态,是为了探测服务是否已经恢复正常。

熔断的原理是通过对服务的监控和评估,根据一定的规则来判断服务的健康状况。当服务的错误率或者响应时间过设定的闻值时,熔断器会触发,并将后续的请求讯速拦截或者返回错误信息,而不是继续调用该服务,从而避免由于故障服务的长时间不可用或者响应过慢而导致整个系统的延迟或者崩溃。
容断机制的好外是能够快速失败并返回错误信息,避免资源的浪费和系统的连锁故障。当服务恢复正常时,熔断会逐渐放行请求,验证服务的可用性,确保系统逐渐恢复正常运行。
熔断通常与流量控制等其他机制结合使用,以加强系统的稳定性和可靠性。它可以降低系统的依赖性,提高系统容错能力,对于大规模分布式系统来说尤为重要。

4.4Sentinel组成

Sentinel中有两个重要的组件:资源和规则
1.资源:Sentinel中被保护的对象,可以是方法,接口,url等
2.规则:对资源的访问策略,包括限流,熔断,热点等。规则包含以下这些:
2.1限流规则:基于不同的模式对流量进行控制,可以直接拒绝,等待等。
2.2熔断规则:异常情况下进行熔断降级。
2.3热点规则:对热点数据进行针对性的流量控制。
2.4授权规则:对调用方进行黑白名单的限制。
2.5系统保护规则:基于CPU、负载、整体QPS、线程数等多个指标进行自适应的流量控制

5.Sentinel代码实现

在这里插入图片描述

import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException;
import com.alibaba.csp.sentinel.slots.block.flow.FlowException;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.swing.text.html.parser.Entity;
import java.util.Random;

@RequestMapping("/user")
@RestController
public class UserController {
    @RequestMapping("/getid")
    public String getId(){
    //Entry entity= SphU.entry("getid")是定义一个资源名叫getid
        try(Entry entity= SphU.entry("getid")){
            return "ID:"+new Random().nextInt(100);
        } catch (BlockException e) {
            return "被限制";
        }
    }

	//下面的SentinelResource注解也是定义一个资源叫getname,当熔断或者限流的时候触发myBlockHandler方法
    @SentinelResource(value="getname",blockHandler = "myBlockHandler")
    @RequestMapping("/getname")
    public String getName() throws InterruptedException {
        Thread.sleep(50);
        return "Name:"+new Random().nextInt(100);
    }

    public String myBlockHandler(BlockException blockException){
        if ((blockException instanceof FlowException)){
            return "您被限流了";
        } else if (blockException instanceof DegradeException) {
            return "您被熔断了";
        }else {
            return "被限制了";
        }
    }
}
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRule;
import com.alibaba.csp.sentinel.slots.block.degrade.DegradeRuleManager;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleComparator;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

import java.util.ArrayList;
import java.util.List;

@SpringBootApplication
public class SentinelTestApplication {

    public static void main(String[] args) {
        SpringApplication.run(SentinelTestApplication.class, args);
        initDegradeRules();
        //initFlowRules();
    }
    //熔断规则设置
    public static void initDegradeRules(){
        List<DegradeRule> degradeRules=new ArrayList<>();
        DegradeRule degradeRule=new DegradeRule();
        degradeRule.setResource("getname");
        degradeRule.setGrade(RuleConstant.DEGRADE_GRADE_RT);
        //一秒内的所有请求,如果有百分之五十的请求时间超过10毫秒,就触发熔断
        //并且当请求数量到1的时候就考虑熔断
        degradeRule.setCount(10);
        degradeRule.setStatIntervalMs(1000);
        degradeRule.setSlowRatioThreshold(0.5);
        degradeRule.setMinRequestAmount(1);
        degradeRules.add(degradeRule);
        DegradeRuleManager.loadRules(degradeRules);
    }
	//限流规则设置
    public static void initFlowRules(){
        List<FlowRule> flowRules=new ArrayList<>();
        FlowRule flowRule=new FlowRule();
        flowRule.setResource("getname");
        //每秒请求超过一次了,就限流
        flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        flowRule.setCount(1);
        flowRules.add(flowRule);
        FlowRuleManager.loadRules(flowRules);
    }
}

6.Sentinel界面

1.先在代码引入sentinel依赖

 <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2.配置你的配置文件

spring:
  application:
    name: sentinel-dashboard-demo # sentinel界面的资源名字
  cloud:
    sentinel:
      transport:
        dashboard: localhost:8089 #你在浏览器输入localhost:8089就能访问sentinel界面
        client-ip: 127.0.0.1  
        port: 8721   # 你的springboot项目连接sentinel的端口
        heartbeat-interval-ms: 10000  # 你的springboot项目每隔10秒就跟sentinel界面发一次心跳包,确保是正常的

3.写端代码
在这里插入图片描述

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Random;

@RestController
@RequestMapping("/user")
public class UserController {
    @RequestMapping("/getid")
    public String getID(){
        return "ID:"+new Random().nextInt(100);
    }
    @RequestMapping("/getname")
    public String getName(){
        return "Name:"+new Random().nextInt(10000,20000);
    }
}

4.这时候你进入你的sentinel界面啥也没显示,因为你没访问你的资源呢
比如你访问localhost:8080/user/getname,然后再刷新你的sentinel界面,就会有显示了,如下图
在这里插入图片描述
5.然后你就可以玩你的sentinel了

7.sentinel界面简单叙述

7.1实时监控

在这里插入图片描述
Sentinel Dashboard 的实时监控功能用于展示服务的实时运行数据。它能够提供以下几种监控信息:
1.资源的QPS(Query Per Second):这是每秒请求量的指标,显示每秒钟有多少次对某个资源的请求。
2.资源的线程数:这显示了当前处理资源请求的线程数量。
3.资源的响应时间:这显示了资源响应请求的平均时间。
4.通过的请求:这表示资源在单位时间内成功处理的请求数量。
5.被拒绝的请求:这表示由于规则(例如流量控制规则)导致的请求被拒绝的数量。
6.成功的请求:这表示请求被成功执行并返回了预期结果的数量。

实时监控非常重要,因为它可以帮助系统管理员或开发者:
1.观察系统健康状态:实时监控可以即时反映系统的运行状况,帮助识别系统是否正常运行。
2.快速定位问题:如果出现问题,如服务不可用或响应缓慢,实时监控可以帮助快速定位是哪个资源出现了问题。
3.调整规则:根据实时监控的数据,管理员可以及时调整Sentinel的规则配置,如调高或调低流量控制的阈值。
4.性能分析:通过分析实时数据,可以对系统性能进行评估,进而优化系统配置或资源分配。
通过实时监控,可以实现对系统流量和状态的即时可视化,这对于微服务架构和分布式系统的稳定性和可靠性至关重要。

7.2簇点链路

在这里插入图片描述
在 Sentinel 中,“簇点链路”(Cluster Node Chain)功能是用来展示微服务中各个资源(比如接口、服务等)的调用链路情况的。簇点链路可以帮助用户了解在整个微服务架构中,请求是如何流转的,以及在这个过程中各个资源的性能和健康状况。
具体来说,"簇点链路"可以提供以下信息:
1.资源的调用关系:显示服务中各个资源是如何相互调用的,帮助用户理解服务间的依赖关系。
2.资源的统计数据:提供每个资源的QPS、响应时间、异常数等关键指标,这些数据通常会在不同的时间粒度(如秒、分钟)上进行聚合。
3.调用链的流量控制:用户可以基于调用链的信息设置流量控制规则,比如针对某个服务的特定入口或出口进行限流。

通过簇点链路的监控,用户可以对系统的调用链路有一个直观的认识,这对于发现和解决问题、优化系统架构和提升系统的稳定性和性能都非常有帮助。例如,如果某个服务的调用链路上的某个节点出现了高延迟或高错误率,用户可以通过簇点链路的信息快速定位到这个节点,并采取相应的措施来处理。

7.3流控规则

在这里插入图片描述
1.资源名:就是你定义的资源的名字
2.针对来源:默认是default,你可以设置,default就是所有来源,只要达到限流要求了,都限流
3.阈值类型
QPS:每秒的请求数量
并发线程数:一共有多少线程一起执行
4.单机阈值:它定义了一个服务实例在一定时间窗口内能够通过的最大请求量(QPS)或者并发数
QPS(每秒请求数):
当流控模式设置为QPS时,单机阈值表示的是每秒钟允许的最大请求数。
例如,如果单机阈值被设置为100,那么超过这个数值的请求在一秒内将被限流(即部分请求会被拒绝或排队等待)。
并发线程数:
当流控模式设置为线程数时,单机阈值表示的是允许同时处理的最大线程数。
例如,如果单机阈值被设置为10,那么当有10个请求正在处理时,任何新的请求都会被限流。
5.流控模式:
直接::直接模式指的是对资源直接进行流量控制,而不考虑资源的调用来源。这意味着,无论请求是从哪里发起的,只要请求量达到了设定的阈值,就会触发流量控制规则。
举例说明:
假设你有一个提供天气信息的接口 /getWeather,你为这个接口设置了一个直接模式的流控规则,单机阈值设为每秒100次请求(QPS=100)。
在这种配置下,当任何来源对 /getWeather 接口的请求速率超过了每秒100次,Sentinel 就会根据预定的流量处理策略(比如直接拒绝、冷启动、排队等待)来处理超出阈值的请求。这里的“任何来源”可以是单个用户、一组用户或者其他服务的调用。
关联: 关联是指当一个资源的流量达到阈值时,可以限制另一个关联资源的流量。这通常用于当两个资源之间存在生产者-消费者关系或者强关联时。
举例:假设你有一个视频网站,用户在看视频的同时可以发评论。你的两个资源是:
看视频(resourceA)
发评论(resourceB)
如果视频播放(resourceA)的流量非常高,可能会导致服务器压力增大,进而影响到发评论(resourceB)的性能。在这种情况下,你可以设置一个规则,关联这两个资源。例如,当视频播放(resourceA)的QPS(每秒查询率)超过100时,即使发评论(resourceB)的流量本身并未达到流控阈值,也会被限流。这就是说,resourceB的流量会受到resourceA流量的影响。
链路: 链路是指在一条调用链路中,对某个资源的限流。这在微服务架构中特别有用,当一个服务调用链中的某个服务节点变得拥挤时,可以对其进行限流。
想象一下,你正在参加一个音乐节。在这个音乐节上,有一个入口通道,通往两个不同的舞台区:A 舞台和 B 舞台。
入口通道 相当于是用户服务。
A 舞台区 相当于是订单服务。
B 舞台区 相当于是库存服务。
现在,假设 A 舞台区非常受欢迎,有太多人想要进入这个区域,以至于可能会造成过度拥挤甚至安全问题。B 舞台区也很受欢迎,但是人流相对平稳,没有安全顾虑。在这种情况下,音乐节的组织者需要限制人们进入 A 舞台区的数量,以确保安全和舒适。但是,他们并不希望这会影响到想要去 B 舞台区的观众。如果使用普通的流量控制方法(没有链路限流),他们可能只能告诉入口的保安简单地减少让人进入的速率,这样就会同时减少去 A 舞台和 B 舞台的观众,即使 B 舞台可以接纳更多人。但是如果使用链路限流,组织者可以更加精确地控制。他们可以对想要去 A 舞台的观众单独排队,并对这个队伍进行限流。这样,去 B 舞台的观众就不会受到影响,他们可以正常进入自己的目的地。
在微服务架构中,链路限流工作原理相似:
你有一系列服务,某些服务非常受欢迎,流量非常大,可能会影响到这些服务的性能。
你不希望因为一个服务的高流量影响到整个系统,特别是那些没有受到高流量影响的服务。
通过链路限流,你可以只限制到特定服务的流量,而不影响到整个系统的其他部分。
在Sentinel中,如果你对“订单服务->库存服务”的链路设置了限流规则,即使订单服务的请求量很大,也不会影响到其他服务对库存服务的调用。这样可以防止因为订单服务的高负载导致库存服务不可用,从而保证其他功能的正常运行。
6.流控效果
快速失败: 快速失败是最简单的流量控制效果。当请求达到设定的阈值时,所有超出阈值的请求会立即被拒绝,不会进行任何排队或等待。这种策略适用于那些对响应时间敏感的场景,可以迅速告知调用者请求被限流,避免系统过载。
Warm Up: 它允许流量逐渐增加,从较低的阈值开始,经过预定时间逐步增加到设定的稳定阈值。这种策略通过预热的方式防止系统在瞬间承受大流量而导致崩溃。
排队等待: 排队等待策略允许超出阈值的请求在配置的时间窗口内排队等待,而不是直接拒绝。这种策略可以平滑流量峰值,为每个请求提供公平的处理机会,但可能会增加请求的响应时间。
Warm Up 的预热时长: 预热时长指的是系统从较低的流量阈值逐渐增加到设定的稳定流量阈值所需的时间。这个机制是为了防止系统在短时间内突然接收到大量请求而导致崩溃。在预热期间,流量阈值会从一个较低的值开始,随着时间的推移逐渐增加,直到达到配置的正常阈值。这个过程就像是给系统一个“预热”的时间,让它有机会在承受全量流量之前逐步调整和准备。
举例:如果设置了10分钟的预热时长,那么系统会在这10分钟内逐渐从低流量增加到正常流量水平,而不是突然承受全部流量。
排队等待的超时时间: 排队等待的超时时间是指请求在排队等待处理时的最长等待时间。在流量超过阈值时,请求会被放入等待队列中,如果在超时时间内请求还未被处理,则该请求会被拒绝。这个参数是为了确保系统在高流量情况下不会让请求无限期地等待,从而可以在一定程度上控制系统的响应时间和用户体验。
举例:如果设置了排队超时时间为500毫秒,那么当请求因为流量控制被排队时,如果500毫秒内请求没有被处理,则请求将会被拒绝。

7.4熔断规则

在这里插入图片描述
1.熔断策略:
慢调用:
定义:当资源的每次调用响应时间超过预设的阈值,并且在一定的时间窗口内这种慢调用的比例超过了设定的比例时,触发熔断。
举例:在这里插入图片描述
当某个资源在最近1000毫秒内有5以上的请求,且其中超过200毫秒响应时间的请求比例达到或超过50%,则该资源会进入熔断状态,持续3秒钟。

异常比例:
定义:在一定的时间窗口内,资源调用出现异常的比例超过设定的阈值时,触发熔断。
举例:在这里插入图片描述
如果在最近1000毫秒内某个资源接收到5次以上请求,并且这些请求中有超过50%发生了异常,则该资源将被熔断,熔断状态将持续3秒。

异常数:
定义:在一定的时间窗口内,资源调用出现的异常数超过设定的阈值时,触发熔断。
举例:
在这里插入图片描述
在1000毫秒内,如果收到了五次以上的请求,并且这些请求中的异常数量达到了三个,就进行熔断,熔断时间为3秒

7.5热点规则

在这里插入图片描述
热点规则限流是 Sentinel 提供的一种流量控制机制,它主要用于对频繁访问的“热点”数据进行保护。不同于普通的流量控制只关注总的请求量,热点参数限流能够根据请求的参数值进行细粒度的流量控制。这对于防止某些特定参数值导致的流量集中爆发非常有效,可以更精确地保护系统资源。让我尝试用一个更简单的例子来解释。
热点参数限流的工作原理:
假设你有一个电商网站的商品详情页面,用户通过商品ID来查询商品信息。在大多数时间里,商品的访问量分布是均匀的。但是,在某些特殊情况下(比如某个商品正在进行促销活动),大量用户可能会同时查询这个商品的详情,这就形成了一个“热点”。
如果不加以控制,对这个热点商品的大量查询请求可能会对后端系统造成巨大压力,甚至导致服务崩溃。热点参数限流就是为了解决这类问题而设计的。它允许你基于方法调用的参数值(在这个例子中是商品ID)来设置流量控制规则。
**参数索引:**指定了哪个参数被用作热点参数。索引是基于方法调用的参数位置,从 0 开始。
如果我的参数索引是1,单机阈值是1,统计窗口时长也是1,意思就是
系统将对第二个参数进行监控,当任何具体的参数值在1秒内的请求次数超过1次时,超出的请求会被限流

参数例外项: 在 Sentinel 的热点参数限流中,允许你为特定的参数值设置不同的流量控制阈值。这意味着,尽管你为某个参数设定了一个通用的流量限制规则,但你可以指定一些例外情况,为这些例外的参数值设置特殊的阈值,这些特殊阈值可以高于或低于通用规则的阈值。
假设参数类型为商品ID(String类型),参数值设为"12345",限流阈值设为200次/秒。这意味着对于商品ID为“12345”的查询请求,即使通用的热点参数限流规则设置了更低的阈值,它仍然可以每秒接收最多200次请求,而不会被限流。
在 Sentinel 的热点参数限流中,"参数类型"实际上是由你的方法定义决定的,并不是在热点规则配置中直接指定的。当你设置热点参数限流规则时,你需要指定哪一个方法参数(通过参数索引)将被用来作为热点参数进行流量控制。这里的“参数类型”指的是你的方法中对应参数的数据类型,比如字符串(String)、整数(int)等。因此,你不能在参数类型中随意填写内容,它必须与你想要控制流量的方法参数的实际数据类型相匹配。例如,如果你的方法是getProductDetails(String productId),并且你决定使用 productId 作为热点参数进行限流,那么这里的参数类型就是 String,因为 productId 是一个字符串类型。在配置参数例外项时,你需要根据这个参数的具体值来设置例外规则,比如为特定的 productId 设置不同的流量阈值。所以,"参数类型"实际上是由你的代码和方法签名决定的,而不是通过配置直接指定的。
热点规则只在控制台配置是不生效的,需要在代码中配合@SentinelResource一起使用才行

7.6系统规则

·在这里插入图片描述

Sentinel 的系统规则(System Rule)用于根据系统的整体负载情况来触发流量控制,以保护系统不被过载。系统规则不针对某个具体的资源,而是基于整个应用的运行状况来进行限流。系统规则的参数包括:

  1. LOAD(系统负载)
    参数赋值:1.0
    含义:当系统的平均负载超过1.0时,触发规则进行流量控制。系统平均负载表示在过去一分钟内,系统中处于运行状态和不可中断睡眠状态的平均进程数。
    负载值为 1.0:对于单核CPU系统而言,1.0 的负载意味着CPU完全被利用,没有空闲时间。对于多核CPU系统,比如有 4 核心,那么 1.0 表示四分之一的核心被完全使用。
  2. RT(平均响应时间)
    参数赋值:1000毫秒
    含义:当所有入口流量的平均响应时间超过1000毫秒时,触发流量控制。这是一个衡量系统处理请求效率的指标。
  3. 线程数
    参数赋值:200
    含义:当系统的并发线程数超过200时,触发流量控制。这个参数直接关联到系统能够同时处理的最大请求量。
  4. 入口QPS(每秒查询量)
    参数赋值:100
    含义:当每秒的总请求量超过100时,触发流量控制。这个参数用于直接限制进入应用的请求速率。
  5. CPU使用率
    参数赋值:0.4
    含义:当CPU使用率达到40%时,触发流量控制。这是系统负载的一个绝对阈值,超过这个值说明系统可能已经过载。

7.7授权规则

在这里插入图片描述

Sentinel 的授权规则(Authorization Rule)是一种流量控制策略,用于根据来源应用来控制资源的访问。这种机制允许你细粒度地管理哪些应用可以访问哪些资源,进而保护系统资源不被滥用。
**资源名:**需要被保护和控制访问的资源标识。
**流控应用:**指定哪些应用(或来源)受到流量控制规则的限制。
**授权类型:**定义了授权规则的类型,通常包括白名单(允许列表)和黑名单(拒绝列表)。
赋值示例:
资源名:ProductDetailsService
流控应用:OrderService
授权类型:白名单
对于名为ProductDetailsService的资源,仅允许来自OrderService应用的请求访问,采用白名单策略进行授权限制。

这意味着,只有OrderService应用可以访问ProductDetailsService资源,其他任何不在白名单中的应用都无法访问该资源,从而实现了基于来源的访问控制。这种方式非常适用于微服务架构中,当你想要限制某些服务之间的直接交互,确保系统的稳定性和安全性。

  • 21
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值