Spring Cloud集成Sentinel

Spring Cloud Alibaba 默认为Sentinel整合了Servlet、RestTemplate、FeignClient和SpringWebFlux。Sentinel补全了Hystrix在Servlet和RestTemplate的不足,还兼容了Hystrix在FeignClient中限流降级的用法,支持灵活配置和调整流控规则。

Sentinel接入Spring Cloud

  1. 创建一个基于SpringBoot的项目,并集成SpringCloud依赖

  2. 添加Sentinel依赖

    <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
                <version>2.2.5.RELEASE</version>
    </dependency>
    
  3. 创建一个REST接口,并使用@SentinelResource配置限流保护资源

@RestController
@RequestMapping("/sentinel")
public class SentinelController {

    @SentinelResource(value = "getName",blockHandler = "blockHandlerMethodByLimit")
    @GetMapping(value = "/{name}")
    public String getName(@PathVariable("name") String name){
        return name;
    }

    public String blockHandlerMethodByLimit(BlockException e){
        return "被限流";
    }
}

配置限流资源有以下几种情况

  • Sentinel Starter在默认下为所有的HTTP服务提供限流埋点,只想对HTTP服务限流,只需要添加依赖,无需修改代码
  • 针对特定的方法限流或者降级,使用@SentinelResource注解来实现限流资源的定义
  • 通过SphU.entry()配置资源

手动配置流量控制规则,是借助了Sentinel的InitFunc SPI扩展接口实现,需要实现InitFunc接口,并在init方法编写相关规则逻辑

public class FlowRlueInitFunc implements InitFunc {
    @Override
    public void init() throws Exception {
        List<FlowRule> list = new ArrayList<>();
        FlowRule flowRule = new FlowRule();
        flowRule.setCount(1);
        flowRule.setResource("getName");
        flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);
        flowRule.setLimitApp("default");
        list.add(flowRule);
        FlowRuleManager.loadRules(list);
    }
}

SPI是扩展点机制,需要被Sentinel加载,还要在resource目录下创建META-INF/services/com.alibaba.csp.sentinel.init.InitFunc文件,文件内容是自定义扩展点的全路径

com.ozx.springcloud.sentinel.util.FlowRuleInitFunc

按照以上配置好后,在初次访问任何资源时,Sentinel就会自动加载getName资源的流控规则。

启动服务后,访问http://localhost:8080/sentinel/Gxin方法,当访问频率超过阈值时,会触发限流。

以上配置过程是基于手动配置来加载Sentinel流量控制规则,之后下一篇文章介绍另一种方式是通过Sentinel Dashboard来配置相关流控规则。