文章目录
准备工作
POM
<!--SpringCloud ailibaba sentinel-datasource-nacos -->
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
<!--SpringCloud ailibaba sentinel -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
yml配置
spring:
application:
name: SYSTEM-SERVICE
sentinel:
transport:
dashboard: localhost:8080
port: 8719
datasource:
ds1:
nacos:
server-addr: IP:PORT #nacos服务器地址
dataId: ${spring.application.name}-SENTINEL.json
groupId: SYSTEM_GROUP
data-type: json
rule-type: flow
namespace: 816a22e3-068b-4729-adcd-73807baf9710 #命名空间
nacos配置sentinel文件
[
{
"resource": "queryDepartment",
"limitApp": "default",
"grade": "1",
"count": "5",
"strategy": "0",
"controlBehavior": "0",
"clusterMode": false
}
]
resource
:资源名,即限流规则的作用对象count
:限流阈值grade
:限流阈值类型(QPS 或并发线程数)limitApp
:流控针对的调用来源,若为 default 则不区分调用来源strategy
:调用关系限流策略controlBehavior
:流量控制效果(直接拒绝、Warm Up、匀速排队)clusterMode
:是否集群
后台使用
业务类
/**
* 获取部门表格
* @param commonRequest
* @return
*/
@PostMapping("/queryDepartment")
@SentinelResource(value = "queryDepartment", // 资源名
blockHandlerClass = CustomerBlockHandler.class, // 自定义限流处理类,当发生限流时,会去此类调用blockHandler
blockHandler = "handlerException") // 限流回调方法
public CommonResponse<List<DepartmentVo>> doQueryDepartment(@RequestBody CommonRequest<DepartmentQueryVo> commonRequest){
log.info("成功进入【获取部门表格】,commonRequest:{}", commonRequest.toString());
return CommonResponse.Builder.success(pageInfo);
}
自定义限流处理类
public class CustomerBlockHandler {
// 注意1:返回值类型必须与业务方法的返回值类型相同
// 注意2:参数必须有业务方法参数,且最后增加一个 BlockException exception
// 注意3:此方法必须是static
public static CommonResponse handlerException(@RequestBody CommonRequest commonRequest, BlockException exception){
return CommonResponse.Builder.fail(ExceptionEnum.GATEWAY_EXCEPTION.getCode(), "系统繁忙,请稍后再试!");
}
}
sentinel控制台
我们可以通过部署sentinel的 ip:port 来访问sentinel控制台,默认账号密码都是sentinel
刚进去时首页一般都是空的,因为sentinel是懒加载机制,只有当服务发起了请求,控制台才能看到并进行操作。
簇点链路
显示了该服务发起的请求列表
流控规则
这里是我配置的一个流控规则
流控模式
直接
直接->快速失败为默认效果
QPS
:表示1秒钟内点击的次数单机阈值
:若1秒内请求次数超过该阈值则直接快速失败
默认返回:Blocked by Sentinel(flow limiting)
关联
- 是什么
当关联的资源达到阈值时,就限流自己
流控效果
直接->快速失败(默认的流控处理)
直接失败,抛出异常:Blocked by Sentinel(flow limiting)
预热
公式:阈值除以coldFactor(默认值为3),经过预热时长后才会达到阈值
应用场景:秒杀系统在开启瞬间,会有很多流量上来,很可能把系统打死,预热方式就是为了保护系统,可慢慢的把流量放进来,慢慢的把阈值增长到设置的阈值。
排队等待
注意:匀速排队,阈值必须设置为QPS
规则持久化
是什么
一旦我们重启应用,sentinel规则消失,生产环境需要将配置规则进行持久化
怎么玩
将限流规则持久进Nacos保存,只要触发某个请求,sentinel控制台的流控规则就能看得到,只要Nacos里面的配置不删除,针对服务上的流控规则持续有效