SpringCloud Alibaba-Sentinel保姆级教程

news2024/11/25 11:04:41

文章目录

  • 1、Sentinel前奏
    • 1.1、服务雪崩效应
    • 1.2、常见容错方案
      • 1、隔离
      • 2、超时
      • 3、限流
      • 4、熔断
      • 5、降级
    • 1.3、常见容错组件
      • 1、Hystrix
      • 2、Resilience4J
      • 3、Sentinel
  • 2、Sentinel入门
    • 2.1、什么是Sentinel
    • 2.2、实战编码
      • 1、安装Sentinel服务端
      • 2、微服务引入Sentinel
    • 2.3、Sentinel流控模式
      • 1、直接
      • 2、关联
      • 3、链路
    • 2.4、Sentinel流控效果
      • 1、快速失败
      • 2、Warm Up预热
      • 3、排队等待
    • 2.5、热点规则
      • 1、参数限流
      • 2、参数值限流
    • 2.6、系统规则
      • 1、配置全局限流规则
  • 3、Sentinel服务熔断
    • 3.1、编码实战
      • 1、资源熔断降级
      • 2、配置降级策略
    • 6.3、降级策略
      • 1、平均响应RT
      • 2、异常比例
      • 3、异常数
    • 6.4、OpenFeign兼容Sentinel
      • 1、添加依赖
      • 2、开启Sentinel
      • 3、Feign接口降级
      • 4、测试
  • 4、Sentinel和Hystrix区别
  • 总结

1、Sentinel前奏

1.1、服务雪崩效应

  1. 在分布式系统中,由于网络原因或自身的原因,服务一般无法保证 100% 可用
  2. 如果一个服务出现了问题,调用这个服务就会出现线程阻塞的情况,此时若有大量的请求涌入,就会出现多条线程阻塞等待,进而导致服务瘫痪
  3. 由于服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是雪崩效应

如下图所示:

在这里插入图片描述

  • 雪崩发生的原因多种多样,有不合理的容量设计,或者是高并发下某一个方法响应变慢,亦或是某台机器的资源耗尽
  • 我们无法完全杜绝雪崩源头的发生,只有做好足够的容错,保证在一个服务发生问题,不会影响到其它服务的正常运行
  • 也就是雪落而不雪崩

1.2、常见容错方案

要防止雪崩的扩散,就要做好服务的容错,容错说白了就是保护自己不被猪队友拖垮的一些措施, 下面介绍常见的服务容错思路和组件

常见的容错思路有隔离、超时、限流、熔断、降级等这几种,下面分别介绍一下:

1、隔离

  • 它是指将系统按照一定的原则,划分为若干个服务模块,各个模块之间相对独立,无强依赖
  • 当有故障发生时,能将问题和影响隔离在某个模块内部,而不扩散风险,不波及其它模块,不影响整体的系统服务
  • 常见的隔离方式有:线程池隔离和信号量隔离(Hystrix支持这两种隔离方式)

在这里插入图片描述

2、超时

在上游服务调用下游服务的时候,设置一个最大响应时间,如果超过这个时间,下游未作出反应,就断开请求,释放掉线程,如下图所示:

在这里插入图片描述

3、限流

  • 限流就是限制系统的输入和输出流量,以达到保护系统的目的
  • 为了保证系统的稳固运行,一旦达到的需要限制的阈值,就需要限制流量并采取少量措施以完成限制流量的目的

在这里插入图片描述

4、熔断

  • 在互联网系统中,当下游服务因访问压力过大而响应变慢或失败,上游服务为了保护系统整体的可用性,可以暂时切断对下游服务的调用
  • 这种牺牲局部,保全整体的措施就叫做熔断

在这里插入图片描述

学过Hystrix的小伙伴们应该都知道,服务熔断一般有三种状态:

在这里插入图片描述

1、熔断关闭状态(Closed)

默认是关闭状态。服务没有故障时,熔断器所处的状态,对调用方的调用不做任何限制

2、熔断开启状态(Open)

后续对该服务接口的调用不再经过网络,直接执行本地的fallback方法

3、半熔断状态(Half-Open)

尝试恢复服务调用,允许有限的流量调用该服务,并监控调用成功率。如果成功率达到预期,则说明服务已恢复,进入熔断关闭状态;如果成功率仍旧很低,则重新进入熔断关闭状态。

5、降级

