SpringCloud中 Sentinel 限流的使用

  1. 引入依赖

    xml 复制代码
     <dependency>
        <groupId>com.alibaba.cloud</groupId>
        <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    </dependency>
  2. 手动编写限流规则,缺点是不够灵活,如果需要改变限流规则需要修改源码

    java 复制代码
    	@PostConstruct
        private void initFlowQpsRule() {
            List<FlowRule> rules = new ArrayList<>();
            FlowRule rule = new FlowRule();
            //一定要与 @SentinelResource 里的值一致
            rule.setResource("confirmOrder");
            //定义限流规则,常见的有QPS和线程数
            rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
            //最大QPS为20,如果请求超过了20,也只有20个请求会执行成功,如果没有定义降级的方法其余的请求会抛出 FlowException
            rule.setCount(20);
            rule.setLimitApp("default");
            rules.add(rule);
            FlowRuleManager.loadRules(rules);
    	}
    	//定义一个资源,value值不能少,并指定降级对应的方法
    	@SentinelResource(value = "confirmOrder",blockHandler = "exceptionHandler")
    	public void flowMethod(String abc) {
    	...
    	}
    	// blockHandler函数,原方法调用被限流/降级/系统保护的时候调用,编写的时候要注意降级方法内的参数除了BlockException之外要与资源方法参数一致
        public void exceptionHandler(String abc,BlockException ex) {
           	 //降级逻辑的编写
        }
  3. 利用控制台编写限流规则,控制台是额外的Java项目,需要运行起来,优点是不需要修改源码,可以运行时修改限流规则,启动后访问
    localhost:18080即可,需要注意的时,控制台一开始并不会显示限流的资源,需要请求一次限流资源才会显示 ,缺点是限流规则没有持久化,服务重启限流规则就消失了

    yaml 复制代码
    spring:
      application:
        name: business
      cloud:
        sentinel:
          transport: #启用sentinel控制台
            port: 8719 #控制台监听的端口,固定的端口
            dashboard: localhost:18080 #控制台项目启动的端口,启动控制台项目可以自己指定

    实时监控

    流控规则,可以定义修改限流规则

    簇点链路

  4. 使用Nacos实现限流规则持久化

    xml 复制代码
    <!--        实现sentinel限流规则持久化-->
    <dependency>
        <groupId>com.alibaba.csp</groupId>
        <artifactId>sentinel-datasource-nacos</artifactId>
    </dependency>
    yaml 复制代码
    spring:
      application:
        name: business
      cloud:
        sentinel:
          datasource:
            flow: # 这个可以随意取
              nacos:
                server-addr: #nacos服务的地址
                namespace: train
                group-id: DEFAULT_GROUP
                data-id: sentinel-flow
                rule-type: flow #限流
            degrade: # 这个可以随意取
              nacos:
                server-addr: #nacos服务的地址
                namespace: train
                group-id: DEFAULT_GROUP
                data-id: sentinel-degrade
                rule-type: degrade #熔断

    定义限流规则,里面是一个json数组,所以可以配置多条规则,其实nacos的这个配置相当于没有界面的Sentinel台端,实现的功能是一样的,只不过他定义的规则是持久化的,控制台定义的的规则是推送到我们的项目的,也就是保存在内存当中的,重启就没了,这些参数不知道可以使用控制台的时候 F12去查看对应的名称

  5. Sentinel配置详解





    • 资源名:对哪个方法进行限流
    • 针对来源:限流的资源可能被多个服务调用(例如远程调用),用来指定什么服务来调用需要限流,一般都是使用默认
    • 流控效果:
      • 快速失败是指触发限流直接失败返回
      • 排队等待触发限流后等排队等待,可以设置超时时间,假设阀值是10,一下子来了20个请求,但一秒内只能接受10个请求,剩余的请求可以等待下一秒执行,如果等待的时间超过了设置的时间,还是会失败返回的,注意只有选择QPS才会有排队等待功能,适合会有流量突刺的系统,通过排队等待慢慢处理请求
      • Warm Up 进行预热,可以设置预热时长.假设预热时长是两秒,设置的单机阀值是10,那么一开始的阀值就是 10 / 3 = 3,然后会慢慢增加,在两秒后 阀值才会变成10,预热是为了保护系统,如果系统设置了阀值很大,系统刚启动就来了超过阀值的请求,可能会出现很多问题,所以需要预热让系统的阀值慢慢增加,而不是一下子就达到设定的阀值,适合流量一直很大的系统
    • 流控模式
      • 关联:需要配置一个关联资源,只有当关联资源限流了,当前资源开启限流,例如支付资源关联了下单资源,只有当下单资源触发了限流,支付资源才会开启限流,否则无论多大的请求都不会触发限流

      • 链路:需要配置一个入口资源,例如A资源调用了C资源,B资源也调用了C资源,但入口资源是A,所以只有A调用C资源时时才会触发C资源的限流

        yaml 复制代码
        spring:
          cloud:
            sentinel:
              web-context-unify: false #流控模式为链路时必须设置为false
  6. Sentinel的熔断功能,一般是配合远程调用使用

    熔断规则





    yaml 复制代码
    spring:
      cloud:
        openfeign: #feign.sentinel.enabled改为true后不加会报错
          lazy-attributes-resolution: true
    feign:
      sentinel:
        enabled: true #sentinel默认不监控feign,需要sentinel配置 lazy-attributes-resolution: true不然会报错

    注意的是feign接口是不能自己使用注解定义资源的,sentinel开启了监控feign会自动定义feign接口的资源,而且名称是固定的

    • 资源名:需要远程调用服务的接口全路径
    • 熔断策略
      • 慢调用比例:拿上面的参数举例,只有当1000毫秒内请求数超过6时,并且有 30% 的请求响应时间超过201ms,会进行熔断11秒,也就是说在11秒内都不会再远程调用对应的服务了,并且会抛出 DegradeException ,此时可以做相应的降级处理保证服务的可用性
      • 异常比例:拿上面的参数举例,只有当1000毫秒内请求数超过6时,并且有 30% 的请求出现异常,会进行熔断3秒
      • 异常数:拿上面的参数举例,只有当1000毫秒内请求数超过6时,并且出现3次异常,会进行熔断3秒
相关推荐
Q_19284999061 小时前
基于Springcloud的智能社区服务系统
后端·spring·spring cloud
程序猿零零漆5 小时前
SpringCloud 系列教程:微服务的未来(二)Mybatis-Plus的条件构造器、自定义SQL、Service接口基本用法
java·spring cloud·mybatis-plus
荆州克莱2 天前
mysql中局部变量_MySQL中变量的总结
spring boot·spring·spring cloud·css3·技术
bohu832 天前
sentinel学习笔记7-熔断降级
笔记·sentinel·熔断降级·degradeslot·circuitbreaker
解梦者2 天前
Spring(七)Spring Cloud----Feign、Zuul和Apollo
spring·spring cloud·feign·apollo·zuul
新手小袁_J2 天前
JDK11下载安装和配置超详细过程
java·spring cloud·jdk·maven·mybatis·jdk11
suweijie7682 天前
SpringCloudAlibaba | Sentinel从基础到进阶
java·大数据·sentinel
维李设论3 天前
Node.js的Web服务在Nacos中的实践
前端·spring cloud·微服务·eureka·nacos·node.js·express
向阳12183 天前
sentinel来源访问控制(黑白名单)
java·sentinel