Sentinel的限流方式实例

作者: 迦叶_金色的人生_荣耀而又辉煌 | 来源:发表于2021-11-30 07:05 被阅读0次

    上一篇 <<<Sentinel的热点词限流
    下一篇 >>>Sentinel策略的持久化方式


    sentinel的限流方式包括手动硬编码限流、配置+注解限流,也可以直接在控制台上进行操作,支持对QPS和线程数进行控制。

    1.限流配置

    QPS:每秒钟请求数
    线程数:类似于信号量,总共允许多少线程访问。

    2.手动限流

    <dependencies>
        <!--  springboot 整合web组件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--服务保护包-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-alibaba-sentinel</artifactId>
            <version>0.2.2.RELEASE</version>
        </dependency>
        <!--监控包-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
    </dependencies>
    
    server:
      port: 8089
    spring:
      application:
        name: sentinel-test
      cloud:
        nacos:
          discovery:
            server-addr: 10.211.55.16:8848
    
    @RestController
    public class ManualController {
        private static final String GETORDER_KEY = "getOrder";
    
    
        /**
         * 限流规则,由于限流默认不支持持久化,可以将这段代码封装到ApplicationRunner实现类,即可完成启动即生效
         * @return
         */
        @RequestMapping("/initFlowQpsRule")
        public String initFlowQpsRule() {
            List<FlowRule> rules = new ArrayList<FlowRule>();
            FlowRule rule1 = new FlowRule();
            rule1.setResource(GETORDER_KEY);
            // QPS控制在2以内
            rule1.setCount(1);
            // QPS限流
            rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
            rule1.setLimitApp("default");
            rules.add(rule1);
            FlowRuleManager.loadRules(rules);
            return "....限流配置初始化成功..";
        }
    
        /**
         * 限流案例
         * @return
         */
        @RequestMapping("/getOrder")
        public String getOrders() {
            Entry entry = null;
            try {
                entry = SphU.entry(GETORDER_KEY);
                // 执行我们服务需要保护的业务逻辑
                return "getOrder接口";
            } catch (Exception e) {
                e.printStackTrace();
                return "该服务接口已经达到上线!";
            } finally {
                // SphU.entry(xxx) 需要与 entry.exit() 成对出现,否则会导致调用链记录异常
                if (entry != null) {
                    entry.exit();
                }
            }
        }
    }
    

    3.注解限流@SentinelResource

    /**
     * 经过测试,限流都走到了blockHandler的方法中,异常类为:FlowException
     *
     * @param value 流量规则资源名称---和手动一样,规则必须要先创建并加载才起效果
     * @param blockHandler 限流/熔断出现异常执行的方法
     * @param fallback 服务的降级执行的方法
     * @return
     */
    @SentinelResource(value = "getOrder", blockHandler = "getOrderQpsException",fallback = "getOrderFallbackException")
    @RequestMapping("/getOrderAnnotation")
    public String getOrderAnnotation() {
        return "getOrder接口";
    }
    
    public String getOrderQpsException(BlockException e) {
        e.printStackTrace();
        return "服务限流异常了!";
    }
    
    public String getOrderFallbackException(Exception e){
        return "服务降级了";
    }
    

    4.控制台方式创建限流规则

    spring:
      application:
        name: sentinel-test
      cloud:
        nacos:
          discovery:
            server-addr: 10.211.55.16:8848
        ###增加sentinel控制台的链接
        sentinel:
          transport:
            dashboard: localhost:8718
          eager: true
    
    @RestController
    public class DashboardController {
    
        /**
         * 注意情况:
         * 1、Sentinel没有持久化功能,服务重启后,原有配置的流控信息均没了
         *
         * 2、只加@SentinelResource,后面参数不带任何参数
         * a、value默认为请求方法名,带斜杠,eg:"/getOrderThrad"
         * b、异常信息客户端展示:Blocked by Sentinel (flow limiting)
         *
         * 3、@SentinelResource 后面的value值一旦设置,则控制台的值必须和value一直,且不带斜杠
         * 
         */
        @SentinelResource(value = "getOrderThrad",blockHandler = "getOrderQpsException")
        @RequestMapping("/getOrderThrad")
        public String getOrderThrad() {
            System.out.println(Thread.currentThread().getName());
            try {
                Thread.sleep(3000);
            } catch (Exception e) {
    
            }
            return "getOrderThrad";
        }
        public String getOrderQpsException(BlockException e) {
            e.printStackTrace();
            return "服务限流异常了!";
        }
    }
    

    推荐阅读:
    <<<Hystrix功能介绍
    <<<Sentinel功能介绍
    <<<Sentinel与Hytrix区别
    <<<Sentinel的熔断降级策略
    <<<Sentinel的热点词限流
    <<<Sentinel策略的持久化方式
    <<<Sentinel整合nacos实现策略持久化
    <<<Sentinel整合网关服务核心代码
    <<<Sentinel环境搭建

    相关文章

      网友评论

        本文标题:Sentinel的限流方式实例

        本文链接:https://www.haomeiwen.com/subject/vatmtrtx.html