springcloudalibaba~~配置sentinel

alibaba配置sentinel

下载sentinel的dashboard,https://github.com/alibaba/Sentinel/releases/tag/v1.8.0下载sentinel-dashboard-1.8.0.jar

因为是jar包,所以可以直接java-jar运行,sentinel-dashboard的默认端口为8080,注意端口不要被占用,访问8080出现sentinel的登录就表示启动成功

新建model,叫service-provider-alibaba-sentinel9010,pom文件

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</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>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

配置文件application.yml

server:
  port: 9010

spring:
  application:
    name: service-provider-alibaba-sentinel9010
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
    sentinel:
      transport:
        dashboard: localhost:8080
        port: 8719

management:
  endpoints:
    web:
      exposure:
        include: "*"

启动类加注解

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceProviderAlibabaSentinel9010 {
	public static void main(String[] args) {
		SpringApplication.run(ServiceProviderAlibabaSentinel9010.class, args);
	}
}

controller类

@RestController
public class HelloController {
   @Value("${server.port}")
   public String serverPort;

   @RequestMapping("/hello")
   public String getHello(){
      return serverPort;
   }
}

启动nacos8848,启动sentinel-dashboard8080,启动service-provider-alibaba-sentinel9010服务

调用http://localhost:9010/hello,然后登录dashboard就能看到了,账号密码是sentinel

流控规则

主要是做流量控制,可以控制到具体的某一个接口,还可以自己选择模式和效果
在这里插入图片描述
流控模式:直接表示达到阈值就进行限流,关联表示A达到阈值就限流B(比如支付接口达到阈值就限流下单接口),链路表示记录链路上的流量,当链路上的某一点达到阈值时,会对这条链路进行限流

流控效果:快速失败表示直接抛出异常,Warm Up表示预热,根据冷加载因子(默认3)经过预热时长才达到设置的QPS阀值,排队表示大量请求过来,会排队一个一个进行消费。

现在添加一个流控规则
在这里插入图片描述

http://localhost:9010/hello

如果在一秒内差不多点击一次的话,接口正常调用,如果快速点击的话,会进行限流“Blocked by Sentinel (flow limiting)”

当然可以在服务里面自定义限流后的逻辑,使用@SentinelResource(value = “hello”, blockHandler = “getHelloblockHandler”)注解,blockHandler就是发生限流后走的方法名称,需要自己定义

@RestController
public class HelloController {
   @Value("${server.port}")
   public String serverPort;

   @RequestMapping("/hello")
   @SentinelResource(value = "hello", blockHandler = "getHelloblockHandler")
   public String getHello(){
      return serverPort;
   }

   public String getHelloblockHandler(BlockException e){
      return "发生限流了----------------";
   }
}

@SentinelResource注解后面还可以加fallback,用于程序本身异常时走的逻辑

降级规则

当服务调用时满足了以下条件就会对服务进行降级
在这里插入图片描述

慢调用比例:选择以慢调用比例作为阈值,需要设置允许的慢调用 RT(即最大的响应时间),请求的响应时间大于该值则统计为慢调用。当单位统计时长(statIntervalMs)内请求数目大于设置的最小请求数目,并且慢调用的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求响应时间小于设置的慢调用 RT 则结束熔断,若大于设置的慢调用 RT 则会再次被熔断。
在这里插入图片描述

异常比例 :当单位统计时长内请求数目大于设置的最小请求数目,并且异常的比例大于阈值,则接下来的熔断时长内请求会自动被熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
在这里插入图片描述

异常数:当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(HALF-OPEN 状态),若接下来的一个请求成功完成(没有错误)则结束熔断,否则会再次被熔断。

熔断降级规则(DegradeRule)包含下面几个重要的属性:

Field说明默认值
resource资源名,即规则的作用对象
grade熔断策略,支持慢调用比例/异常比例/异常数策略慢调用比例
count慢调用比例模式下为慢调用临界 RT(超出该值计为慢调用);异常比例/异常数模式下为对应的阈值
timeWindow熔断时长,单位为 s
minRequestAmount熔断触发的最小请求数,请求数小于该值时即使异常比率超出阈值也不会熔断(1.7.0 引入)5
statIntervalMs统计时长(单位为 ms),如 60*1000 代表分钟级(1.8.0 引入)1000 ms
slowRatioThreshold慢调用比例阈值,仅慢调用比例模式有效(1.8.0 引入)

热点规则

热点参数限流会统计传入参数中的热点参数,并根据配置的限流阈值与模式,对包含热点参数的资源调用进行限流。热点参数限流可以看做是一种特殊的流量控制,仅对包含热点参数的资源调用生效。

属性说明默认值
resource资源名,必填
count限流阈值,必填
grade限流模式QPS 模式
durationInSec统计窗口时间长度(单位为秒),1.6.0 版本开始支持1s
controlBehavior流控效果(支持快速失败和匀速排队模式),1.6.0 版本开始支持快速失败
maxQueueingTimeMs最大排队等待时长(仅在匀速排队模式生效),1.6.0 版本开始支持0ms
paramIdx热点参数的索引,必填,对应 SphU.entry(xxx, args) 中的参数索引位置
paramFlowItemList参数例外项,可以针对指定的参数值单独设置限流阈值,不受前面 count 阈值的限制。仅支持基本类型和字符串类型
clusterMode是否是集群参数流控规则false
clusterConfig集群流控相关配置

使用热点参数要添加依赖pom

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-parameter-flow-control</artifactId>
</dependency>

添加方法

@RequestMapping("/hot")
@SentinelResource(value = "hot", blockHandler = "getHelloblockHandler")
public String getHot(@RequestParam(value = "p1",required = false) String p1,
                @RequestParam(value = "p2",required = false) String p2){
   return serverPort;
}

启动服务,添加热点规则
在这里插入图片描述

添加高级选项后记得点击添加后在点击保存

调用http://localhost:9010/hot?p1=1,发现是不会限流的,

调用http://localhost:9010/hot?p2=1,发现是会限流的

调用http://localhost:9010/hot?p2=2,如果限流阈值填得足够高,手动刷新是感觉不到到限流的

设置高级选项是可以对参数的具体值做不同的限流的,对于热点的商品有很好的效果

系统规则

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

系统规则主要是当达到某一条件后,就会触发系统保护,导致整个服务不可用,达到保护效果

授权规则

  • resource:资源名,即限流规则的作用对象。
  • limitApp:对应的黑名单/白名单,不同 origin 用 , 分隔,如 appA,appB
  • strategy:限制模式,AUTHORITY_WHITE 为白名单模式,AUTHORITY_BLACK 为黑名单模式,默认为白名单模式。

若配置白名单则只有请求来源位于白名单内时才可通过;若配置黑名单则请求来源位于黑名单时不通过,其余的请求通过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值