springcloudJavaJVM · Java虚拟机原理 · JVM上语言·框架· 生态系统

Sentinel的限流方式实例

2021-11-30  本文已影响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环境搭建

上一篇 下一篇

猜你喜欢

热点阅读