1、Springboot整合sentinel
1、导入依赖
注意,低版本的sentinel和高版本的springboot是不兼容的,会导致sentinel无效
<!-- sentinel -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.6</version>
</dependency>
<!-- 当前依赖,熔断使用 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-annotation-aspectj</artifactId>
<version>1.8.6</version>
</dependency>
<!-- Sentinel本地应用接入控制台如果不接入控制台,可以不导入 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.8.6</version>
</dependency>
2、注入必要对象
启动类中,注入SentinelResourceAspect对象,否则 SentinelResource.blockHandler (限流降级处理) 不生效
@Bean
public SentinelResourceAspect sentinelResourceAspect() {
return new SentinelResourceAspect();
}
3、接口/方法限制(使用)
- 注意,sentinel中,”资源“ 就相当于 标签 的含义
- 被”资源“(标签) 修饰的 接口/方法,是被资源的规则所限制
- 资源的规则是可以手动配置(硬编码)的,也可以通过sentinel控制台动态配置
1、方式1,手动配置资源
设置一个资源名称为 sentinel_hello,表明当前接口/方法 被资源sentinel_hello的规则限制
Entry ignored = SphU.entry("sentinel_hello");
2、方式2,注解方式配置资源
@SentinelResource(value = "sentinel_hello_v3",blockHandler = "helloV2Handler",fallback = "helloV3Hystrix",fallbackClass = TestController.class)
注解含义:
- value = “sentinel_hello_v3” # 资源名称:sentinel_hello_v3
- blockHandler = “helloV2Handler” #限流被触发之后,降级调用的方法 方法名是:helloV2Handler
- fallback = “helloV3Hystrix” #熔断(异常)被触发之后,降级调用的方法 方法名是:helloV3Hystrix
- fallbackClass = TestController.class #限流/熔断触发之后,降级调用的方法所在的类,如果再同一个类中,可以不用设置
// blockHandler:限流与阻塞处理 fallback:熔断与降级处理
@SentinelResource(value = "sentinel_hello_v3",blockHandler = "helloV2Handler",fallback = "helloV3Hystrix",fallbackClass = TestController.class)
@GetMapping(value = "/helloV3")
public String helloV3(){
// 设置一个资源名称为 sentinel_hello
System.out.println("Hello Sentinel");
throw new RuntimeException("发生异常");
}
//参数要与主方法一致,可以多一个BlockException ex
public String helloV2Handler(BlockException ex){
// ex.printStackTrace();
System.out.println("请求太快了,稍后再试");
return "请求太快了,稍后再试";
}
//参数要与主方法一致
public static String helloV3Hystrix(Throwable e){
// e.printStackTrace();
System.out.println("系统异常,熔断降级处理,稍后再试");
return "系统异常,熔断降级处理,稍后再试";
}
注意:
1、blockHandler方法:参数和返回值要与主方法一致,且多一个BlockException ex
2、fallback方法:参数和返回值要与主方法一致,且多一个Throwable e
4、资源配置规则
1、硬编码配置:手动在代码中写死配置
使用@PostConstruct注解,再本类构造方法执行结束后执行
@PostConstruct
public void initFlowRule() {
/* 1.创建存放限流规则的集合 */
List<FlowRule> rules = new ArrayList<>();
/* 2.创建限流规则 */
FlowRule rule = new FlowRule();
/* 定义资源,表示 Sentinel 会对哪个资源生效 */
rule.setResource("sentinel_hello");
/* 定义限流的类型(此处使用 QPS 作为限流类型) */
rule.setGrade(RuleConstant.FLOW_GRADE_QPS);
/* 定义 QPS 每秒通过的请求数 */
rule.setCount(2);
/* 3.将限流规则存放到集合中 */
rules.add(rule);
/* 2.创建限流规则 */
FlowRule rule2 = new FlowRule();
/* 定义资源,表示 Sentinel 会对哪个资源生效 */
rule2.setResource("sentinel_hello_v2");
/* 定义限流的类型(此处使用 QPS 作为限流类型) */
rule2.setGrade(RuleConstant.FLOW_GRADE_QPS);
/* 定义 QPS 每秒通过的请求数 */
rule2.setCount(2);
/* 3.将限流规则存放到集合中 */
rules.add(rule2);
/* 2.创建限流规则 */
FlowRule rule3 = new FlowRule();
/* 定义资源,表示 Sentinel 会对哪个资源生效 */
rule3.setResource("sentinel_hello_v3");
/* 定义限流的类型(此处使用 QPS 作为限流类型) */
rule3.setGrade(RuleConstant.FLOW_GRADE_QPS);
/* 定义 QPS 每秒通过的请求数 */
rule3.setCount(2);
/* 3.将限流规则存放到集合中 */
rules.add(rule3);
/* 4.加载限流规则 */
FlowRuleManager.loadRules(rules);
}
2、sentinel控制台动态配置
当前方式,需要搭建sentinel控制台服务
1、下载sentinel控制台jar包
https://github.com/alibaba/Sentinel/releases
2、启动Sentinel控制台
java -Dserver.port=9000 -jar sentinel-dashboard-1.8.0.jar
3、访问Sentinel控制台:Http://127.0.0.1:9000/
账号和密码都是:sentinel
4、项目整合控制台
控制台启动成功了,但是还没有整合到项目中
1、项目增加依赖
<!-- Sentinel本地应用接入控制台 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.8.0</version>
</dependency>
2、在 idea 中设置本地应用的 JVM 启动参数
-Dcsp.sentinel.dashboard.server=localhost:9000 -Dproject.name=Sentinel-Quick-Start
3、启动项目,连接控制台
项目启动之后,第一次进入控制台是不会链接上的,需要访问下受限制的接口,才能自动链接
访问接口:
http://localhost:9004/sentinel/helloV3
查看是否链接