这个第三个组件好好学了一下 也有很多坑坑洼洼的
对大规模并发请求 进行流量防护控制管理
大白话就是:规则管理器
首先下载sentinel jar包
https://gitcode.com/gh_mirrors/sentine/Sentinel
输入cmd命令:启动服务
java -jar jar包
默认8080端口号 打开sentinel控制台
说完了 下载 接下来介绍功能 三步走
一.规则
参考:https://developer.aliyun.com/article/1392703
1.流控规则
阀值类型QPS(每秒查询率)单机阈值 1 每秒一个查询
流控模式:
直接:统计当前资源的请求,触发阈值时对当前资源直接限流,也是默认的模式
关联:统计与当前资源相关的另一个资源,触发阈值时,对当前资源限流
链路:统计从指定链路访问到本资源的请求,触发阈值时,对指定链路限流
流控效果:
-快速失败 超过立即拒绝
-Warm up 缓慢 直到达到最大值 拒绝
-排队等待 匀速间隔进行 超过最大时长拒绝(漏桶算法)
2.熔断规则
-最大RT 最大响应时长
-熔断时长 故障后 切断的时长
-比例阀值 百分比决定是否触发熔断机制
3.系统规则
对整个应用整体保护
4.热点规则
用于监控和限制对某些高流量资源的访问
5.授权规则
设置白名单黑名单
下面用例子来验证:
引入sentinel依赖:
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
依旧是order订单 调用 product订单
正常访问后 sentinel控制台出现:
此时你可以看到几个规则配置 假设我们先来流控限制
流控规则
让其阀为1 模拟高流量访问 大量刷新
大量访问后 出现错误 流控规则生效
也可以通过实时监控看到
熔断规则
效果同上一致 但其区别在于 我理解是在规定时间断掉
热点规则
假设我们 一个带有id参数访问
@GetMapping("/hava_id/{id}")
@SentinelResource(value = "fangfang")
public String havaIds(@PathVariable long id) {
return "得到id:" + id;
}
注意注意:要使用 @SentinelResource 注解来配置热点规则
后面再详细介绍它的作用
假设我们设置一个热点例外值 long型的5 可以不受热点限制
其他id值访问会收到热点限制 而我们配置的例外5则不会

