Springcloud-alibaba-sentinel

sentinel是什么:

先熔断再降级
随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。

Sentinel 具有以下特征:

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

Sentinel主要特征:

在这里插入图片描述### 使用去官网下载:
在这里插入图片描述

启动Sentinel的控制台:

但是要注意,8080端口要保证不被占用
在这里插入图片描述
我也不知道为什么要跟tomcat的端口有冲突
访问:账号密码都是sentinel
在这里插入图片描述
进来了就这样:
在这里插入图片描述
新建一个服务8401:
添加pom:

<dependencies>
        <dependency>
            <groupId>com.zx.springcloud</groupId>
            <artifactId>cloud-api-commons</artifactId>
            <version>${project.version}</version>
        </dependency>

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

        <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-datasource-nacos</artifactId>
        </dependency>

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

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
      
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>4.6.3</version>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

添加yml:

server:
  port: 8401

spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    sentinel:
      transport:
        dashboard: localhost:8080
        port: 8719  #默认8719,假如被占用了会自动从8719开始依次+1扫描。直至找到未被占用的端口

management:
  endpoints:
    web:
      exposure:
        include: '*'

创建一个启动类:
在这里插入图片描述
在创建一个controller层用于测试:
在这里插入图片描述
启动查看:
在这里插入图片描述
什么也没有。查看也没找到。看了官网明白了,说的是sentinel使用的是来加载模式。必须使用的时候才有,那就使用一次测试一下
在这里插入图片描述
在这里插入图片描述
再刷新Sentinel:出来了!!!
在这里插入图片描述
实时监控:
在这里插入图片描述

簇点链路:

在这里插入图片描述

流控规则:

在这里插入图片描述
●资源名:唯-名称,默认请求路径
●针对来源: Sentine可以针对调用者进行限流,填写微服务名,默认default (不区分来源)
●阈值类型/单机阈值:
。QPS (每秒钟的请求数量) :当调用该ap的QPS达到阈值的时候,进行限流
。线程数:当调用该api的线程数达到阈值的时候,进行限流
●是否集群:不需要集群
●流控模式:
。直接: api达到限流条件时,直接限流
。关联:当关联的资源达到阈值时,就限流自己
。链路:只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流) [api级
别的针对来源]
●流控效果:
。快速失败:直接失败,抛异常
。Warm Up:根据codeFactor (冷加载因子,默认3)的值,从阈值/codeFactor, 经过预热时长,才达到设置的QPS阈值
。排队等待:匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,则无效

配置一下流控:

在这里插入图片描述
规则是访问testA的时候是一秒一次,超过就失败
在这里插入图片描述
狂点:失败了
在这里插入图片描述
改造一下testA
在这里插入图片描述
再修改一下流控:
QPS改成线程数:(在门外)
在这里插入图片描述
狂点:
在这里插入图片描述
线程数就是相当于在同一时间达到一定的值时会进行阻断。(关门打狗)

关联:修改下配置,意思就是B不行了,然后导致A挂了,这样的好处就是在分布式中各种服务时相关的,如果把B看成时支付接口,那A就是下单接口,意思就是B如果支付接口的压力大了,那么就告诉A先别下单这么猛了
在这里插入图片描述
用postman测试一下:
20个线程0.3秒一次
在这里插入图片描述
启动后访问A:
在这里插入图片描述
在这里插入图片描述
能看到A失败了,当B访问完成后再次访问A:
在这里插入图片描述
能看到A又能访问了

链路:看文档的意思就是当B调用超过2次时,就对A限流
在这里插入图片描述
访问刚刚的postman访问B,能看到A被限流了
在这里插入图片描述
修改了一下规则就能访问到A了
在这里插入图片描述
在这里插入图片描述

