SpringBoot集成Sentinel 限流 熔断 系统保护

前言:

Sentinel是针对高并发架构的一个很有效果的中间件,对于限流、熔断、策略访问、消峰、冷启动、系统保护等常见极端场景有很好的防护作用,下面为其使用过程。

配置与依赖:

(注意:从GitHub上直接粘贴的依赖可能不起作用,原因是无version)

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
    <version>2.2.0.RELEASE</version>
</dependency>

然后在resources文件夹下新建一名为“application.yml”的文件,内容如下:

server:
  port: 80
  servlet:
      context-path: "/"

限流示例:

@RestController
public class CurrentLimitController {

    @RequestMapping(value = "/limit", method = RequestMethod.GET)
    public String findController() {
        try(Entry entry = SphU.entry("TEST_LIMIT")){
            return "REQUEST OK.";
        } catch (Exception e){
            e.printStackTrace();
            return "ERROR.";
        }

    }

    @PostConstruct
    public void initFlowRules(){
        List<FlowRule> flowRuleList = new ArrayList<>();
        FlowRule flowRule = new FlowRule();
        flowRule.setResource("TEST_LIMIT");
        flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        flowRule.setCount(2);
        flowRuleList.add(flowRule);
        FlowRuleManager.loadRules(flowRuleList);
    }

}

必要说明:

  • @PostConstruct:这个注解是用来当其依附类(就是最外边那个类)初始化后调用且仅调用一次本构造方法,其目的也是用来初始化。
  • FlowRule:限流规则。
  • FlowRule.setCount(2):设置某访问者最大能在单位时间内访问的次数,超过后则降级处理。
  • FlowRule.setResource(“TEST_LIMIT”):设置资源,与下面对应。
  • SphU.entry(“TEST_LIMIT”):当被访问的线程在上述的“资源”里即执行指定的操作(通常为正常业务逻辑和降级业务和降级业务逻辑)。

注解使用:

注解使用配置有一点点繁琐,但是代码很简单。
添加注解所需依赖:

<dependency>
    <groupId>com.alibaba.csp</groupId>
    <artifactId>sentinel-annotation-aspectj</artifactId>
    <version>1.8.0</version>
</dependency>

新建config文件夹,在其下新建名为SentinelAspectConfiguration的配置类文件,内容如下:

@Configuration
public class SentinelAspectConfiguration {

    @Bean
    public SentinelResourceAspect sentinelResourceAspect(){
        return new SentinelResourceAspect();
    }

}

下面就是Controller层内容。

@RestController
public class CurrentLimitController {

    @PostConstruct
    public void initFlowRules(){
        List<FlowRule> flowRuleList = new ArrayList<>();
        FlowRule flowRule = new FlowRule();
        flowRule.setResource("TEST_2");
        flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        flowRule.setCount(2);
        flowRuleList.add(flowRule);
        FlowRuleManager.loadRules(flowRuleList);
    }

    @SentinelResource(value = "TEST_2", blockHandler = "blockHandler")
    @RequestMapping(value = "/limit2", method = RequestMethod.GET)
    public String findController2() {
        return "NORMAL BUSINESS.";
    }

    public String blockHandler(BlockException e){
        e.printStackTrace();
        return "BAD REQUEST.";
    }

}

说明:
blockHandler为降级处理者,对应有一个名称相同的方法,专门用来处理降级所需的业务逻辑。

熔断 系统保护请看下篇文章。

上一篇:高可用Redis服务架构分析与搭建


下一篇:黑马程序员-传智健康项目(第十三章)