降级其实就是为服务提供一个托底方案,一旦服务无法正常调用,就使用托底方案返回数据,不至于在你这个环节一直卡主

在这里插入图片描述

1.3、常见容错组件

1、Hystrix

Hystrix是由Netflflix开源的一个延迟和容错库,用于隔离访问远程系统、服务或者第三方库,防止级联失败,从而提升系统的可用性与容错性

2、Resilience4J

Resilicence4J一款非常轻量、简单,并且文档非常清晰、丰富的熔断工具,这也是Hystrix官方推荐的替代产品。不仅如此,Resilicence4j还原生支持Spring Boot 1.x/2.x,而且监控也支持和prometheus等多款主流产品进行整合

3、Sentinel

Sentinel 是阿里巴巴开源的一款断路器实现,本身在阿里内部已经被大规模采用,非常稳定强大

下面是三个组件在各方面的对比:

在这里插入图片描述

2、Sentinel入门

2.1、什么是Sentinel

  1. Sentinel (分布式系统的流量防卫兵) 是阿里开源的一套用于服务容错的综合性解决方案
  2. 它以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性
  3. Sentinel是通过限制并发线程的数量(即信号隔离)来减少不稳定资源的影响,而不是使用线程池,省去了线程切换的性能开销

Sentinel具有以下特征:

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

Sentinel分为两个部分:

  • 核心库(Java 客户端)不依赖任何框架/库,能够运行于所有 Java 运行时环境,同时对 Dubbo /Spring Cloud 等框架也有较好的支持
  • 控制台(Dashboard)基于 Spring Boot 开发,打包后可以直接运行,不需要额外的 Tomcat 等应用容器

2.2、实战编码

1、安装Sentinel服务端

Sentinel 提供了现成的服务端,https://github.com/alibaba/Sentinel/releases

这里我给大家准备好了,直接去下载即可

网盘连接:

链接:https://pan.baidu.com/s/1YJLfYmPsbii-zSHk6VWGRw

提取码:3065

OK,大家下载之后,可以通过命令行启动,使用cmd命令启动sentinel

java -jar -Dserver.port=1111 sentinel-dashboard-1.6.0.jar
  • -Dsentinel.dashboard.auth.username=sentinel: 用于指定控制台的登录用户名为 sentinel;
  • -Dsentinel.dashboard.auth.password=123456: 用于指定控制台的登录密码为 123456;如果省略这两个参数,默认用户和密码均为 sentinel
  • -Dserver.servlet.session.timeout=7200: 用于指定 Spring Boot 服务端 session 的过期时间,如 7200 表示 7200 秒;60m 表示 60 分钟,默认为 30 分钟;
  • -Dserver.port=1111:配置端口

启动成功的界面:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wghNPhrM-1666618011365)(images/image-20220213155559309-16661579811431.png)]

访问:http://localhost:1111 进入控制台,登录账号密码: sentinel/sentinel

在这里插入图片描述

注意:只有1.6.0及以上版本才有这个登录页面。

登录成功后的主页面效果如下:

在这里插入图片描述

目前还什么都没有做,所以这里是一片空白

那目前我们就将Sentinel服务端准备完毕了,接下来开始在微服务中引入Sentinel

2、微服务引入Sentinel

我们在用户服务的pom.xml中引入Sentinel:

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

然后在yml中配置Sentinel:

server:
  port: 1011
spring:
  application:
    name: user-server
  cloud:
    # sentinel相关配置
    sentinel:
      transport:
        dashboard: 127.0.0.1:1111
    nacos:
      #注册中心相关配置
      discovery:
        server-addr: 127.0.0.1:8848 #注册中心地址
      #配置中心相关配置
      config:
        server-addr: 127.0.0.1:8848 #配置中心地址
        file-extension: yaml        #配置文件格式
        prefix: application-user    #配置前缀
        group: DEFAULT_GROUP        #默认分组
  profiles:
    active: dev  #指定环境

Sentinel为我们提供了@SentinelResource注解标记需要限流的资源

我们来测试一下,在UserController中做修改,如下:

package cn.wujiangbo.controller;

import cn.wujiangbo.dto.User;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * <p>用户服务相关api接口</p>
 *
 * @author 波波老师(微信 : javabobo0513)
 */
@RestController
@RequestMapping("/user")
public class UserController {

    //获取配置文件中的值
    @Value("${server.port}")
    private String port;

