SpringCloud中 Sentinel 限流的使用

  1. 引入依赖

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

    	@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即可,需要注意的时,控制台一开始并不会显示限流的资源,需要请求一次限流资源才会显示 ,缺点是限流规则没有持久化,服务重启限流规则就消失了

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

    实时监控
    SpringCloud中 Sentinel 限流的使用_第1张图片
    流控规则,可以定义修改限流规则
    SpringCloud中 Sentinel 限流的使用_第2张图片
    簇点链路
    SpringCloud中 Sentinel 限流的使用_第3张图片

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

    
    <dependency>
        <groupId>com.alibaba.cspgroupId>
        <artifactId>sentinel-datasource-nacosartifactId>
    dependency>
    
    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去查看对应的名称
    SpringCloud中 Sentinel 限流的使用_第4张图片

  5. Sentinel配置详解
    SpringCloud中 Sentinel 限流的使用_第5张图片
    在这里插入图片描述
    在这里插入图片描述
    SpringCloud中 Sentinel 限流的使用_第6张图片
    SpringCloud中 Sentinel 限流的使用_第7张图片
    SpringCloud中 Sentinel 限流的使用_第8张图片

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

    熔断规则

    SpringCloud中 Sentinel 限流的使用_第9张图片
    SpringCloud中 Sentinel 限流的使用_第10张图片
    SpringCloud中 Sentinel 限流的使用_第11张图片
    SpringCloud中 Sentinel 限流的使用_第12张图片
    SpringCloud中 Sentinel 限流的使用_第13张图片

    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秒

你可能感兴趣的:(spring,cloud,sentinel)