Sentinel 搭建应用层面与网关层面的流控保护

源码:妖精的尾巴/spring-cloud-alibaba 

Nacos 和 Sentinel Dashboard 我这里全是使用window 本地运行的,需要自行下载运行

  1. 服务层面

    • 当你在某个具体的服务上使用Sentinel时,更多的是关注该服务内部资源的保护。例如,你可以针对服务中的某些方法或者接口进行流量控制、熔断降级等操作。
    • 在这个级别上应用Sentinel,可以直接影响到服务自身的稳定性和可用性,防止由于依赖的服务不可用导致的雪崩效应。
    • 可以使用注解的AOP方式,轻松实现资源的保护

具体做法在具体某个微服务单独引入 

       <dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency>

 这里解释一下,为什么是必须是静态方法,底层原理是,通过切点对象获取方法上的注解@SentinelResource,然后getBlockHandlerClass () 拿到类名,最后直接通过类名调用方法,能被类直接调用的方法那必须是静态的。

2. 网关层面

  • 在网关层(如Spring Cloud Gateway或Zuul)使用Sentinel,可以帮助你对进入系统的请求进行流量控制和管理。这通常涉及到API级别的限流、熔断以及热点参数限流等。
  • 通过集成Sentinel的Gateway Filter,你可以为每个路由或全局设置限流规则,这样就可以根据需要限制到达后端服务的请求速率。
  • 网关层使用Sentinel的优势在于它可以作为整个系统的第一道防线,保护下游服务免受突发流量的影响。

后续补充:spring-cloud-alibaba-sentinel-gateway 如何从流量第一入口全局流控或者针对某个接口做流控

父工程pom,   注意 spring-boot + spring-cloud + spring-cloud-alibaba版本适配 

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.ldj.springcloud</groupId><artifactId>spring-cloud-alibaba</artifactId><version>1.0-SNAPSHOT</version><description>父工程</description><packaging>pom</packaging><!--组件版本管理器--><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.3.12.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><!--子工程--><modules><module>common</module><module>order-service</module><module>stock-service</module><module>user-service</module><module>gateway-service</module></modules><properties><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target><fastjson.version>1.2.60</fastjson.version><spring.cloud.version>Hoxton.SR8</spring.cloud.version><spring.cloud.alibaba.version>2.2.5.RELEASE</spring.cloud.alibaba.version><jsr305.version>3.0.2</jsr305.version><commons-pool2.version>2.11.1</commons-pool2.version></properties><!--自定义全局版本控制--><dependencyManagement><dependencies><!--spring-cloud--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring.cloud.version}</version><type>pom</type><scope>import</scope></dependency><!--spring-cloud-alibaba--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring.cloud.alibaba.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><dependency><groupId>com.google.code.findbugs</groupId><artifactId>jsr305</artifactId><version>${jsr305.version}</version><scope>runtime</scope></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId><version>${commons-pool2.version}</version></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><skip>true</skip><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude><exclude><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId></exclude></excludes></configuration></plugin></plugins></build>
</project>
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><artifactId>spring-cloud-alibaba</artifactId><groupId>com.ldj.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><groupId>com.ldj</groupId><artifactId>gateway-service</artifactId><version>0.0.1-SNAPSHOT</version><name>gateway-service</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><!-- Nacos注册中心 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- Nacos配置中心 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- Spring Cloud Gateway --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- Spring Cloud Sentinel-Gateway --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId></dependency><!-- 这是核心启动器,必须添加!--><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-sentinel</artifactId></dependency><!-- 这个依赖是动态加载规则的关键! --><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-nacos</artifactId></dependency><dependency><groupId>com.alibaba.csp</groupId><artifactId>sentinel-datasource-extension</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

 bootstrap.properties  (配置全部迁移到Nacos)

# Nacos注册中心(9100主动注册到nacos并发送心跳)
spring.cloud.nacos.discovery.server-addr=localhost:8848
spring.cloud.nacos.discovery.namespace=23437cd8-f0c8-4570-8a52-a0db8fd25027
spring.cloud.nacos.discovery.group=DEFAULT_GROUP# Nacos配置中心
spring.cloud.nacos.config.server-addr=localhost:8848
spring.cloud.nacos.config.namespace=23437cd8-f0c8-4570-8a52-a0db8fd25027
# 主配置文件
spring.cloud.nacos.config.extension-configs[0].data-id=application.yml
spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[0].refresh=true
# 流控规则文件
spring.cloud.nacos.config.extension-configs[1].data-id=fcr.yml
spring.cloud.nacos.config.extension-configs[1].group=DEFAULT_GROUP
spring.cloud.nacos.config.extension-configs[1].refresh=true

 application.yml