    @GetMapping("/getUserById/{id}")
    //限流降级
    @SentinelResource(value="getUserById", blockHandler="exceptionHandler")
    public User getUserById(@PathVariable Long id){
        return new User(id,"王天霸", "我是王天霸,你好吗?port=" + port);
    }

    // 限流与阻塞处理 : 参数要和被降级的方法参数一样
    public User exceptionHandler(@PathVariable("userId") Long userId, BlockException ex) {
        ex.printStackTrace();
        return new User(-1L,"null","抱歉,Sentinel-限流");
    }
}

这里通过@SentinelResource的value属性为资源取名为 “getUserById” ,后续我们可以根据该资源名来进行限流

同时这里通过 blockHandler 属性配置了一个限流降级方法,即当“getUserById”资源触发限流了,就会调用blockHandler指向的降级方法返回兜底数据,不至于抛出默认的限流异常信息给客户端(一串英文用户也看不懂) ,需要注意的是:降级方法要和被限流的方法参数一致,然后加上 BlockException 异常对象。

当然,也可以通过 blockHandlerClass 属性把降级方法写在一个专门的类中,如下:

@SentinelResource(value="getUserById",blockHandler="exceptionHandler",blockHandlerClass=ExceptionUtil.Class)
public final class ExceptionUtil {
    //注意:这里的降级方法需要使用static修饰
    public static User exceptionHandler(BlockException ex) {
       //...
    }
}

接下来我们就需要开始设置资源限流策略了

启动用户微服务,然后通过浏览器访问:http://localhost:1010/user/getUserById/13,不断刷新页面试试

然后登录Sentinel控制台刷新页面,在【实时监控】列表中可以看到资源的相关监控信息:

在这里插入图片描述

在【族点链路】列表中可以看到资源的调用链,并且可以通过【流控】按钮设置流控规则

在这里插入图片描述

也可以在【流控规则】菜单中针对资源进行限流规则的设置。如下:

在这里插入图片描述

这里我添加了一个流控规则,资源名对应客户端 @SentinelResource(value=“getUserById”)注解的资源,通过QPS限流(每秒请求数量),阈值是2 ,意思是“getUserById”这个资源每秒只能有2个请求进来,多余的请求会触发限流,返回降级数据

测试

通过浏览器访问用户服务,然后快速的刷新页面,当QPS大于2(每秒发送大于两个请求)就会触发限流,返回数据如下:

在这里插入图片描述

确实限流了,测试成功

2.3、Sentinel流控模式

1、直接

Sentinel默认的流控处理就是【直接->快速失败】,QPS达到阈值,当前资源直接失败。在【流控规则】菜单中配置如下:

在这里插入图片描述

2、关联

点击高级选项,关联的资源达到某个阈值,限流自己,如:

在这里插入图片描述

限流的资源是/user/delete ,关联的资源是/user/list,当/user/list达到阈值,限流user/delete

场景举例:支付并发太高,可以限制下单的流量

3、链路

限流调用的入口,如 /user/list 资源中调用了 /dept/list,有如下限流规则:

在这里插入图片描述

对/dept/list添加限流,当/dept/list达到阈值,其实限流的是/user/list,因为他是访问的入口

2.4、Sentinel流控效果

1、快速失败

快速失败:(RuleConstant.CONTROL_BEHAVIOR_DEFAULT)是默认的流控方式,当流量达到阀值直接返回异常,QPS达到任何规则阈值后,后续请求就会立即拒绝,并抛出FlowException 异常。

简单理解:并发太高,直接请求拒绝

2、Warm Up预热

Warm Up预热:(RuleConstant.CONTROL_BEHAVIOR_WARM_UP)方式,根据codeFactor(默认3)的值,从(阀值/codeFactor)为初始阀值,经过预热时长,才到达设置的QPS的阀值,即预热/冷启动方式。

简单理解:慢慢的增大处理并发的能力

在这里插入图片描述

提示:初始的QPS阈值为 100 / 3 =33 ,也就是最开始的并发只能是33,但是10秒过后 QPS阈值就达到了100

当系统长期并发不高,流量突然增加可能会直接把系统压垮。让通过的流量缓慢增加,在一定时间内逐渐增加到阈值的上限,给系统一个预热的时间,避免系统被压垮。

场景:秒杀抢购

3、排队等待

排队等待:(RuleConstant.CONTROL_BEHAVIOR_RATE_LIMITER),达到阈值之后的所有请求,我们可能更希望把这些请求放入队列,然后慢慢执行,而不是直接拒绝请求,这种方式严格控制请求通过的时间间隔,也就是让请求以均匀的速度通过,对应的是漏桶算法,这种方式主要用于处理间隔性突发的流量,例如消息队列。