这就是和流控规则的区别
热点参数规则及其例外项的配置通常存储在配置中心
这些配置会被 Sentinel 持久化,并在应用启动时加载
授权规则
添加白名单 只有参数值gao用户可以正常 其他限制
用RequestOriginParser的parseOrigin方法验证
(RequestOriginParser 是一个接口,通常用于定义解析请求来源的规则)
@Component
public class SentinelRequestOriginParser implements RequestOriginParser {
@Override
public String parseOrigin(HttpServletRequest request) {
String user = request.getHeader("gaoyuan");
if (user == null||user.equals("")) {
return "unknown";
}
return user;
}
}
注意你的是getHeader 需要在头信息包含
这里用postman模拟验证测试 访问失败
这时候你加上头参数 传过去 则会成功访问
二.sentinel关于Blocked
接下来就介绍使用sentinel错误限流后返回我们想要自定义的东西
就是实际中用户看得懂的信息
1.自定义BlockPage页面
为的是规则限制后返回一个我们自定义的页面
编写页面
//自定义BlockPage页面
@RestController
@RequestMapping ("/error")
public class Blocked_Page_Exception {
@RequestMapping("/Blocked")
public String SentinelBlocked(){
String blocked="这是俺自定义的BlockPage页面";
return blocked;
}
}
然后仅需要在配置文件加入:
spring.cloud.sentinel.block-page=/error/Blocked
限制规则后 大量访问 效果如图
2.Fallback
其实就是一个fallbackAOP切面
首先你需要使用到@SentinelResource
开启配置:
@Configuration
//proxyTargetClass:指定是否使用 CGLIB 代理 exposeProxy:将代理对象暴露给当前线程的变量中
@EnableAspectJAutoProxy(proxyTargetClass = true,exposeProxy = true)
public class SentinelFallbackConfig {
@Bean
public SentinelResourceAspect sentinelResource(){
return new SentinelResourceAspect();
}
}
介绍:@SentinelResource 注解来配置熔断降级策略
在其访问上加入注解 value为此路径下的一个标识 fallback为触发规则后 调用的方法
@SentinelResource(value = "gaogaogao",fallback = "gao_fallback")
public String gao_fallback() {
return "自定义的fallback";
}
限流大量访问后
Fallback和自定义BlockPage页面区别:
Fallback:流控或熔断后执行一些备用逻辑(每一个具体的)
自定义BlockPage:限流或熔断时更专注于返回一个固定的HTML页面(整体的)
Fallback拥有最高的优先调度
(可以同时开启 自行验证)
3.BlockHandlerClass
其实就是实现BlockException
还是用到@SentinelResource
自定义一个BlockHandlerClass
public class Block_Handler_Exception {
public String Fang_Block_Handler(BlockException e) {
AbstractRule rule = e.getRule();
return "这是自定义BlockHandler" + rule;
}
}
主要运用这两个类 里面有各种规则异常
在其访问上加入注解
@SentinelResource(value = "gaogaogao",blockHandlerClass = Block_Handler_Exception.class, blockHandler = "Fang_Block_Handler")
blockHandlerClass这个就是你自定义的类 blockHandler就是触发时调用的方法
限流大量访问后
三.sentinel持久化(搭配nacos)
sentinel控制台实时监控是临时性的 非持久化的
要想实现就得配置
这里的坑也踩了半天搞出来的
参考:https://developer.aliyun.com/article/897365
依赖:
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
配置文件设置:
spring.cloud.sentinel.datasource.flow_ds.nacos.server-addr=nacos所在位置
spring.cloud.sentinel.datasource.flow_ds.nacos.data-id=id名字
spring.cloud.sentinel.datasource.flow_ds.nacos.group-id=组名
spring.cloud.sentinel.datasource.flow_ds.nacos.data-type=json
spring.cloud.sentinel.datasource.flow_ds.nacos.rule-type=flow
nacos创建配置
注意要对应类似于Data ID之类的
至于每个含义 参考AI解释 很好理解:
resource
资源名称,通常是一个接口路径或方法标识。
limitApp
流控针对的应用来源。
如果设置为"default",表示不限制来源应用;否则可以指定某个具体应用进行限制。
grade
流控规则的类型:
0:基于并发线程数进行流控。
1:基于QPS(每秒请求数)进行流控。
count
流控阈值:
如果grade=1,表示允许的最大QPS。
如果grade=0,表示允许的最大并发线程数。
strategy
流控策略:
0:直接限流(默认)。
1:关联限流,当关联资源达到阈值时,会限制当前资源的访问。
2:链路限流,仅对指定链路上的流量生效。
controlBehavior
流控效果:
0:快速失败(默认),超过阈值后直接拒绝请求。
1:排队等待,超出阈值的请求会排队等待处理,直到超时或资源可用。
2:暖启动,适用于系统刚启动时逐步增加流量。
clusterMode
是否启用集群模式:
false:单机模式,流控规则只在本地生效。
true:集群模式,规则会在整个集群范围内生效(需配合Sentinel集群支持组件使用)。
无论重启项目 设置过的限制持久化存在
至于nacos修改同步到sentinel 需要改变源码
有丢丢复杂哦 就不做赘述
参考:https://blog.csdn.net/zhuocailing3390/article/details/123257774
视频学习来自:
尚硅谷:
https://www.bilibili.com/video/BV1UJc2ezEFU/?spm_id_from=333.1007.top_right_bar_window_default_collection.content.click
李兴华:https://www.bilibili.com/video/BV1DL4y1h75M/spm_id_from=333.1007.top_right_bar_window_default_collection.content.click&vd_source=eb2341710c995d8261ecc99fdd066ba7























浙公网安备 33010602011771号