server:port: 9100spring:application:name: gateway-servicecloud:gateway:routes:- id: user_service_routeuri: lb://user-servicepredicates:- Path=/api/user/**filters:- StripPrefix=1sentinel:filter:enabled: true  # 确保启用了网关适配transport:dashboard: localhost:8033 # Sentinel控制台地址datasource:# 限流规则flow-rules:nacos:server-addr: localhost:8848 # 使用已存在的Nacos服务器地址namespace: 23437cd8-f0c8-4570-8a52-a0db8fd25027 # 命名空间dataId: fcr.json # 确保这个dataId与Nacos中的限流规则配置文件名一致groupId: DEFAULT_GROUPrule-type: gw-flow # 规则类型:限流(gw-flow)data-type: json# 除限流规则还有下面这些规则,这里不演示了#        # 降级规则
#        degrade-rules:
#          nacos:
#            server-addr: localhost:8848
#            namespace: 23437cd8-f0c8-4570-8a52-a0db8fd25027
#            dataId: degrade-rules.json # Nacos中存储降级规则的文件名
#            groupId: DEFAULT_GROUP
#            rule-type: degrade # 规则类型:降级(degrade)
#
#        # 系统保护规则
#        system-rules:
#          nacos:
#            server-addr: localhost:8848
#            namespace: 23437cd8-f0c8-4570-8a52-a0db8fd25027
#            dataId: system-rules.json # Nacos中存储系统保护规则的文件名
#            groupId: DEFAULT_GROUP
#            rule-type: system # 规则类型:系统(system)
#
#        # 授权规则
#        authority-rules:
#          nacos:
#            server-addr: localhost:8848
#            namespace: 23437cd8-f0c8-4570-8a52-a0db8fd25027
#            dataId: authority-rules.json # Nacos中存储授权规则的文件名
#            groupId: DEFAULT_GROUP
#            rule-type: authority # 规则类型:授权(authority)
#
#        # 热点参数限流规则
#        param-flow-rules:
#          nacos:
#            server-addr: localhost:8848
#            namespace: 23437cd8-f0c8-4570-8a52-a0db8fd25027
#            dataId: param-flow-rules.json # Nacos中存储热点参数限流规则的文件名
#            groupId: DEFAULT_GROUP
#            rule-type: param-flow # 规则类型:热点参数限流(param-flow)

 fcr.json (流控规则配置文件) 这个json 使用nacos作为存储  ,它和你在可视化控制面板配置的数据是一样的

[{"resource": "user_service_route","count": 1,"grade": 1,"limitApp": "default","strategy": 0,"controlBehavior": 0}
]

配置项说明: 