Warm up:详细看官网:https://github.com/alibaba/Sentinel/wiki/%E9%99%90%E6%B5%81—%E5%86%B7%E5%90%AF%E5%8A%A8:
反正我看着有点懵逼.我的理解就是当一个程序一直时正常运行的时候没问题,当瞬间的并发量太高了有可能会崩,这个时候就有了预热,就跟温水煮青蛙一样。慢慢的加温:
在这里插入图片描述
这个配置的意思我理解的就是单机阈值10,然后有个默认值是3,预热值是5,系统初始化的阀值为10/ 3约等于3,即阀值刚开始为3;然后过了5秒后阀值才慢慢升高恢复到10,那就是给5秒的时间阈值从3过度到10
测试:
在这里插入图片描述
狂点,超过每秒3次报错,经过五秒按一样的手速:
在这里插入图片描述
能看到按一样的手速也能成功了
这个的运用感觉能用到秒杀系统上,因为场景很符合的,都是到点瞬间访问

排队等待:不管怎么并发都匀速通过,超过就超时重试,阈值必须是QPS配置:
在这里插入图片描述
在这里插入图片描述
一秒10个,理论启动后应该是每秒过1个线程,启动访问:
在这里插入图片描述
可以看到时间,确实是一秒一个

降级规则:

在这里插入图片描述

RT(秒级):

平均响应时间( DEGRADE GRADE_ RT): 当1s内持续进入5个请求,对应时刻的平均响应时间(秒级)均超过阈值( count,以ms为单位),那么在接下的时间窗口( DegradeRule中的timeNindow,以s为单位)之内,对这个方法的调用都会自动地熔断(拋出DegradeException)。 注意Sentinel默认统计的RT上限是4900 ms,超出此阈值的都会算作4900 ms,若需要变更此上限可以通过启动配置项-Dcsp. sentinel. statistic. max.rt-=xx来配置。

新增一个testD方法:
在这里插入图片描述
访问:
在这里插入图片描述

在这里插入图片描述
用jemter设置一个1秒请求10个,访问:开始不行,过了一秒才行
在这里插入图片描述

异常比例(秒级):

异常比例( DEGRADE GRADE_ EXCEPTION _RATIO):当资源的每秒请求量>= 5,并且每秒异常总数占通过量的比值超过阈值( DegradeRule中的count )之后,资源进入降级状态,即在接下的时count )之后,资源进入降级状态,即在接下的时回。异常比率的阈值范围是[9.0, 1.0], 代表0%- 100%。

异常数(分钟级):

异常数(分钟统计)超过阈值时r触发降级;时间窗口结束后,关闭降级

说白了就是配置过后访问达到错误次数后就会启动熔断保护是系统避免更多的损失

热点Key限流

根据官方的意思就是可以把网站的热点访问词用来作为限流的条件,
@SentinelResource和Hystrix的那个注解是差不多的意思,都是当出错了后可以使用其他的方法用来兜底
编写代码:
在这里插入图片描述
配置热点参数:每秒超过一次就会出现熔断并使用容错的方法
在这里插入图片描述
访问:
在这里插入图片描述
提高点击速度:
在这里插入图片描述
就会触发热点规则
如果没有再java配置里说明容错的方法,一旦超过配置的值就会出现Error Page的页面,对用户不友好

参数例外项:上面普通的参数当P的值等于1时,会被限流,但是设置了参数例外项后,当它的值等于某一个特定的值时,它的阈值就可以其他的期望值或者不被限流

在这里插入图片描述
支持的类型:
在这里插入图片描述
设置当第0个参数的值为5时,阈值能达到200:
在这里插入图片描述
测试:p1等于a时:超过一秒一个会被限流:
在这里插入图片描述
当p1等于5时:狂点也不会报错,因为我再怎么点也不会超过一秒200次
在这里插入图片描述
运行时异常:
在这里插入图片描述
在这里插入图片描述
所以,@SentinelResource只是管理sentinel配置时出错的地方,java代码出错不会管

系统规则:

在这里插入图片描述
●Load 自适应(仅对Linux/Unix-like 机器生效) :系统的load1作为启发指标,进行自适应系统保护。当系统load1超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护(BBR 阶段)。系统容量由系统的maxQps * nminRt估算得出。设定参考值一般是CPU cores * 2.5。
●CPU usage (1.5.0+版本) :当系统CPU使用率超过阈值即触发系统保护(取值范围0.0-1.0),比较灵敏。(cpu的使用率)
●平均RT: 当单台机器上所有入口流量的平均RT达到阈值即触发系统保护,单位是毫秒。
●并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。
●入口QPS:当单台机器上所有入口流量的QPS达到阈值即触发系统保护。