简单理解:突发流量处理不过来,让请求排队。

在这里插入图片描述

解读:QPS阈值为100,超过100个请求的其他所有请求都会排队,排队超时时间为 10S

2.5、热点规则

还有一种特殊的动态限流规则,用于限制动态的热点资源,比如对同一个用户的请求频率做限定,比如对参数进行限定,比如对参数的值做限定(比如对商品ID为1的资源做限流)。

1、参数限流

参数限流就是:对资源的参数进行限流,

我们来编写一个方法,接受两个参数:p1和p2并设置好限流降级:

//限流降级
@SentinelResource(value="/parameterLimit",blockHandler="parameterLimitHandler")
@GetMapping(value="/parameterLimit")
public String parameterLimit(@RequestParam("p1") String p1 ,@RequestParam("p2") String p2){
    return "parameterLimit方法调用成功...";
}
// 限流与阻塞处理
public String parameterLimitHandler(@RequestParam("p1") String p1 ,@RequestParam("p2") String p2,BlockException ex) {
    return "限流了...";
}

配置热点规则,对第一个参数限流 ,当第一个参数超过了1的QPS就熔断降级:

在这里插入图片描述

2、参数值限流

对某一个参数的值满足某种条件的时候就进行限流。

上面的参数限流配置完毕后,点击后面的【编辑】按钮,如下配置:

在这里插入图片描述

上面配置的意思是:第一个参数的值为 haha 的时候限流阈值为10 , 超过 QPS > 10的并发就限流。

场景:应用场景比如说商品名称为“华为p40”的商品并发特别高,我们可以针对参数商品名为“华为p40”的商品进行限流

2.6、系统规则

1、配置全局限流规则

系统规则可以看做是总的限流策略,所有的资源都要受到系统规则的限制:

在这里插入图片描述

上面的意思是最大并发只能允许 10 个线程数,并且是作用于全局的

3、Sentinel服务熔断

3.1、编码实战

1、资源熔断降级

修改用户微服务工程,修改UserController ,通过@SentinelResource注解的 fallback 属性指定降级方法

package cn.wujiangbo.controller;

import cn.wujiangbo.dto.User;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * <p>用户服务相关api接口</p>
 *
 * @author 波波老师(微信 : javabobo0513)
 */
@RestController
@RequestMapping("/user")
public class UserController {

    //获取配置文件中的值
    @Value("${server.port}")
    private String port;

    @GetMapping("/getUserById/{id}")
    //限流降级
    @SentinelResource(value="getUserById", blockHandler="exceptionHandler", fallback = "getUserByIdFallback")
    public User getUserById(@PathVariable Long id){
        int i = 1 / 0;	//方法异常,触发熔断
        return new User(id,"王天霸", "我是王天霸,你好吗?port=" + port);
    }

    // 限流与阻塞处理 : 参数要和 被降级的方法参数一样
    public User exceptionHandler(@PathVariable("userId") Long userId, BlockException ex) {
        ex.printStackTrace();
        return new User(-1L,"null","抱歉,Sentinel-限流");
    }

    // 熔断降级,参数和返回值与源方法一致
    public User getUserByIdFallback(@PathVariable("userId") Long userId){
        return new User(userId,"null", "抱歉,Sentinel-熔断");
    }
}

我在【getUserById】方法中通过 int i = 1 / 0 模拟发生异常,然后会熔断触发降级调用降级方法,通过 fallback 属性指定熔断的降级方法 ,熔断方法参数也要和被熔断方法参数一致。

开始测试,浏览器访问:http://localhost:1010/user/getUserById/13,结果如下:

在这里插入图片描述

符合预期,测试成功

注意:这里可以通过 @SentinelResource 注解中的 exceptionsToTrace 属性可以设置忽略某种异常,即针对某个异常不熔断

2、配置降级策略

在Sentinel控制台,在【族点链路】菜单中找到“getUserById”资源,然后点击【降级】按钮添加降级策略,如下:

在这里插入图片描述

这里的降级策略为“RT”,大概意思是:如果并发数大于5 (QPS > 5) ,然后平均响应时间大于200毫秒,那么接下来的2秒钟之内对该资源的请求会被熔断降级。

6.3、降级策略