[{"resource": "/get/**",           // 要限流的资源,这里是匹配所有以 /get/ 开头的URL路径"count": 5,                      // 限流阈值,表示每秒最多允许5个请求通过"grade": 1,                      // 限流阈值类型:1 表示基于QPS(每秒请求数)进行限流"limitApp": "default",           // 限制的应用,default 表示对所有调用方生效"strategy": 0,                   // 限流策略:0 表示根据调用关系(直接)进行限流"controlBehavior": 0             // 流控效果:0 表示快速失败(请求超过阈值时直接拒绝)}
]

针对maven依赖说明:

1. 单独引入spring-cloud-starter-alibaba-sentinel 用于保护普通的 Spring MVC 控制器(Controller)。

2. spring-cloud-starter-alibaba-sentinel-gateway 是专门为 Spring Cloud Gateway 设计的,它利用了 Gateway 的过滤器机制来集成 Sentinel。

踩坑!!!!!!

对于普通应用,Sentinel 的限定资源通常是 Controller 的方法名或 URL 路径。

对于 Gateway 应用,Sentinel 的资源默认是 路由 ID (Route ID),而不是你配置的 Path 路径!

也就是说,Sentinel 看到的资源是 user_service_routeapplication.yml 里定义的 id),而不是 /api/user/**

所以 这样写是不生效的

[{"resource": "/api/user/**",  // 无效写法"count": 1,"grade": 1,"limitApp": "default","strategy": 0,"controlBehavior": 0}
]

方式一:针对 路由 ID (Route ID) 配置规则 

[{"resource": "user_service_route", // 改为你的路由ID"count": 1,"grade": 1,"limitApp": "default","strategy": 0,"controlBehavior": 0}
]
方式二(推荐):针对 自定义 API 分组 (API Definition Group) 配置规则(在控制面板操作)

这种方式更灵活,可以基于路径模式(Path)来限流,更符合你的初衷。

  1. 首先,在 Sentinel 控制台配置 API 管理

    • 登录 Sentinel 控制台。
    • 找到你的 gateway-service 应用。
    • 进入 "网关流控" -> "API 管理"
    • 点击 "新增API"
    • 填写:
      • API 名称: 例如 user-api
      • 匹配规则: 添加一条规则
        • 类型PATH
        • 匹配模式/api/user/** (选择 MATCH_STR 或 ANT 模式)
    • 保存。  
  2. 然后,配置针对该 API 分组的流控规则

    • 在 "网关流控" -> "网关流控规则" 页面。
    • 点击 "新增网关流控规则"
    • 填写:
      • 资源模式API 名称 (选择你刚创建的 user-api)
      • 资源名称user-api (下拉选择)
      • Burst: 0 (或根据需要)
      • 阈值类型QPS
      • 单机阈值1
      • 流控方式直接
    • 保存。

效果:这个规则会精确地限制所有匹配 /api/user/** 路径的请求,QPS 为 1。即使你有多个路由,只要路径符合,都会被这个规则限制。

注意!!!如果这里没展示出网关流控规则数据,一般是没开启gateway 的过滤器功能

注意!!! 或者是规则类型写错

测试效果:狂按发送请求 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/91342.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/91342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

纯血鸿蒙 AudioRenderer+AudioCapturer+RingBuffer 实现麦克风采集+发声

总共两个类&#xff0c;放到代码里&#xff0c;就可以快速完成K歌的效果&#xff0c;但应用层这么做延迟是比较高的&#xff0c;只是做一个分享。 类代码 import { audio } from kit.AudioKit; import { BusinessError } from kit.BasicServicesKit; import { AudioBufferFlow,…

洛谷 P1601 A+B Problem(高精)普及-

题目描述 高精度加法&#xff0c;相当于 ab problem&#xff0c;不用考虑负数。 输入格式 分两行输入。a,b≤10500a,b \leq 10^{500}a,b≤10500。 输出格式 输出只有一行&#xff0c;代表 ababab 的值。 输入输出样例 #1 输入 #1 1 1输出 #1 2输入输出样例 #2 输入 #2 1001 909…

Matrix Theory study notes[6]

文章目录linear spacereferenceslinear space a basis of linear space VkV^kVk,which is x1,x2,...xkx_1,x_2,...x_kx1​,x2​,...xk​,can be called as a coordinate system.let vector v∈Vkv \in V^kv∈Vk and it can be linear expressed on this basis as va1x1a2x2...…

专线与专线之间的区别

下面我们从定义、技术特点、适用场景、优缺点等多个维度来详细对比&#xff1a;✅ 一、四种方案简要定义技术方案定义MPLS 专线运营商基于 MPLS 技术提供的私有虚拟网络&#xff0c;逻辑隔离、安全可靠VPN over Internet利用公网加密通道&#xff08;如IPSec&#xff09;构建虚…

Git工作流:团队协作的最佳实践

目录 一、什么是 Git 工作流&#xff1f;为什么需要它&#xff1f; 二、基础&#xff1a;Git 分支核心概念 三、主流 Git 工作流实战指南 1. 集中式工作流&#xff08;Centralized Workflow&#xff09;&#xff1a;适合小团队 / 新手 操作步骤&#xff1a; 优缺点&#…

算法竞赛阶段二-数据结构(35)数据结构单链表模拟实现

//链表--链式存储的线性表 //存信息和下一个节点位置&#xff0c;数据域和指针域合起来叫节点 //带头&#xff08;哨兵位&#xff09;下标为0 //单向&#xff0c;双向&#xff0c;循环链表 //实现 单 //俩足够大数组 // elem&#xff0c;数据域 // next &#xff0c;指针域…

《Computational principles and challenges in single-cell data integration》

1. 引言&#xff1a;单细胞数据整合的背景与重要性单细胞基因组学技术&#xff08;如scRNA-seq、scATAC-seq等&#xff09;近年来快速发展&#xff0c;能够以单细胞分辨率揭示细胞异质性和分子机制。然而&#xff0c;不同实验、样本和数据模态&#xff08;如RNA表达、DNA甲基化…

蔚来汽车携手通义灵码入选 2025 世界人工智能大会标杆案例

7月28日&#xff0c;在2025年世界人工智能大会上&#xff0c;通义灵码助力蔚来汽车研发效能升级成功入选2025年“人工智能”行业标杆案例荟萃。蔚来汽车已有近 1000 名工程师常态化使用通义灵码&#xff0c;AI 生成代码占比超 30%&#xff0c;尤其在蔚来“天探”AI自检系统的建…

Spring Boot中的this::语法糖详解

文章目录前言什么是方法引用&#xff08;Method Reference&#xff09;基本语法方法引用的四种类型1. 静态方法引用2. 实例方法引用&#xff08;特定对象&#xff09;3. 实例方法引用&#xff08;任意对象&#xff09;4. 构造器引用this::在Spring Boot中的应用场景1. Service层…

VitePress学习笔记

VitePress学习笔记VitePress学习搭建和运行编写内容mdvue配置站点配置配置searchsearch 提示词替换使用第三方主题自定义主题设置文档根目录国际化文档navsidebarsearch其他插件vitepress插件markdown-it插件项目开发原始需求和方案自动化流程权限限制VitePress学习 搭建和运行…

C#_创建自己的MyList列表

定义一个数据自己的列表MyList 使用上述描述列表的方式(数组) 列表内也要定义属于自己的方法 例如 Sort排序 Add添加 等等....思路┌─────────────────────────────────────────────────────────────────…

记录Linux下ping外网失败的问题

最近在RK3568上进行开发测试&#xff0c;需要测试一下网络环境&#xff0c;能否通过浏览器访问外部网络。测试情况如下&#xff1a; 1、ping内网、网关ip能ping通 2、ping外网ping不通 情况分析&#xff1a; 1、ping外网失败&#xff08;ping 8.8.8.8也ping不通&#xff0c;说…

Redis 键值对操作详解:Python 实现指南

一、环境准备 1. 安装依赖库 pip install redis2. 连接 Redis 数据库 import redis# 创建 Redis 客户端连接 r redis.Redis(hostlocalhost, # Redis 服务器地址port6379, # Redis 端口db0, # 数据库编号&#xff08;0~15&#xff09;passwordNone, …

制造业企业大文件传输的痛点有哪些?

在全球化与数字化的浪潮下&#xff0c;制造业企业的大文件传输需求日益凸显&#xff0c;然而诸多痛点也随之而来&#xff0c;严重制约着企业的高效运营与发展。复杂网络环境导致传输稳定性差制造业企业常涉及跨地域、跨国的业务合作与数据交流&#xff0c;网络环境复杂多变。在…

低速信号设计之 MDIO 篇

一、引言​ 在服务器的网络子系统中,MDIO(Management Data Input/Output)总线虽然传输速率相对较低,却扮演着极为关键的角色。它主要负责在 MAC(Media Access Control)层器件与 PHY(Physical Layer)层器件之间搭建起通信的桥梁,实现对 PHY 层器件的有效管理与状态监控…

AR技术赋能航空维修:精度与效率的飞跃

在航空工业领域&#xff0c;飞机维修与装配的精度要求越来越高。传统的维修方法依赖人工操作和经验判断&#xff0c;容易产生误差。随着增强现实&#xff08;AR www.teamhelper.cn &#xff09;技术的引入&#xff0c;航空维修迎来了革命性的变化。本文将探讨AR技术在航空维修中…

设计模式实战:自定义SpringIOC(理论分析)

自定义SpringIOC&#xff08;理论分析&#xff09; 上一篇&#xff1a;设计模式开源实战&#xff1a;观察者模式不知道怎么用&#xff1f;手撕Spring源码中跟着大佬学编程 上一篇我们研究了大佬在Spring源码中使用的观察者模式&#xff0c;今天我们再来聊聊Spring的核心功能—…

人工智能如何改变项目管理:应用、影响与趋势

人工智能如何改变项目管理&#xff1a;应用、影响与趋势1. 人工智能如何提升项目规划与进度安排2. 人工智能在资源分配与优化中的应用3. 人工智能用于风险管理4. 人工智能用于团队协作与交流5. 人工智能用于项目监控与报告6. 集成人工智能的项目管理软件6.1 Wrike6.2 ClickUp6.…

【MySql】事务的原理

​ 【MySql】事务的原理数据库的隔离级别原理读未提交读已提交可重复读&#xff08;Repeatable Read&#xff09;串行化&#xff08;最高的隔离级别&#xff0c;强制事务串行执行&#xff0c;避免了所有并发问题&#xff09;MVCC&#xff08;Multi-Version Concurrency Control…

YOLO--目标检测基础

一、基本认知1.1目标检测的定义目标检测&#xff08;Object Detection&#xff09;&#xff1a;在图像或视频中检测出目标图像的位置&#xff0c;并进行分类和识别的相关任务。主要是解决图像是什么&#xff0c;在哪里的两个具体问题。1.2使用场景目标检测的使用场景众多&#…