配置:
在这里插入图片描述
访问:疫苗一次没问题,但是狂点就会限流了
在这里插入图片描述
在这里插入图片描述
每个方法都会这样

@SentinelResource

新增测试类:
通过资源名称

@RestController
public class RateLimitController
{
    @GetMapping("/byResource")
    @SentinelResource(value = "byResource",blockHandler = "handleException")
    public CommonResult byResource()
    {
        return new CommonResult(200,"按资源名称限流测试OK",new Payment(2020L,"serial001"));
    }
    public CommonResult handleException(BlockException exception)
    {
        return new CommonResult(444,exception.getClass().getCanonicalName()+"\t 服务不可用");
    }

访问成功:
在这里插入图片描述
配置流控:
在这里插入图片描述
访问:
在这里插入图片描述
出现异常了时一个alibaba的流限流的异常类在这里插入图片描述
关闭sentinel:
在这里插入图片描述
流控规则没了o.o,说明时临时的

通过url地址
在这里插入图片描述
访问:
在这里插入图片描述
配置:
在这里插入图片描述
再次访问:
在这里插入图片描述
自定义一个类,处理全局的容错方法
在这里插入图片描述
访问:
在这里插入图片描述
配置:
在这里插入图片描述
访问,超过阈值就会使用自定义的容错方法:
在这里插入图片描述
参数:
fallBack:java代码运行时异常所返回的页面或者结果
handler:sentinel所使用的返回结果或兜底的方法

@RestController
@Slf4j
public class CircleBreakerController {
    public static final String SERVICE_URL = "http://nacos-payment-provider";
    @Resource
    private RestTemplate restTemplate;
    @RequestMapping("/consumer/fallback/{id}")
    //@SentinelResource(value = "fallback") //没有配置
    //@SentinelResource(value = "fallback",fallback = "handlerFallback") //fallback只负责业务异常
    //@SentinelResource(value = "fallback",blockHandler = "blockHandler") //blockHandler只负责sentinel控制台配置违规
    @SentinelResource(value = "fallback",fallback = "handlerFallback",blockHandler = "blockHandler",
            exceptionsToIgnore = {IllegalArgumentException.class})
    public CommonResult<Payment> fallback(@PathVariable Long id) {
        CommonResult<Payment> result = restTemplate.getForObject(SERVICE_URL + "/paymentSQL/"+id, CommonResult.class,id);

        if (id == 4) {
            throw new IllegalArgumentException ("IllegalArgumentException,非法参数异常....");
        }else if (result.getData() == null) {
            throw new NullPointerException ("NullPointerException,该ID没有对应记录,空指针异常");
        }

        return result;
    }
    //fallback
    public CommonResult handlerFallback(@PathVariable  Long id,Throwable e) {
        Payment payment = new Payment(id,"null");
        return new CommonResult<>(444,"兜底异常handlerFallback,exception内容  "+e.getMessage(),payment);
    }
    //blockHandler
    public CommonResult blockHandler(@PathVariable  Long id,BlockException blockException) {
        Payment payment = new Payment(id,"null");
        return new CommonResult<>(445,"blockHandler-sentinel限流,无此流水: blockException  "+blockException.getMessage(),payment);
    }


}

大部分情况下fallBack和BlockHandler同时配置, BlockHandler会优先使用

sentinel持久化:

添加pom:
在这里插入图片描述
修改yml:
在这里插入图片描述
配置nacos:
在这里插入图片描述
再次启动8401服务,能发现已经有规则

在这里插入图片描述
我们访问一下url:超过阈值就会限流并返回sentinel的规则
在这里插入图片描述
然后关闭8401sentinel服务:发现规则没有了,
在这里插入图片描述
再次启动8401sentinel:
访问retaLimit.byUrl再看sentinel:
在这里插入图片描述
能发现又出现了流控规则,所以持久化成功了
感觉唯一的一点不好就是需要写配置文件到nacos里,虽然能持久化了,但是没有在sentinel里直接配置方便直观,还需要背许多的配置规则

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值