Spring Cloud集成Sentinel
Spring Cloud Alibaba 默认为Sentinel整合了Servlet、RestTemplate、FeignClient和SpringWebFlux。Sentinel补全了Hystrix在Servlet和RestTemplate的不足,还兼容了Hystrix在FeignClient中限流降级的用法,支持灵活配置和调整流控规则。
Sentinel接入Spring Cloud
-
创建一个基于SpringBoot的项目,并集成SpringCloud依赖
-
添加Sentinel依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-sentinel</artifactId> <version>2.2.5.RELEASE</version> </dependency>
-
创建一个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来配置相关流控规则。