资源在什么情况下会触发熔断降级?

调用异常,达到流控,调用超时 都会触发熔断降级,在上面的案例中我们看到资源的降级策略有 RT、异常比例、异常数这三种方式,我们可以通过这三种方式来定义资源是否稳定,决定是否要进行熔断降级。

1、平均响应RT

平均响应时间 (DEGRADE_GRADE_RT):当资源的平均响应时间超过阈值(DegradeRule 中的 count,以 ms 为单位)之后,资源进入准降级状态。详细说明:如果 1s 内持续进入 5 个请求(即 QPS >= 5),它们的 RT 都持续超过这个阈值(count,以 ms 为单位),那么在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地熔断(抛出 DegradeException)。注意 Sentinel 默认统计的 RT 上限是 4900 ms,超出此阈值的都会算作 4900 ms,若需要变更此上限可以通过启动配置项 -Dcsp.sentinel.statistic.max.rt=xxx 来配置。

是不是很生涩难懂?我们根据下面这个配置来理解:

在这里插入图片描述

这里配置的RT是200意思是:对资源的多次请求平均响应时间都超过200毫秒,总体意思是1s 内持续进入 5 个请求(即 QPS >= 5),这五个请求的平均响应时间都超过了200,后续的2秒之内(时间窗口),请求这个方法都会被熔断,触发降级,2秒之后恢复正常。

总结一下:RT其实就是平均响应时间太长,资源熔断。

2、异常比例

