1、Sentinel控制台的下载
下载地址:https://github.com/alibaba/Sentinel/releases/tag/1.8.3
2、Sentinel控制台的启动
java -jar sentinel-dashboard-1.8.3.jar
3、访问
浏览器输入:localhost:8080
账号密码: sentinel/sentinel
4.springboot整合sentinel
pom.xml引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
<version>2021.1</version>
</dependency>
添加配置
server:
port: 9090
spring:
application:
name: springboot-sentinel
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: cong
group: cong
sentinel:
transport:
dashboard: 127.0.0.1:8080 #配置Sentinel dashboard地址
UserController.java
@RestController
public class UserController {
@GetMapping(value = "/getuser")
@SentinelResource(value = "user",blockHandler = "getUserHandler",blockHandlerClass = UserController.class)
public String getUser(String userId) {
if (StringUtils.isNotEmpty(userId) && userId.equals("123456")){
return "用户存在";
}
return "用户不存在";
}
@GetMapping("/adduser")
public String sentinelB(){
return "增加用户";
}
}
测试
然后查看sentinel控制台,只有请求一次才能看到
5.流控规则
官网:https://sentinelguard.io/zh-cn/docs/flow-control.html
流控规则的各个属性
- 资源名: 唯一名称,默认请求路径,表示对该资源进行流控
- 针对来源: Sentinel可以针对调用者进行限流,填写微服务名,默认default(不区分来源)
- 阈值类型/单击阈值:
QPS:(每秒钟的请求数量):当调用该api的QPS达到阈值时,进行限流
线程数:当调用该线程数达到阈值的时候,进行限流 - 是否集群:不需要集群
- 流控模式:
直接: api达到限流条件时,直接限流
关联: 当关联的资源达到阈值时,就限流自己
链路: 只记录指定链路上的流量(指定资源从入口资源进来的流量,如果达到阈值,就进行限流)【api级别的针对来源】 - 流控效果:
快速失败: 直接失败,抛异常
Warm Up: 根据codeFactor(冷加载因子,默认3)的值,从阈值/codeFctor,经过预热时长,才达到设置的QPS阈值
排队等待: 匀速排队,让请求以匀速的速度通过,阈值类型必须设置为QPS,否则无效
详细测试参考:https://blog.csdn.net/qq_41895733/article/details/121899301
新增流控
资源名称就是我们的接口访问路径
然后我们一秒一次访问一下接口(正常)
http://localhost:9090/getuser?userId=123456
可以看到正常返回数据
接下来我们快速请求接口,一秒钟点击多次
发现已经被限流了
然后发现重启项目后,配置的流控规则消失了
解决方案:通过nocas
docker启动nacos
docker run --env MODE=standalone --restart=always --name ybchen-nacos1 -d -p 8848:8848 nacos/nacos-server
nacos新增配置
[
{
"resource": "/getuser",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
},
{
"resource": "/adduser",
"limitApp": "default",
"grade": 1,
"count": 1,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
流控配置注解
- resource: 需要限流的接口路径
- limitApp: 流控针对的调用来源,若为 default 则不区分调用来源
- grade: 限流阈值类型(QPS 或并发线程数);0代表根据并发数量来限流,1代表根据QPS来进行流量控制
- count: 限流阈值
- strategy: 调用关系限流策略
- controlBehavior: 流量控制效果(直接拒绝、Warm Up、匀速排队)
项目增加依赖
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
<version>1.8.0</version>
</dependency>
修改配置文件
server:
port: 9090
spring:
application:
name: springboot-sentinel
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: cong
group: cong
sentinel:
transport:
dashboard: 127.0.0.1:8080 #配置Sentinel dashboard地址
datasource:
# 名字随意
ds:
nacos:
# nacos的访问地址,,根据上面准备工作中启动的实例配置
server-add: 127.0.0.1:8848
# nacos中存储规则的groupId
groupId: DEFAULT_GROUP
# nacos中存储规则的dataId
dataId: ${spring.application.name}-rules
# 用来定义存储的规则类型
rule-type: flow
data-type: json
然后重启项目,重复点击http://localhost:9090/getuser?userId=123456,发现流控效果生效了,证明nocas存储流控规则成功了
6.@SentinelResource注解的使用
@SentinelResource的属性
- value:作用指定资源名称,必填
- entryType:entry类型,标记流量的方向,指明是出口流量,还是入口流量;取值 IN/OUT ,默认是OUT。非必填
- blockHandler:处理BlockException的函数名称,函数要求为
必须是public
返回类型与原方法一致
参数类型需要和原方法相匹配,并在最后加上BlockException类型的参数
默认需和原方法在同一个类中,如果希望使用其他类的函数,可配置blockHandlerClass,并指定blockHandlerClass里面的方法 - blockHandlerClass:存放blockHandler的类。对应的处理函数必须static修饰,否则无法解析。函数要求为:
必须是public
返回类型与原方法一致
参数类型需要和原方法相匹配,并在最后加上BlockException类型的参数 - fallback:用于在抛出异常的时候提供fallback处理逻辑。fallback函数可以针对所有类型的异常(除了execptionsToIgnore 里面排除掉的异常类型)进行处理,函数要求为:
返回类型与原方法一致
参数类型需要和原方法相匹配,Sentinel 1.6版本之后,也可在方法最后加上Throwable类型的参数
默认需和原方法在同一个类中,若希望使用其他类的函数,可配置fallbackClass,并指定fallbackClass里面的方法 - fallbackClass:存放fallback的类。对应的处理函数必须static修饰,否则无法解析,其他要求:同fallback。
- defaultFallback:用于通用的 fallback 逻辑。默认fallback函数可以针对所有类型的异常(除了 exceptionsToIgnore 里面排除掉的异常类型)进行处理。若同时配置了 fallback 和 defaultFallback,以fallback为准。函数要求:
返回类型与原方法一致
方法参数列表为空,或者有一个Throwable类型的参数
默认需要和原方法在同一个类中,若希望使用其他类的函数,可配置fallbackclass,并指定fallbackClass里面的方法。 - exceptionsToIgnore:指定排除掉哪些异常。排除的异常不会计入异常统计,也不会进入fallback逻辑,而是原样抛出
- exceptionsToTrace:需要trace的异常
修改接口代码,增加@SentinelResource注解
@RestController
public class UserController {
@GetMapping(value = "/getuser")
@SentinelResource(value = "user",blockHandler = "getUserHandler",blockHandlerClass = UserController.class)
public String getUser(String userId) {
if (StringUtils.isNotEmpty(userId) && userId.equals("123456")){
return "用户存在";
}
return "用户不存在";
}
public static String getUserHandler(String userId, BlockException e) {
return "不好意思,前方拥挤,请您稍后再试";
}
@GetMapping("/adduser")
public String sentinelB(){
return "增加用户";
}
}
修改nacos的配置后,发布
重复点击http://localhost:9090/getuser?userId=123456测试
参考:https://blog.csdn.net/qq_42682745/article/details/121172500