前言:
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为降级处理者,对应有一个名称相同的方法,专门用来处理降级所需的业务逻辑。
熔断 系统保护请看下篇文章。