Sentinel是面向分布式服务框架的轻量级流量控制框架,主要以流量为切入点,从流量控制,熔断降级,系统负载保护等多个维度来维护系统的稳定性。
启动nacos-server:2.0.3
./nacos/bin/startup.cmd
启动sentinel:1.8.2服务器
sentinel搞个bat命令
java -server -Xms64m -Xmx256m -Dserver.port=8858 -Dcsp.sentinel.dashboard.server=127.0.0.1:8858 -Dproject.name=sentinel-dashboard -jar F:/tools/springcloud-alibaba/sentinel/sentinel-dashboard-1.8.2.jar
sentinel实现限流
导包:
<!--springcloud alibaba sentinel-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-core</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
配置application.yml:我将sentinel交给nacos管理。
server:
port: 3801
spring:
application:
name: teacher-service
devtools:
restart:
enabled: true #设置开启热部署
additional-paths: src/main/java #重启目录
exclude: WEB-INF/**
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848/
sentinel:
transport:
# sentinel服务端地址
dashboard: 127.0.0.1:8858
# 取消延迟加载
eager: true
datasource:
ds:
nacos:
server-addr: 127.0.0.1:8848
data-id: ${spring.application.name}-sentinel
group-id: DEFAULT_GROUP
rule-type: flow
一般限流组件,都会提供,fallback,达到阙值返回信息:
@SentinelResource(value="listTeacher", fallback = "fallbackResult")
@GetMapping("/list")
public ResultModel<Object> listTeacher() {
ResultModel<Object> resultModel = new ResultModel<>();
resultModel.setMsg("查询教师列表");
resultModel.setRes(data);
return resultModel;
}
public ResultModel<Object> fallbackResult() {
ResultModel<Object> resultModel = new ResultModel<>();
resultModel.setCode(500);
resultModel.setSuccess(false);
resultModel.setMsg("当前系统已经达到阙值,请稍后访问!");
resultModel.setTime(TimeUtil.getNowTime());
log.info("flow exception:" + "当前系统已经达到阙值,请稍后访问!");
return resultModel;
}
在sentinel平台配置限流选项:
使用jmeter压测:
在第三个请求,开始出现系统限流返回:
sentinel实现限流持久化
问题:我发现每次我重启项目之后,发现之前配置的限流,都找不到了。还需要重新配置,很麻烦。
我将sentinel托管给nacos管理持久化:
yml文件:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848/
sentinel:
transport:
# sentinel服务端地址
dashboard: 127.0.0.1:8858
# 取消延迟加载
eager: true
datasource:
ds:
nacos:
server-addr: 127.0.0.1:8848 #nacos服务器地址
data-id: ${spring.application.name}-sentinel #数据唯一id
group-id: DEFAULT_GROUP #所属组
rule-type: flow # flow代表流程控制,degrade代表熔断规则
nacos控制台配置:
[
{
"resource": "listTeacher",
"limitApp": "default",
"grade": 1,
"count": 3,
"strategy": 0,
"controlBehavior": 0,
"clusterMode": false
}
]
resource:资源名,即限流规则的作用对象
limitApp:流控针对的调用来源,若为 default 则不区分调用来源
grade:限流阈值类型(QPS 或并发线程数);0 代表根据并发数量来限流,1 代表根据 QPS 来进行流量控制
count:限流阈值
strategy:调用关系限流策略
controlBehavior:流量控制效果(直接拒绝、Warm Up、匀速排队)
clusterMode:是否为集群模式
注意:dataid和group应与配置对应
查看nacos是否将配置写入到数据库中:
sentinel平台查看:
sentinel实现熔断
server:
port: 3802
spring:
application:
name: student-service
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848/
sentinel:
transport:
# sentinel服务端地址
dashboard: 127.0.0.1:8858
# 取消延迟加载
eager: true
datasource:
ds:
nacos:
server-addr: 127.0.0.1:8848
data-id: ${spring.application.name}-sentinel-degrade
group-id: DEFAULT_GROUP
rule-type: degrade
一般熔断组件,都会提供,fallback,达到熔断返回信息:
@Log
@RequestMapping("/student")
@RestController
public class StudentController {
@SentinelResource(value="getStudent", fallback = "fallbackResult")
@GetMapping("/get")
public ResultModel<String> getStudent(){
ResultModel<String> resultModel = new ResultModel<String>();
resultModel.setMsg("查询学生信息成功");
resultModel.setRes("学生名称为李四");
throw new CommonException("自行抛出异常");
//return resultModel;
}
public ResultModel<Object> fallbackResult() {
ResultModel<Object> resultModel = new ResultModel<>();
resultModel.setCode(500);
resultModel.setSuccess(false);
resultModel.setMsg("当前系统已经熔断,请稍后访问!");
resultModel.setTime(TimeUtil.getNowTime());
log.info("flow exception:" + "当前系统已经熔断,请稍后访问!");
return resultModel;
}
}
在sentinel平台配置熔断选项:
RT(平均响应时间):
当资源的平均响应时间超过阈值之后,资源进入准降级状态。接下来如果持续进入 5 个请求,它们的 RT 都持续超过这个阈值,那么在接下的时间窗口之内,对这个方法的调用都会自动抛出 DegradeException 异常。在下一个时间窗口到来时, 会接着再放入 5 个请求, 再重复上面的判断.
异常比例
当资源的每秒异常总数占通过量的比值超过阈值之后,资源进入降级状态,即在接下的时间窗口之内,对这个方法的调用都会自动地抛出 DegradeException 异常。异常比率的阈值范围是 [0.0, 1.0],代表 0% - 100%。
异常数
当资源近 1 分钟的异常数目超过阈值之后会进行熔断。
持久化配置:
[
{
"resource": "getStudent",
"count": 0.5,
"grade": 1,
"passCount": 0,
"timeWindow": 30
}
]
网友评论