1 添加jar
<!-- sentinel核心库 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
<version>1.8.6</version>
</dependency>
<!-- 如果要使用@SentinelResource必须添加此依赖 -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-annotation-aspectj</artifactId>
<version>1.8.1</version>
</dependency>
<!-- 连接sentinel控制台-->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-transport-simple-http</artifactId>
<version>1.8.6</version>
</dependency>
- idea
-Dcsp.sentinel.app.type=1
-Dcsp.sentinel.dashboard.server=127.0.0.1:8858
-Dproject.name=chutiyan
- bootstrap.yml
#运行端口
server:
port: 9011
#数据库配置
# spring 配置
spring:
application:
# 应用名称
name: base-study
profiles:
# 环境配置
active: dev
cloud:
sentinel:
# 取消控制台懒加载
eager: true
transport:
# 控制台地址
dashboard: 127.0.0.1:8858
port: 8719
#clientIp: localhost:9011
nacos:
discovery:
# 服务注册地址
server-addr: 127.0.0.1:8848
# namespace
namespace: wangmutian
config:
# namespace
namespace: ${spring.cloud.nacos.discovery.namespace}
# 配置中心地址
server-addr: ${spring.cloud.nacos.discovery.server-addr}
# 配置文件格式
file-extension: yml
# 共享配置
shared-dataids: application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}
management:
endpoint:
sentinel:
enabled: true
endpoints:
web:
exposure:
include: '*'
4.添加bean(SentinelResourceAspect)【本实例放在了启动类中】
@Bean
public SentinelResourceAspect sentinelResourceAspect() {
return new SentinelResourceAspect();
}
第三步、代码实现
/**
* <h1>spring 初始化方法</h1>
* <h1>@PostConstruct是Spring带的,当前这个bean在被spring容器创建的时候,就会自动的调用
* 被@PostConstruct这个注解修饰的方法进行初始化</h1>
*/
@PostConstruct // init-method
private static void initFlowRules() {
// 流控规则
List<FlowRule> rules = new ArrayList<>();
// 流控
FlowRule ruleUser = new FlowRule();
// 为哪个资源进行流控
ruleUser.setResource(USER_NAME);
// 设置流控规则类型 sQPS
ruleUser.setGrade(RuleConstant.FLOW_GRADE_QPS);
// 设置受保护的资源阙值
ruleUser.setCount(1);
rules.add(ruleUser);
// 加载配置好的规则
FlowRuleManager.loadRules(rules);
}
/**
* <h1>
*
* @param id
* @return
* @SentinelResource 改善接口中资源定义和被流控降级后的处理方法
* value 是定义资源
* blockHandler 设置被流控降级后的处理方法(默认该方法必须声明在同一个类中)
* fallback 当接口中出现了异常,就可以交给fallback指定的方法进行处理
*
* </h1>
*/
@RequestMapping(value = "/user")
@SentinelResource(value = USER_NAME, fallback = "fallBackHandleForGetUser", blockHandler = "blockHandlerForGetUser")
public User getUser(@RequestParam("id") String id) {
int a = 1 / 0;
return new User(id);
}
/**
* getUser接口出现了异常,交由他处理
*
* @param id
* @param e
* @return
*/
public User fallBackHandleForGetUser(String id, Throwable e) {
e.printStackTrace();
return new User("异常处理");
}
/**
* <h1>
* 注意:
* 1、一定要是public
* 2、返回值一定要和源方法保证一致,包含源方法的参数
* 3、可以在参数的最后添加BlockException 可以区分是什么规则的处理方法
* </h1>
*
* @param id 源方法的参数
* @param e 异常处理
* @return {@link User}
*/
public User blockHandlerForGetUser(String id, BlockException e) {
e.printStackTrace();
System.out.println(id + "被限流了");
return new User(id + "被限流了");
}