SpringCloud Alibaba之Sentinel学习

简介

1.是什么

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

2.之前学习的Hystrix

缺点:(1).需要我们程序员自己手工搭建监控平台

          (2).没有一套web界面可以给我们进行更加细粒度化得配置流控、速率控制、服务熔断、服务降级。

 

3.Sentinel优点

(1).单独一个组件,可以独立出来

(2).直接界面化的细粒度统一配置。

 

4.Sentinel 具有以下特征:

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

 5.主要特性

6.Sentinel分为两个部分:

     核心库不依赖任何框架/库,能够运行于所有java运行时环境,同时对Dubbo/Spring Cloud等框架也有较好的支持。

    控制台基于Spring Boot开发,打包后可以直接运行,不需要额外的Tomcat等应用容器。

 

安装启动

1.官网下载:https://github.com/alibaba/Sentinel/releases

sentinel-dashboard-1.7.0.jar

2.运行dos命令,显示如下,启动成功。

java -jar sentinel-dashboard-1.7.0.jar

 3.输入地址:http://localhost:8080/#/dashboard

账号密码都是sentinel,如下页面启动成功。

 

怎么用

1.引入pom文件

<!--SpringCloudailibabanacos-->
<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--SpringCloudailibabasentinel-datasource-nacos后续做持久化用到-->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<!--SpringCloudailibabasentinel-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>

2.yml文件

server:
  port: 8401

spring:
  application:
    name: cloudalibaba-sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848 #Nacos服务注册中心地址
    sentinel:
      transport:
        dashboard: localhost:8080 #配置Sentinel dashboard地址
        port: 8719
 


3.业务代码 

@RestController
@Slf4j
publicclassFlowLimitController
{
@GetMapping("/testA")
publicStringtestA()
{
    return"------testA";
}

@GetMapping("/testB")
publicStringtestB()
{
    log.info(Thread.currentThread().getName()+"\t"+"...testB");
    return"------testB";
}


@GetMapping("/testD")
publicStringtestD()
{
    //try{TimeUnit.SECONDS.sleep(1);}catch(InterruptedExceptione)   //{e.printStackTrace();}
//log.info("testD测试RT");

    log.info("testD异常比例");
    intage=10/0;
return"------testD";
}

@GetMapping("/testE")
publicStringtestE()
{
    log.info("testE测试异常数");
    intage=10/0;
    return"------testE测试异常数";
}
@GetMapping("/testHotKey")
@SentinelResource(value="testHotKey",blockHandler="deal_testHotKey")
publicStringtestHotKey(@RequestParam(value="p1",required=false)Stringp1,
@RequestParam(value="p2",required=false)Stringp2)
{
//intage=10/0;
return"------testHotKey";
}
publicStringdeal_testHotKey(Stringp1,Stringp2,BlockExceptionexception)
{
return"------deal_testHotKey,o(╥﹏╥)o";//sentinel系统默认的提示:BlockedbySentinel(flowlimiting)
}

 

4.启动访问

http://localhost:8401/testHotKey

Sentinel控制台会实时监控

 

Sentinel控制台

流量控制

(1)阈值类型

  QPS代表每秒请求数量:当调用该api的QPS达到阈值的时候,进行限流。

  线程数:当调用该api的线程数达到阈值的时候,进行限流。 

效果:

超过阈值,访问受限

 

(2)流控模式

直接:api到限流条件时,直接限流

关联:当关联的资源到达阈值时,就限流自己

链路:只记录指定链路上的流量

利用postman模拟并发密集访问testB

新增两次testB

然后点run设置线程数,和延迟时间

点击un Collection

此时访问testA,被限制。

流控效果:直接、预热、排队等待

直接就是刚才演示的效果

 

预热是:秒杀系统在开启的瞬间,会有很多流量上来,很有可能把系统打死,预热方式就是把为了保护系统,可慢慢的把流量放进来,慢慢的把阈值增长到设置的阈值。

排队等待就是一个一个过。

(3)降级

RT是平均响应时间:超出阈值且在时间窗口内通过的请求>=5,两个条件同时满足后触发降级,窗口期过后关闭断路器,RT最大4900

异常比例(秒级)QPS>=5且异常比例超过阈值时,触发降级;时间窗口结束后,关闭降级。

异常数(分钟级):异常数超过阈值时,触发降级;时间窗口结束后,关闭降级。超过阈值,系统知道已经造成损失,所以不能再报错。

用Jemter做压力测试。

热点key

何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的Top K数据,并对其访问进行限制。

从HystrixCommand@SentinelResource

@SentinelResource(value="testHotKey",blockHandler="deal_testHotKey")

//blockHandler是兜底方法

 

@SentinelResource//处理的是Sentinel控制配置的违规情况,有blockHandler方法配置的兜底处理;

@SentinelResource//主管配置出错,运行出错该走异常走异常。

 blockHandlerClass// 指定类名

(4)系统规则

系统保护规则是从应用级别的入口流量控制,从单台机器的load、CPU使用率、平均RT、入口QPS和并发线程数等几个维度监控应用指标,让系统尽可能跑再最大吞吐量的同时保证系统整体的稳定性。

系统保护规则是应用整体维度的,而不是资源维度的,并且仅对入口流量生效。入口流量指的是进入系统规则支持以下的模式:

  Load自适应(仅对Linex/Unix-like机器生效):系统的load1作为启发指标,进行自适应系统保护。当系统load1超过设定的启发值,且系统当前的并发线程数超过估算的系统容量时才会触发系统保护。系统容量由系统的maxQps *minRt估算得出。设定参考值一般是CPU cores*2.5

CPU usage:当系统CPU使用率超过阈值即触发系统保护(取值范围0.0-1.0),比较灵敏。

平均 usage:当系统CPU使用率超过阈值即触发系统保护,单位是毫秒。

并发线程数:当单台机器上所有入口流量的并发线程数达到阈值即触发系统保护。

入口QPS:当单台机器上所有入口流量的QPS达到阈值即触发系统保护。

 

Sentinel规则持久化

一旦我们重启应用,sentinel规则将消失,生产环境需要将配置规则持久化。

 

怎么做?

将限流规则持久化进Nacos保存,只要刷新8401某个rest地址,sentinel控制台的流控规则就能看到,只要Nacos里面的配置不删除,针对8401上的流控规则持续有效。

 

步骤:

pom文件:

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

YML: 

sentinel:
transport:
dashboard:localhost:8080#配置Sentineldashboard地址
port:8719
datasource:
ds1:
nacos:
server-addr:localhost:8848
dataId:cloudalibaba-sentinel-service
groupId:DEFAULT_GROUP
data-type:json
rule-type:flow

 登录nacos,新建配置,内容为:

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

 

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章