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秒
相关推荐
蓝眸少年CY13 小时前
(第十二篇)spring cloud之Stream消息驱动
后端·spring·spring cloud
南朝雨20 小时前
Spring Boot Admin日志监控坑点:远程配置的logging.file.name为何生效又失效?
java·spring boot·spring cloud·微服务·logback
深入技术了解原理21 小时前
eureka-client依赖爆红无法下载
spring cloud·云原生·eureka
ZePingPingZe21 小时前
深入理解网络模型之Spring Cloud微服务通信、Socket、HTTP与RPC
网络协议·spring cloud·rpc·dubbo
叫码农就行1 天前
spring cloud 笔记
java·笔记·spring cloud
七夜zippoe1 天前
微服务架构演进实战 从单体到微服务的拆分原则与DDD入门
java·spring cloud·微服务·架构·ddd·绞杀者策略
sunnyday04261 天前
Spring Cloud Alibaba Sentinel 流量控制与熔断降级实战指南
spring boot·sentinel·springcloud
Leo July2 天前
【Java】Spring Cloud 微服务生态全解析与企业级架构实战
java·spring cloud
李慕婉学姐2 天前
【开题答辩过程】以《基于springcloud的空气质量监控管理系统》为例,不知道这个选题怎么做的,不知道这个选题怎么开题答辩的可以进来看看
后端·spring·spring cloud