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秒
相关推荐
sniper_fandc16 小时前
Spring Cloud系列—SkyWalking告警和飞书接入
spring cloud·skywalking
西红柿维生素18 小时前
Sentinel相关记录
网络·sentinel
abigalexy1 天前
深入图解Spring Cloud底层设计
spring·spring cloud
楠有枝2 天前
普通用户使用docker命令
spring cloud·docker·eureka
孤狼程序员3 天前
【Spring Cloud 微服务】2.守护神网关Gateway
spring cloud·微服务·gateway
朱皮皮呀3 天前
Spring Cloud——服务注册与服务发现原理与实现
运维·spring cloud·eureka·服务发现·php
朱皮皮呀4 天前
微服务流量分发核心:Spring Cloud 负载均衡解析
spring cloud·微服务·负载均衡
源码宝5 天前
【智慧工地源码】智慧工地云平台系统,涵盖安全、质量、环境、人员和设备五大管理模块,实现实时监控、智能预警和数据分析。
java·大数据·spring cloud·数据分析·源码·智慧工地·云平台
2301_793086875 天前
SpringCloud 07 微服务网关
java·spring cloud·微服务
重整旗鼓~6 天前
46.Sentinel规则持久化
sentinel