异常比例(DEGRADE_GRADE_EXCEPTION_RATIO):每秒请求量 > 5 ,当资源的每秒异常总数占通过量的比值超过阈值(DegradeRule 中的 count)之后,资源进入降级状态,即在接下的时间窗口(DegradeRule 中的 timeWindow,以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。

根据下面这个配置来理解:

在这里插入图片描述

上面配置的意思就是:“getUserById”这个资源的异常比例超过了0.3,即10个请求有3个都异常了,资源就会被熔断,2秒之后恢复正常。

总结一下:异常比例就是按照资源的请求失败率来熔断。

3、异常数

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

根据下面这个配置来理解:

在这里插入图片描述

这里的意思是:62秒超过6个异常请求,服务进行熔断。后续请求都拒绝。

注意:异常降级仅针对业务异常,对 Sentinel 限流降级本身的异常(BlockException)不生效

总结一下:异常数就是按照 一分钟的异常的数量 来熔断。

6.4、OpenFeign兼容Sentinel

OpenFeign与Sentinel组件集成除了引入sentinel-starter依赖关系之外,还需要在yml配置文件中启用Sentinel支持:feign.sentinel.enabled=true

1、添加依赖

修改支付服务的pom文件(这个工程我们之前集成了OpenFeign),添加下面依赖:

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

2、开启Sentinel

修改支付微服务的yml文件,新增下面配置:

feign:
  sentinel:
    enabled: true #开启熔断
  #hystrix:
  #  enabled: true #开启熔断功能

3、Feign接口降级

这里跟Feign开启Hystrix降级一样,还是可以使用fallback和fallbackFactory属性,如下:

package cn.wujiangbo.feign.client;

import cn.wujiangbo.dto.User;
import cn.wujiangbo.feign.fallback.UserFeignClientFallback;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

/**
 * <p>Feign的客户端接口</p>
 *
 * @author 波波老师(微信 : javabobo0513)
 */
@FeignClient(value = "user-server", fallbackFactory = UserFeignClientFallback.class)
public interface UserFeignClient {

    @GetMapping("/user/getUserById/{id}")
    User getUserById(@PathVariable Long id);
}

编写降级类,返回托底数据:

package cn.wujiangbo.feign.fallback;

import cn.wujiangbo.dto.User;
import cn.wujiangbo.feign.client.UserFeignClient;
import feign.hystrix.FallbackFactory;
import org.springframework.stereotype.Component;

/**
 * <p>兜底类</p>
 *
 * @author 波波老师(微信 : javabobo0513)
 */
@Component
public class UserFeignClientFallback implements FallbackFactory<UserFeignClient> {

    @Override
    public UserFeignClient create(Throwable throwable) {
        return new UserFeignClient(){
            @Override
            public User getUserById(Long userId) {
                //打印异常信息,方便从控制台查看触发兜底的原因
                throwable.printStackTrace();
                return new User(userId, "null", "User服务不可用,返回兜底数据");
            }
        };
    }
}

4、测试

启动用户服务和支付服务,然后浏览器访问:http://localhost:1030/pay/getUserById/13,开始是可以正常返回数据的,然后我们停掉用户服务,再刷新页面,就会这样了:

在这里插入图片描述

符合预期,测试成功

4、Sentinel和Hystrix区别

两者的原则是一致的, 都是当一个资源出现问题时, 让其快速失败, 不要波及到其它服务,但是在限制的手段上, 确采取了完全不一样的方法:

  • Hystrix 默认采用的是线程池隔离的方式,优点是做到了资源之间的隔离,缺点是增加了线程切换的成本
  • Sentinel 采用的是通过并发线程的数量和响应时间来对资源做限制

总结

本文针对Sentinel的服务容错的特性,介绍了其中各种知识点的使用方式,相信大家在开发中会使用了,赶紧写个Demo测试下吧

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

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

相关文章

YOLOv5蒸馏 | 知识蒸馏理论篇 | 1/2

之前在《一文搞懂【知识蒸馏】【Knowledge Distillation】算法原理》这篇文章中介绍过一些知识蒸馏的原理,这篇博文将会着重介绍目标检测领域的知识蒸馏原理。 文章目录 1.《Object detection at 200 Frames Per Second》1.1 蒸馏难点1.2 蒸馏损失1.3 实验结果2. 《Learning E…

计算机毕业设计ssm+vue基本微信小程序的体检预约小程序

项目介绍 我国经济迅速发展&#xff0c;人们对手机的需求越来越大&#xff0c;各种手机软件也都在被广泛应用&#xff0c;但是对于手机进行数据信息管理&#xff0c;对于手机的各种软件也是备受用户的喜爱&#xff0c;体检预约系统小程序被用户普遍使用&#xff0c;为方便用户…

【前端】CSS(1) —— CSS的基本语法和一些简单的选择器

JavaEE传送门JavaEE 网络原理——网络层与数据链路层 【前端】HTML入门 —— HTML的常见标签 目录CSS基本语法注释引入方式内部样式内联样式外部样式代码风格样式格式样式大小写空格规范CSS 选择器标签选择器类选择器id 选择器通配符选择器复合选择器后代选择器子选择器并集选…

文件包含漏洞和hash破解

介绍 Windows是当今世界最主要的操作系统&#xff0c;因为它易于使用的GUI可访问性。大约85%的市场份额已成为攻击的关键操作系统。此外&#xff0c;大多数组织使用Active Directory来设置其Windows域网络。微软聘请NTLM&#xff08;New Technology LAN Manager&#xff09;和…

Pico Neo3 4VR游戏下载地址及十大好玩游戏推荐

大家好&#xff0c;杰克今天为大家分享的是VR一体机游戏。 说到VR一体机&#xff0c;我们首先想到的一定是国产之光pico啦&#xff0c;picovr被认为是国内最被看好的VR一体机&#xff0c;有望在国内取代红极一时的OculusQuest&#xff0c;填补这块市场的空白。OculusQuest将6D…

#Primavera Unifier:关于零代码/低代码平台特点【2/3】

在之前对Unifier的介绍中&#xff0c;我提到了Unifier应用的一个非常关键的特征&#xff0c;及零代码快速配置使用&#xff0c;而为了更好的介绍Oracle Primavera Unifier 的零代码特点&#xff0c;以下我将通过3篇内容来逐一介绍零代码/低代码平台的特点。 前面介绍到了零代码…

Opencv项目实战:14 手势控制音量

目录 0、项目介绍 1、项目展示 2、项目搭建 3、项目的代码与讲解 4、项目资源 5、项目总结 0、项目介绍 本篇与上一篇有很多联系&#xff0c;大家可以看看这篇Opencv项目实战&#xff1a;13 手部追踪&#xff0c;我们将根据上一节的内容&#xff0c;进行一个拓展。本篇你…

AtCoder Beginner Contest 275 【E】【F】

E - Sugoroku 4 【概率dp】 题意&#xff1a; 对于每个样例&#xff0c;读入n&#xff0c;m&#xff0c;k。 一维数轴&#xff0c;你现在在0这个点上&#xff0c;目标是到达n这个点&#xff0c;你有k次掷骰子的机会&#xff0c;每次可能等概率的掷出1~m的任意一个数字&#xff…

面了一个4年经验的测试工程师,自动化都不会也要15k,我真是醉了...

在深圳这家金融公司也待了几年&#xff0c;被别人面试过也面试过别人&#xff0c;大大小小的事情也见识不少&#xff0c;今天又是团面的一天&#xff0c; 一百多个人都聚集在一起&#xff0c;因为公司最近在谈项目出来面试就2个人&#xff0c;无奈又被叫到面试房间。 整个过程…

.NET Core HttpReports 监控

HttpReports 基于.NET Core 开发的APM监控系统&#xff0c;使用MIT开源协议&#xff0c;主要功能包括&#xff0c;统计, 分析, 可视化&#xff0c; 监控&#xff0c;追踪等&#xff0c;适合在中小项目中使用。 语雀&#xff1a;https://www.yuque.com/httpreports/docs/uyaiil …

SQL注入之绕过is_numeric过滤

目录预备知识PHP常用的过滤类函数is_numeric()函数介绍实验目的实验环境实验步骤一通过源代码审计&#xff0c;发现临时文件实验步骤二通过分析源代码的执行逻辑&#xff0c;了解程序的功能&#xff0c;发现程序中的安全漏洞实验步骤三绕过过滤函数实现SQL注入预备知识 PHP常用…

Linux进程信号

文章目录什么是信号signal函数的功能&#xff08;捕捉信号后自己处理&#xff09;Core Dump&#xff08;核心转储&#xff09;kill&#xff0c;raise&#xff0c;alarm系统调用再度理解OS给进程发送信号信号集操作函数自定义捕捉详解什么是信号 生活中的信号&#xff1a;闹钟&…

0083 环形链表

package LinkedList_; /* * 单向环形链表应用场景——约瑟夫问题 * 设编号为1&#xff0c;2....n的n个人围成一圈&#xff0c;约定编号为k&#xff08;1<k<n&#xff09;的人从1开始报数&#xff0c;数到m的人出列&#xff0c; * 它的下一位又从…

黑胶歌曲没权限,还好我会Python,一分钟一个歌单,硬盘有点不够用了~

今日份Python白嫖人生苦短&#xff0c;我用Python一、你需要准备1、环境2、模块二、效果展示三、代码展示四、写在最后人生苦短&#xff0c;我用Python 人之初&#xff0c;喜白嫖。大家都喜欢白嫖&#xff0c;我也喜欢&#xff0c;那么今天就来试试怎么白嫖抑云~ 我不是&#…

React面向组件编程(定义组件,组件三大核心属性,组件事件处理、组件收集表单数据、高阶函数和函数的柯里化)

目录 一、React中定义组件 1、函数式组件 2、类式组件 二、组件三大核心属性 1、组件三大核心属性1: State(状态) 2、组件三大核心属性2: props 3、组件三大核心属性3: ref 三、组件事件处理 1、事件处理 四、组件收集表单数据 1、受控组件 2、非受控组件 五、高阶函…

【数据结构】算法的时间复杂度和空间复杂度

&#x1f680; 作者简介&#xff1a;一名在后端领域学习&#xff0c;并渴望能够学有所成的追梦人。 &#x1f40c; 个人主页&#xff1a;蜗牛牛啊 &#x1f525; 系列专栏&#xff1a;&#x1f6f9;初出茅庐C语言、&#x1f6f4;数据结构 ☀️ 学习格言&#xff1a;眼泪终究流不…

象棋中的马跳步问题

象棋中的马跳步问题 作者&#xff1a;Grey 原文地址&#xff1a; 博客园&#xff1a;象棋中的马跳步问题 CSDN&#xff1a;象棋中的马跳步问题 题目描述 中国象棋中&#xff0c;整个棋盘就是横坐标上 9 条线、纵坐标上 10 条线的一个区域&#xff0c;给你三个 参数 x&…

计算机毕业设计springboot+vue基本微信小程序的汽车租赁公司小程序

项目介绍 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时…

【Vue】环境搭建

Vue 简介&#xff1a; 一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目整合。另一方面&#xff0c;当与现代化的工具链以…

Jenkins+Docker 一键自动化部署 SpringBoot 项目

本文章实现最简单全面的 Jenkins Docker Spring Boot 一键自动部署项目。步骤齐全&#xff0c;少走坑路。 环境&#xff1a;CentOS7 Git (Gitee) 实现步骤&#xff1a;在 Docker 安装 Jenkins&#xff0c;配置 Jenkins 基本信息&#xff0c;利用 Dockerfile 和 Shell 脚本实…