这个第三个组件好好学了一下 也有很多坑坑洼洼的

image

对大规模并发请求 进行流量防护控制管理

大白话就是:规则管理器

首先下载sentinel jar包

https://gitcode.com/gh_mirrors/sentine/Sentinel

image

输入cmd命令:启动服务
java -jar jar包

image

默认8080端口号 打开sentinel控制台

image


说完了 下载 接下来介绍功能 三步走

一.规则

参考: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控制台出现:
image

此时你可以看到几个规则配置 假设我们先来流控限制

流控规则

让其阀为1 模拟高流量访问 大量刷新
image
大量访问后 出现错误 流控规则生效
image
也可以通过实时监控看到
image

熔断规则

效果同上一致 但其区别在于 我理解是在规定时间断掉
image

热点规则

image

假设我们 一个带有id参数访问
    @GetMapping("/hava_id/{id}")
    @SentinelResource(value = "fangfang")
    public String havaIds(@PathVariable long id) {
        return "得到id:" + id;
    }

注意注意:要使用 @SentinelResource 注解来配置热点规则
后面再详细介绍它的作用

假设我们设置一个热点例外值 long型的5 可以不受热点限制
image

其他id值访问会收到热点限制 而我们配置的例外5则不会
image

image

这就是和流控规则的区别
热点参数规则及其例外项的配置通常存储在配置中心
这些配置会被 Sentinel 持久化,并在应用启动时加载

授权规则

添加白名单 只有参数值gao用户可以正常 其他限制
image

用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模拟验证测试 访问失败
image
这时候你加上头参数 传过去 则会成功访问
image


二.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

限制规则后 大量访问 效果如图
image

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";
    }

限流大量访问后
image

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;
    }
}

主要运用这两个类 里面有各种规则异常
image
image

在其访问上加入注解
@SentinelResource(value = "gaogaogao",blockHandlerClass = Block_Handler_Exception.class, blockHandler = "Fang_Block_Handler")
blockHandlerClass这个就是你自定义的类 blockHandler就是触发时调用的方法

限流大量访问后
image


三.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创建配置
image

注意要对应类似于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集群支持组件使用)。

无论重启项目 设置过的限制持久化存在
image

至于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

posted on 2025-03-08 19:20  蒸饺  阅读(303)  评论(0)    收藏  举报