【手把手】教你玩转SpringCloud Alibaba之Sentinel整合GateWay

news2025/1/19 11:24:37

1、网关流控介绍

在微服务系统中,网关提供了微服务系统的统一入口,所以在做限流的时候,肯定是要在网关层面做一个流量的控制,Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。

Sentinel 1.6.0 引入了 Sentinel API Gateway Adapter Common 模块,此模块中包含网关限流的规则和自定义 API 的实体和管理逻辑:
- GatewayFlowRule:网关限流规则,针对 API Gateway 的场景定制的限流规则,可以针对不同 route 或自定义的 API 分组进行限流,支持针对请求中的参数、Header、来源 IP 等进行定制化的限流;
- ApiDefinition:用户自定义的 API 定义分组,可以看做是一些 URL 匹配的组合。比如可以定义一个 API 叫 my_api,请求 path 模式为 /foo/** 和 /baz/**的都归到 my_api 这个 API 分组下面,限流的时候可以针对这个自定义的 API 分组维度进行限流;

其中网关限流规则 GatewayFlowRule的字段解释如下:
- resource:资源名称,可以是网关中的 route 名称或者用户自定义的 API 分组名称;
- resourceMode:规则是针对 API Gateway 的 route(RESOURCE_MODE_ROUTE_ID)还是用户在 Sentinel 中定义的 API 分组(RESOURCE_MODE_CUSTOM_API_NAME),默认是 route;
- grade:限流指标维度,同限流规则的 grade 字段;
- count:限流阈值;
- intervalSec:统计时间窗口,单位是秒,默认是 1 秒;
- controlBehavior:流量整形的控制效果,同限流规则的 `controlBehavior` 字段,目前支持快速失败和匀速排队两种模式,默认是快速失败;
- burst:应对突发请求时额外允许的请求数目;
- maxQueueingTimeoutMs:匀速排队模式下的最长排队时间,单位是毫秒,仅在匀速排队模式下生效;
- paramItem:参数限流配置。若不提供,则代表不针对参数进行限流,该网关规则将会被转换成普通流控规则;否则会转换成热点规则。其中的字段: 

- parseStrategy:从请求中提取参数的策略,目前支持提取来源 IP(PARAM_PARSE_STRATEGY_CLIENT_IP)、Host(PARAM_PARSE_STRATEGY_HOST)、任意 Header(PARAM_PARSE_STRATEGY_HEADER)和任意 URL 参数(PARAM_PARSE_STRATEGY_URL_PARAM)四种模式。

- fieldName:若提取策略选择 Header 模式或 URL 参数模式,则需要指定对应的 header 名称或 URL 参数名称;
- pattern:参数值的匹配模式,只有匹配该模式的请求属性值会纳入统计和流控;若为空则统计该请求属性的所有值。(1.6.2 版本开始支持);
- matchStrategy:参数值的匹配策略,目前支持精确匹配(PARAM_MATCH_STRATEGY_EXACT)、子串匹配(PARAM_MATCH_STRATEGY_CONTAINS)和正则匹配(PARAM_MATCH_STRATEGY_REGEX)(1.6.2 版本开始支持)

用户可以通过 GatewayRuleManager.loadRules(rules) 手动加载网关规则,或通过 GatewayRuleManager.register2Property(property) 注册动态规则源动态推送(推荐方式)

2、网关流控控制台

Sentinel 1.6.3 引入了网关流控控制台的支持,用户可以直接在 Sentinel 控制台上查看 API Gateway 实时的 route 和自定义 API 分组监控,管理网关规则和 API 分组配置。

在gateway-9999的pom文件中引入相关依赖:

修改gateway-9999的yml配置文件:

启动 gateway-9999 和 9002 服务,访问:http://localhost:9999/feenix/get,可以看到成功转发到9002服务:

来到Sentinel Dashboard控制台,可以看到当前已经有一个针对网关级别的控流管理:

【请求链路】中的API名称已经变为9002的服务名称,而不是原先服务中的某一个接口名称。

值得注意的是【间隔】和【Burst size】这两个设置。【间隔】指的是当每秒的请求超过QPS值,则会启动间隔。在间隔启动的这1秒内,所有调用这个接口直接返回,不去调用业务代码。【Burst size】指的是应对突发流量激增时额外允许的请求数目。  

直接新增一个规则:

通过Jmeter访问可以看出已经被限流:

手快点直接通过浏览器也可以看出效果:

将配置中的【间隔】改为1分钟,一旦被限流之后,不管怎么访问,在间隔启动的这1分钟内,所有的请求将全部被拒绝。将配置中的【Burst Size】改为5,通过Jmeter去测试流控,发现一共通过了7次请求:

也就是说当设置了【Burst Size】的值之后,应对流量激增时可以通过的请求数是QPS阈值+Burst Size。

细心的小伙伴或者会发现,这里限流的效果和之前的热点参数的限流效果一致。这点在官网上也有所解释,根据官方的说法是:当通过 GatewayRuleManager 加载网关流控规则(GatewayFlowRule)时,无论是否针对请求属性进行限流,Sentinel 底层都会将网关流控规则转化为热点参数规则(ParamFlowRule),存储在 GatewayRuleManager 中,与正常的热点参数规则相隔离。转换时 Sentinel 会根据请求属性配置,为网关流控规则设置参数索引(idx),并同步到生成的热点参数规则中。

外部请求进入 API Gateway 时会经过 Sentinel 实现的 filter,其中会依次进行 路由/API 分组匹配请求属性解析参数组装。Sentinel 会根据配置的网关流控规则来解析请求属性,并依照参数索引顺序组装参数数组,最终传入 SphU.entry(res, args) 中。Sentinel API Gateway Adapter Common 模块向 Slot Chain 中添加了一个 GatewayFlowSlot,专门用来做网关规则的检查。GatewayFlowSlot 会从 GatewayRuleManager 中提取生成的热点参数规则,根据传入的参数依次进行规则检查。若某条规则不针对请求属性,则会在参数最后一个位置置入预设的常量,达到普通流控的效果。

3、API分组限流

在日常生产环境中,直接对整个Route ID下的全服务都进行限流的情况极少,更多的还是对服务中某些特定的接口进行限流。这就必不可少的用到第二种方式,API分组限流。

精确

在Sentinel Dashboard中新增一个自定的API,通过【精确】方式进行匹配:

在API分组中选择刚刚新增的API名称:

使用Jmeter进行访问,可以看到已经被成功限流:

前缀

在Sentinel Dashboard中新增一个自定的API,通过【前缀】方式进行匹配:

在API分组中选择刚刚新增的API名称:

使用Jmeter进行访问,可以看到已经被成功限流:

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

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

相关文章

R语言隐马尔可夫模型HMM识别不断变化的市场条件

了解不同的市场状况如何影响您的策略表现可能会对您的收益产生巨大的影响。最近我们被客户要求撰写关于隐马尔可夫模型的研究报告,包括一些图形和统计输出。 某些策略在波动剧烈的市场中表现良好,而其他策略则需要强劲而平稳的趋势,否则将面…

【PdgCntEditor】解决PDF的目录页码和PDF实际页码不一致的问题,书签页码偏移页面偏移功能,PDF页面标签的添加

一、问题背景 大部分的图书对应的PDF,目录中的页码并非PDF中直接索引的页码,两者之间存在一定的偏移值;导致我们看目录后面的页码,并不能直接借此数字索引到对应页面,非常麻烦。 二、改变页码标签 这是第一种方法&…

电脑技巧:Win10粘贴文件到C盘提示没有权限的解决方法

❤️作者主页:IT技术分享社区 ❤️作者简介:大家好,我是IT技术分享社区的博主,从事C#、Java开发九年,对数据库、C#、Java、前端、运维、电脑技巧等经验丰富。 ❤️个人荣誉: 数据库领域优质创作者🏆&#x…

VMware升级手册

1. 概述 1.1 实施范围 本次实施涉及上海SMVIC虚拟化平台的7台物理服务器、7台ESXI节点、一台VC(6.7升级到7.0),以及广德、如皋两个集群迁移到7.0VC。 1.2 实施内容 本项目中需要实施内容包括: 2. 前置准备 升级确认: 3. WBS 4. 实施过程 4.1 VC部署 运行安装包,点击…

R语言生存分析数据分析可视化案例

目标 本文的目的是对如何在R中进行生存分析进行简短而全面的评估。关于该主题的文献很广泛,仅涉及有限数量的(常见)问题。最近我们被客户要求撰写关于生存分析的研究报告,包括一些图形和统计输出。 可用的R包数量反映了对该主题的…

SpringBoot 配置文件这样加密,才足够安全!

1. 前景 在使用Springboot时,通常很多信息都是在application.yml中直接明文配置的,比如数据库链接信息,redis链接信息等等。但是这样是不安全的。 所以需要对敏感数据进行加密,这样防止密码泄露 Jasypt这个库为我们解决了这个问…

[附源码]计算机毕业设计springboot-大学生健康档案管理

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

初识Pytest自动化测试框架,我彻底懂了

初识Pytest Pytest是Python实现的一个测试工具,可以用于所有类型和级别的软件测试。 Pytest是一个可以自动查找到你编写的用例并运行后输出结果的测试框架。 Pytest的特点: 是一个命令行工具,编写用例简单,可读性强非常容易上手…

2023年高企申报准备工作,明光市企业可以提前做这些准备

为了帮助企业提前准备和更好地开展2023年高新技术企业认定申报工作,安徽省大力鼓励企业申报高新技术企业,相应出台了相关政策,同时对于高企申报也有很多奖补,下面小编汇总了滁州市2023年申报,企业提前准备工作有哪些。…

黑群晖从入门到入土,自编译适合自己硬件的黑群晖7.1.x引导(黑群晖DSM7.X引导用arpl编译教程)

写在前面的话 没啥好说的,只需要感谢在GitHub上开源代码的巴西老哥就好,好了废话不多说直接开始。 黑群晖DSM7.X引导用arpl编译教程写在前面的话一、需要的软硬件清单二、制作引导盘1、下载arpl镜像2.1.1、制作PE启动盘,这是使用msata硬盘或…

3. Vue.js 3.0 响应式系统原理

1.响应式系统原理-介绍 接下来通过模拟Vue3的响应式系统来深入了解它内部的工作原理。先来回顾一下Vue3重写了响应式系统,和Vue2相比,Vue3的响应式系统底层采用proxy对象实现,在初始化的时候不需要遍历所有的属性,把属性通过defi…

C语言——结构体(入门)

文章目录1.结构体的声明1.1.结构体是什么?1.2.结构体的声明1.3.结构体的定义和初始化2.结构体成员的访问3.结构体传参1.结构体的声明 1.1.结构体是什么? 在生活中往往很难用一个准确的数据类型来描述一个物体,例如一本书,描述它…

编码技巧——Mybatis分页插件PageHelper使用

本篇介绍Mybatis分页插件PageHelper的使用,本质上是Mybatis拦截器起作用,在执行目标SQL之前添加count语句及拼接limit到目标SQL后面,这里不再赘述,Mybatis拦截器相关知识可参考Mybatis——拦截器Interceptor,本篇仅简单…

12_AJAX

知识点1【定时器】(重要) 知识点2【日期Date对象】 知识点3【Math数学对象】(了解) ​编辑 知识点4【string对象】 indexof函数: substring()函数: 知识点5【全局函数】(了解) …

Android使用高德地图实现运动轨迹绘制和轨迹回放

功能的实现完全是使用高德地图进行实现的,先看一下效果图吧! 下图是在绘制轨迹的过程: 下图是在轨迹回放的过程: 下图是记录运动的时间区间: 其实这个实现起来还是很容易的,总体逻辑就是:定位—…

Meter接口测试使用教程哪里找?

接口测试是测试工程师的必备技能之一,运用JMeter工具一步步实现接口请求,数据参数化,断言等操作,通过常见的企业实际测试场景详解JMeter各项技术使用,最后结合Jenkins持续集成实现企业级小程序接口自动化测试&#xff…

数据结构(6)树形结构——平衡二叉树(JAVA代码实现)

目录 6.1.概述 6.2.AVL树 6.2.1.概述 6.2.2.旋转 1.RR旋转 2.LL旋转 3.LR旋转 4.RL旋转 6.2.3.代码实现 6.1.概述 二叉搜索树存在一个问题,就是树的姿态和数据的插入顺序是有关系的,有时候树会变成某一边的子树高度过高,甚至直接退化成…

百度联合哈尔滨发布城市大模型“冰城-百度·文心”, 助力城市智能化建设

本文已在【飞桨PaddlePaddle】公众号平台发布,详情请戳链接:百度联合哈尔滨发布城市大模型“冰城-百度文心”, 助力城市智能化建设 近日,哈尔滨市人民政府与百度携手,联合发布面向城市领域的行业大模型——冰城-百度文…

PyTorch学习笔记-损失函数与反向传播

1. 损失函数 具有深度学习理论基础的同学对损失函数和反向传播一定不陌生,在此不详细展开理论介绍。损失函数是指用于计算标签值和预测值之间差异的函数,在机器学习过程中,有多种损失函数可供选择,典型的有距离向量,绝…

【Oracle系列4】Oracle 数据库的层次结构,常见的GUI连接用具

【Oracle系列4】Oracle 数据库的层次结构 跟mysql不一样,mysql连上后能看到所有库,库下面直接就是表了。 跟pgsql也不一样,pgsql连上后,也是可以看到所有库,库下面是schema,schema下面才是表(…