sentinel代码实现
官网
https://sentinelguard.io/zh-cn/docs/quick-start.html
1、添加依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.0</version>
</dependency>
</dependencies>
2、编写控制器
package com.xyf.controller;
import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;
import com.alibaba.csp.sentinel.slots.block.RuleConstant;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRule;
import com.alibaba.csp.sentinel.slots.block.flow.FlowRuleManager;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
@RestController
public class UserController {
private static final String USER_REQUST_HELLO="hello";
@GetMapping("/hello")
public String getHello(){
//设置对那个请求做流控设置
try {
Entry entry = SphU.entry(USER_REQUST_HELLO);
} catch (BlockException e) {
//e.printStackTrace();
return "你被限流了";
}
return "hello world";
}
//流控规则定义
@PostConstruct //优先加载
public void initFlowBlock(){
List<FlowRule> rules=new ArrayList<>();//设置流控的规则集合
//创建流控的规则对象
FlowRule flowRule = new FlowRule();
//设置流控对象
flowRule.setResource(USER_REQUST_HELLO);
//设置流控方式
flowRule.setGrade(RuleConstant.FLOW_GRADE_QPS);//根据每秒请求的数量做线路
//每秒请求两个
flowRule.setCount(2);
//添加规则到集合中
rules.add(flowRule);
//将流控规则交给流控管理对象
FlowRuleManager.loadRules(rules);
}
}
3、演示
限流(每秒两次请求)
注解实现
1、导入依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-annotation-aspectj</artifactId>
<version>1.8.0</version>
</dependency>
2、控制器改造
/**
*
* @param pid
* blockHandler 指定限流后的处理方案
*/
@GetMapping("/user")
@SentinelResource(value = USER_REQUST_NAME,blockHandler = "blockUser")
public User getUser(String pid){
return new User("xyf");
}
public User blockUser(String id,BlockException e){
return new User("限流");
}
3、添加sentinelResourceAspect
@Bean //引入sentinel切面
public SentinelResourceAspect sentinelResourceAspect(){
return new SentinelResourceAspect();
}
4、演示
限流:每秒2次请求