SpringCloud alibaba Sentinel下载与使用

Sentinel下载

下载地址:Sentinel下载

  • 启动:java -Dserver.port=8080 -jar sentinel-dashboard-1.7.1.jar(Sentinel端口默认是8080,可通过-Dserver.port指定端口)。
  • 浏览器访问8080可看到Sentinel管理页面(用户密码均为:sentinel)。
    在这里插入图片描述

Sentinel使用

Sentinel监控微服务

  1. 新建module:cloud-sentinel-service-9010
  2. POM
 <!--   nacos   -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--  sentinel    -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</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>
  1. yaml
server:
  port: 9010

spring:
  application:
    name: sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.74.130:8848  #naocs地址
    sentinel:
      transport:
        dashboard: 192.168.74.130:8080    #sentinel地址
        port: 8719 #端口配置会在应用对应的机器上启动一个Http Server,该Server会与Sentinel控制台做交互。默认8719,被占用会从8719开始依次+1扫描,直到终点未被使用端口。

#暴露监控端点
management:
  endpoints:
    web:
      exposure:
        include: "*"
  1. 主启动
@SpringBootApplication
@EnableDiscoveryClient
public class SentinalServiceMain {
   public static void main(String[] args) {
       SpringApplication.run(SentinalServiceMain.class,args);
   }
}
  1. Controller
@RestController
@Slf4j
public class SentinalController {
    @GetMapping("/getA")
    public String getA(){
        log.info("Hello -- A");
        return "Hello -- A";
    }
    @GetMapping("/getB")
    public String getB(){
        log.info("Hello -- B");
        return "Hello -- B";
    }
}
  1. 启动服务查看Setinel控制台,并没有出现微服务;浏览器访问/getA,/getB后刷新Sentinel工作台,可以看到微服务已成功被Sentinel监控(懒加载)。
    在这里插入图片描述

流控规则

在这里插入图片描述

  • 资源名:唯一名称,默认请求路径

  • 针对来源:Sentinel可以根据调用者进行限流,填写微服务名,默认default(不区分来源)

  • 阈值类型/单击阈值:

    • QPS(每秒请求数量):当调用该api的QPS达到阈值时,进行限流
    • 线程数:当调用该api的线程数达到阈值时,进行限流
  • 是否集群:勾选则是集群

  • 流控模式

    • 直接:达到限流条件直接限流
    • 管理:关联资源达到阈值,限流自己
    • 链路:指定链路上的流量达到阈值,进行限流
  • 流控效果(仅QPS)

    • 快速失败:直接失败,抛异常
    • Warn Up:根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFactor,经过预热时长,才达到设置的QPS阈值
    • 排队等待:匀速排队,让请求匀速通过

降级规则

Sentinel的断路器是没有半开状态的

在这里插入图片描述

  • 资源名:唯一名称,默认请求路径
  • 降级策略:
    • RT(平均响应时间,秒级):平均响应时间超出阈值(以 ms 为单位),那么在接下的时间窗口(以 s 为单位)之内,对这个方法的调用都会自动地熔断
    • 异常比例(秒级):当资源的每秒请求量 >= N(可配置),并且每秒异常总数占通过量的比值超过阈值之后,资源进入降级状态,即在接下的时间窗口(以 s 为单位)之内,对这个方法的调用都会自动地返回。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%
    • 异常数(分钟级):当资源近 1 分钟的异常数目超过阈值之后会进行熔断。,若 时间窗口小于 60s,则结束熔断状态后仍可能再进入熔断状态

热点key限流

在这里插入图片描述

  • 资源名:唯一名称,默认请求路径
  • 限流模式:QPS模式
  • 参数索引:对应url参数索引位置
  • 单机阈值:当调用该api的QPS达到阈值时,进行限流
  • 统计窗口时长:统计窗口时间长度(单位为秒),1.6.0 版本开始支持
  • 参数例外项(可以针对指定的参数值单独设置限流阈值,不受前面阈值的限制)
    • 参数类型:仅支持基本类型和字符串类型
    • 参数值:指定任意满足参数类型的参数值
    • 限流阈值:针对指定的参数值的QPS达到阈值时,进行限流

