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.bootgroupId>
        <artifactId>spring-boot-starter-webartifactId>
    dependency>
    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
    dependency>
    <dependency>
        <groupId>com.alibaba.cloudgroupId>
        <artifactId>spring-cloud-starter-alibaba-sentinelartifactId>
    dependency>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-actuatorartifactId>
    dependency>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-devtoolsartifactId>
        <scope>runtimescope>
        <optional>trueoptional>
    dependency>
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-testartifactId>
        <scope>testscope>
    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

流控规则

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

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

现在添加一个流控规则
springcloudalibaba~~配置sentinel_第2张图片

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,用于程序本身异常时走的逻辑

降级规则

当服务调用时满足了以下条件就会对服务进行降级
springcloudalibaba~~配置sentinel_第3张图片

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

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

异常数:当单位统计时长内的异常数目超过阈值之后会自动进行熔断。经过熔断时长后熔断器会进入探测恢复状态(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.cspgroupId>
    <artifactId>sentinel-parameter-flow-controlartifactId>
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;
}

启动服务,添加热点规则
springcloudalibaba~~配置sentinel_第6张图片

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

调用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 为黑名单模式,默认为白名单模式。

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

你可能感兴趣的:(springcloud,java)