07.Sentinel
一、代码嵌入式
1.引入依赖
<!-- sentinel核心库,可以单独使用sentinel不需要alibaba.cloud-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.4</version>
</dependency>
<!-- 使用@sentinelResource注解方式需要引用-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-annotation-aspectj</artifactId>
<version>1.8.4</version>
</dependency>
2.编写controller
/**
* @author LRY
* @date 2022/7/31
*/
@RestController
@RequestMapping("/sentinel")
@Slf4j
public class SentinelController {
//资源名称
private static final String RESOURCE_NAME="hello";
//sentinel流控
@RequestMapping("/hello")
public String hello(){
String r=null;
Entry entry=null;
try {
//资源
entry= SphU.entry(RESOURCE_NAME);
//被保护的业务逻辑
r="hello world";
log.info("==================="+r+"====================");
} catch (BlockException e) {
r="block,被流控了";
e.printStackTrace();
log.info(r);
}catch (Exception e){
//若需要配置降级规则,需要通过这种方式记录业务异常
Tracer.traceEntry(e,entry);
}finally {
if(entry!=null){
entry.exit();
}
}
return r;
}
/**
* 定义规则
* Spring的初始化方法
*/
@PostConstruct //这个注解就是,Spring创建SentinelController的Bean时自动调用这个给方法(init-method)
public static void initFlowRules(){
System.out.println("============================initFlowRules=====================================");
//规则集合
List<FlowRule> rules=new ArrayList<>();
//流控规则
FlowRule rule=new FlowRule();
//设置受保护的资源
rule.setResource(RESOURCE_NAME);
//设置规则,设置流控规则QPS(方式次数限制)
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
//设置受保护的资源阈值(1秒访问一次)
rule.setCount(1);
//添加到集合中去
rules.add(rule);
//加载配置好的规则
FlowRuleManager.loadRules(rules);
}
}
二、注解方式
1.引入依赖同上
2.创建注入bean
//注解支持的配置Bean
@Bean
public SentinelResourceAspect sentinelResourceAspect(){
return new SentinelResourceAspect();
}
3.编写controller
/**
* @author LRY
* @date 2022/7/31
*/
@RestController
@RequestMapping("/sentinel")
@Slf4j
public class SentinelController {
//资源名称
private static final String RESOURCE_NAME1="hello1";
/**
* 依赖包:<artifactId>sentinel-annotation-aspectj</artifactId>
* 配置bean:SentinelResourceAspect
* value:资源名
* blockHandler:流控后去执行的方法(
* 1.方法要声明在同一个类里面
* 1)不在一个类里面要添加参数:blockHandlerClass = xxx.class
* 2)方法也要静态方法
* 2.并且要为public
* 3.参数返回值一样
*/
@RequestMapping("/hello1")
@SentinelResource(value = RESOURCE_NAME1,blockHandler = "blockHandlerForhello1")
public String hello1(){
String r="hello world1111111111111";
return r;
}
public String blockHandlerForhello1(BlockException blockException){
String r="block,被流控了11111111111111111111";
return r;
}
/**
* 定义规则
* Spring的初始化方法
*/
@PostConstruct //这个注解就是,Spring创建SentinelController的Bean时自动调用这个给方法(init-method)
public static void initFlowRules(){
System.out.println("============================initFlowRules=====================================");
//规则集合
List<FlowRule> rules=new ArrayList<>();
//流控规则
FlowRule rule1=new FlowRule();
//设置受保护的资源
rule1.setResource(RESOURCE_NAME1);
//设置规则,设置流控规则QPS(方式次数限制)
rule1.setGrade(RuleConstant.FLOW_GRADE_QPS);
//设置受保护的资源阈值(1秒访问一次)
rule1.setCount(1);
rules.add(rule1);
//加载配置好的规则
FlowRuleManager.loadRules(rules);
}
}
4.其他规则
1)降级规则(异常)
三、加入控制台
1.根据Spring Cloud Alibaba下载对应版本
地址:Spring Cloud Alibaba , Sentinel
2.运行sentinel控制台
地址:sentinel官网
java -Dsentinel.dashboard.auth.username=lry -Dsentinel.dashboard.auth.password=lry -Dserver.port=9908 -jar sentinel-dashboard-1.8.4.jar
3.详细参数说明
4.整合到项目,文档
导入依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>x.y.z</version>
</dependency>
创建配置文件 sentinel.properties
修改配置文件
csp.sentinel.dashboard.server=127.0.0.1:9908
5.访问
先访问我们的项目地址
再访问控制台,就能看到配置的规则了(注:这里修改的规则临时保存)
赞(1)
赏