系统规则(不建议使用)

在这里插入图片描述

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

@SentinelResouce注解

按资源名称限流
  • Controller代码
@GetMapping("/getResource")
@SentinelResource(value = "byResource",blockHandler = "handleException")
public Result getByResource(){
    return new Result(200,"Success","getByResource");
}
public Result handleException(BlockException blockException){
    return new Result(444,"资源名称限流","handleException");
}
  • Sentinel配置
    在这里插入图片描述
  • 一秒多次访问
    在这里插入图片描述
按URL限流(优先级高)
  • Sentinel配置
    在这里插入图片描述
  • 一秒多次访问(系统默认限流处理信息)
    在这里插入图片描述
自定义限流处理逻辑(与业务解耦)
  • 新建自定义限流处理类(限流处理方法必须static修饰)
public class MyBlockHandler {
    public static Result myBlockHandlerException(BlockException blockException){
        return new Result(444,"自定义限流","myBlockHandlerException");
    }
  • Controller代码
 @GetMapping("/getMyResource")
    @SentinelResource(value = "myResource",blockHandlerClass = MyBlockHandler.class, blockHandler = "myBlockHandlerException")
    public Result getByMyResource(){
        return new Result(200,"Success","getByResource");
    }
  • 一秒多次访问
    在这里插入图片描述
@SentinelResource 注解属性
  • value:资源名称,必需项(不能为空)
  • entryType:entry 类型,可选项(默认为 EntryType.OUT)
  • blockHandler / blockHandlerClass主管配置违规。blockHandler 对应处理 BlockException 的函数名称,可选项。blockHandler 函数访问范围需要是 public,返回类型需要与原方法相匹配,参数类型需要和原方法相匹配并且最后加一个额外的参数,类型为 BlockException。blockHandler 函数默认需要和原方法在同一个类中。若希望使用其他类的函数,则可以指定 blockHandlerClass 为对应的类的 Class 对象,注意对应的函数必需为 static 函数,否则无法解析。
  • fallback / fallbackClass管运行异常。fallback 函数名称,可选项,用于在抛出异常的时候提供 fallback 处理逻辑。fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。
  • defaultFallback(since 1.6.0):默认的 fallback 函数名称,可选项,通常用于通用的 fallback 逻辑(即可以用于很多服务或方法)。默认 fallback 函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,则只有 fallback 会生效。
  • exceptionsToIgnore(since 1.6.0):用于指定哪些异常被排除掉,不会计入异常统计中,也不会进入 fallback 逻辑中,而是会原样抛出。

持久化配置

重启应用,Sentinel规则会消失,生产环境需要将配置规则进行持久。

  1. POM文件
<!--  持久化进nacos  -->
<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
  1. yaml
spring:
  application:
    name: sentinel-service
  cloud:
    nacos:
      discovery:
        server-addr: 192.168.74.130:8848
    sentinel:
      transport:
        dashboard: 192.168.74.130:8080
        port: 8719 #端口配置会在应用对应的机器上启动一个 Http Server,该 Server 会与 Sentinel 控制台做交互
      datasource:
        ds1:
          nacos:
            server-addr: 192.168.74.130:8848
            dataId: sentinel-service
            groupId: DEFAULT_GROUP
            data-type: json
            rule-type: flow #流控规则
  1. nacos配置
    在这里插入图片描述
"resource":"myResource", #资源名称
"limitApp":"default",    #针对来源
"grade":1,               #阈值类型,0表示线程数,1表示QPS
"count":1,               #单机阈值
"strategy":0,            #流控模式,0表示直接,1表示关联,2表示链路
"controlBehavior":0,     #流控效果,0表示快速失败,1表示Warn Up,2表示排队等待
"clusterMode":false      #是否集群
  1. 重新启动服务,发现流控规则已存在
    在这里插入图片描述
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值