SpringCloud Gateway高阶之Sentinel限流、熔断
ztj100 2024-10-29 18:19 39 浏览 0 评论
欢迎关注头条号:老顾聊技术
精品原创技术分享,知识的组装工
目录
- 前言
- Sentinel是什么
- 部署Sentinel Dashboard
- Sentinel对网关的支持
- 网关限流规则
- 网关流控实现原理
- 总结
前言
为什么需要服务熔断和降级?微服务是当前业界的一大趋势,原理就是将单一职责的功能模块独立化为子服务,降低服务间的耦合,服务间互相调用。但是这样也会出现一些问题:
上图中大量微服务互相调用,存在大量的依赖关系,难免会出现某个服务故障,如ServiceD出现问题,导致ServiceG、ServiceF、ServiceA、ServiceB都出现问题,然后再会影响其他服务,变成级联故障,最终导致系统不可用的坍塌,也就是服务雪崩。
当然还有某些场景,在一些时间段某些服务会出现高并发的情况,而某些服务占用着那些紧缺的资源显然是不太合理的,这时就需要对一些服务进行降级处理,削弱占用的系统资源。
熟悉Spring Cloud的小伙伴,第一反应应该就是Hystrix。但是比较可惜的是Netflix已经宣布对Hystrix停止更新。那么还有什么更好的选择呢?除了Spring Cloud官方推荐的resilience4j之外,目前Spring Cloud Alibaba下整合的Sentinel小伙伴们可以重点考察和选型的目标。
Sentinel是什么
Sentinel 是一款由阿里开发的面向分布式服务架构的轻量级流量控制产品,主要以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度来帮助我们保护服务的稳定性。
Sentinel的使用分为两部分:
1、sentinel-dashboard:与hystrix-dashboard类似,但是它更为强大一些。除了与hystrix-dashboard一样提供实时监控之外,还提供了流控规则、熔断规则的在线维护等功能。
2、客户端整合:每个微服务客户端都需要整合sentinel的客户端封装与配置,才能将监控信息上报给dashboard展示以及实时的更改限流或熔断规则等。
部署Sentinel Dashboard
下载地址
到github上面搜素sentinel看看他的releases,现在最新的版本V1.6.3,点击下载
运行Sentinel.jar
Sentinel的默认端口是8080,当然你也可以换别的端口,在启动的时候设置一下就行了。我们启动时候要让他在后台运行。
nohup java -jar sentinel-dashboard-1.6.3.jar &
登陆Sentinel控制台
ip+端口号访问服务,用户名和密码都是:sentinel
登陆进去后,能看到流控和降级规则设置
Sentinel对网关的支持
Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。
Sentinel 1.6.0 引入了 Sentinel API Gateway Adapter Common 模块,此模块中包含网关限流的规则和自定义 API 的实体和管理逻辑:
1、GatewayFlowRule:网关限流规则,这个根据网关的自身的路由场景设计的,可以针对不同 route 或自定义的 API 分组进行限流,支持针对请求中的参数、Header、来源 IP 等进行定制化的限流。
2、ApiDefinition:用户自定义的 API 定义分组,可以看做是一些 URL 匹配的组合。比如我们可以定义一个 API 叫 my_api,请求 path 模式为 /foo/** 和 /baz/** 的都归到 my_api 这个 API 分组下面。限流的时候可以针对这个自定义的 API 分组维度进行限流。
网关限流规则 GatewayFlowRule
字段解释如下:
1、resource:资源名称
网关中的 route 名称或者用户自定义的API 分组名称。
2、resourceMode
规则是针对 API Gateway 的route(RESOURCE_MODE_ROUTE_ID)还是用户在 Sentinel 中自定义的API 分组(RESOURCE_MODE_CUSTOM_API_NAME),默认是route。
3、grade
限流指标维度,同限流规则的grade字段。
4、count:限流阈值
5、intervalSec
统计时间窗口,单位是秒,默认是1 秒(目前仅对参数限流生效)。
6、controlBehavior
流量整形的控制效果,同限流规则的 controlBehavior 字段,目前支持快速失败和匀速排队两种模式,默认是快速失败。
7、burst
应对突发请求时额外允许的请求数目(目前仅对参数限流生效)。
8、maxQueueingTimeoutMs
匀速排队模式下的最长排队时间,单位是毫秒,仅在匀速排队模式下生效。
9、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 和 matchStrategy:为参数匹配特性预留
可以通过 GatewayRuleManager.loadRules(rules)手动加载网关规则,或通过 GatewayRuleManager.register2Property(property)注册动态规则源动态推送(推荐方式)
网关流控实现原理
上图的整体流程如下:
1、外部请求进入API Gateway时会经过Sentinel实现的filter,其中会依次进行 路由/API 分组匹配、请求属性解析和参数组装。
2、Sentinel 会根据配置的网关流控规则来解析请求属性,并依照参数索引顺序组装参数数组,最终传入SphU.entry(res, args) 中。
3、Sentinel API Gateway Adapter Common 模块向 Slot Chain 中添加了一个 GatewayFlowSlot,专门用来做网关规则的检查。
4、GatewayFlowSlot会从GatewayRuleManager中提取生成的热点参数规则,根据传入的参数依次进行规则检查。若某条规则不针对请求属性,则会在参数最后一个位置置入预设的常量,达到普通流控的效果。
注意:
当通过 GatewayRuleManager 加载网关流控规则GatewayFlowRule时,无论是否针对请求属性进行限流,Sentinel底层都会将网关流控规则转化为热点参数规则ParamFlowRule,存储在GatewayRuleManager 中,与正常的热点参数规则相隔离。转换时Sentinel会根据请求属性配置,为网关流控规则设置参数索引idx,并同步到生成的热点参数规则中
总结
从Sentinel的1.6.0版本开始,提供了SpringCloud Gateway的适配模块,可以提供两种资源维度的限流:
1、route 维度:即在Spring配置文件中配置的路由条目,资源名为对应的routeId
2、自定义 API 维度:用户可以利用 Sentinel 提供的 API 来自定义一些 API 分组
具体用法,老顾下一篇介绍,今天就介绍到这里,谢谢!!!
---End---
最近老顾上传了微服务网关的分享课程,请大家多多支持
推荐阅读
2、Gateway网关系列(二):SpringCloud Gateway入门实战,路由规则
3、Gateway网关系列开篇:SpringCloud的官方网关Gateway介绍
5、学习Lambda表达式看这篇就够了,不会让你失望的哦(续篇)
8、不说“分布式事务”理论,直接上大厂阿里的解决方案,绝对实用
9、女程序员问到这个问题,让我思考了半天,Mysql的“三高”架构
10、大厂二面:CAP原则为什么只能满足其中两项?而不能同时满足
13、你了解如何利用token方式实现分布式Session吗?
14、Mysql索引结构演变,为什么最终会是那个结构呢?让你一看就懂
23、分享一线互联网大厂分布式唯一ID设计 之 snowflake方案
27、如何永不迁移数据和避免热点? 根据服务器指标分配数据量(揭秘篇)
28、你知道怎么分库分表吗?如何做到永不迁移数据和避免热点吗?
30、你知道如何更新缓存吗?如何保证缓存和数据库双写一致性?
32、DB读写分离情况下,如何解决缓存和数据库不一致性问题?
38、阿里二面:filter、interceptor、aspect应如何选择?很多人中招
相关推荐
- 再说圆的面积-蒙特卡洛(蒙特卡洛方法求圆周率的matlab程序)
-
在微积分-圆的面积和周长(1)介绍微积分方法求解圆的面积,本文使用蒙特卡洛方法求解圆面积。...
- python创建分类器小结(pytorch分类数据集创建)
-
简介:分类是指利用数据的特性将其分成若干类型的过程。监督学习分类器就是用带标记的训练数据建立一个模型,然后对未知数据进行分类。...
- matplotlib——绘制散点图(matplotlib散点图颜色和图例)
-
绘制散点图不同条件(维度)之间的内在关联关系观察数据的离散聚合程度...
- python实现实时绘制数据(python如何绘制)
-
方法一importmatplotlib.pyplotaspltimportnumpyasnpimporttimefrommathimport*plt.ion()#...
- 简单学Python——matplotlib库3——绘制散点图
-
前面我们学习了用matplotlib绘制折线图,今天我们学习绘制散点图。其实简单的散点图与折线图的语法基本相同,只是作图函数由plot()变成了scatter()。下面就绘制一个散点图:import...
- 数据分析-相关性分析可视化(相关性分析数据处理)
-
前面介绍了相关性分析的原理、流程和常用的皮尔逊相关系数和斯皮尔曼相关系数,具体可以参考...
- 免费Python机器学习课程一:线性回归算法
-
学习线性回归的概念并从头开始在python中开发完整的线性回归算法最基本的机器学习算法必须是具有单个变量的线性回归算法。如今,可用的高级机器学习算法,库和技术如此之多,以至于线性回归似乎并不重要。但是...
- 用Python进行机器学习(2)之逻辑回归
-
前面介绍了线性回归,本次介绍的是逻辑回归。逻辑回归虽然名字里面带有“回归”两个字,但是它是一种分类算法,通常用于解决二分类问题,比如某个邮件是否是广告邮件,比如某个评价是否为正向的评价。逻辑回归也可以...
- 【Python机器学习系列】拟合和回归傻傻分不清?一文带你彻底搞懂
-
一、拟合和回归的区别拟合...
- 推荐2个十分好用的pandas数据探索分析神器
-
作者:俊欣来源:关于数据分析与可视化...
- 向量数据库:解锁大模型记忆的关键!选型指南+实战案例全解析
-
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...
- 用Python进行机器学习(11)-主成分分析PCA
-
我们在机器学习中有时候需要处理很多个参数,但是这些参数有时候彼此之间是有着各种关系的,这个时候我们就会想:是否可以找到一种方式来降低参数的个数呢?这就是今天我们要介绍的主成分分析,英文是Princip...
- 神经网络基础深度解析:从感知机到反向传播
-
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在...
- Python实现基于机器学习的RFM模型
-
CDA数据分析师出品作者:CDALevelⅠ持证人岗位:数据分析师行业:大数据...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- idea eval reset (50)
- vue dispatch (70)
- update canceled (42)
- order by asc (53)
- spring gateway (67)
- 简单代码编程 贪吃蛇 (40)
- transforms.resize (33)
- redisson trylock (35)
- 卸载node (35)
- np.reshape (33)
- torch.arange (34)
- npm 源 (35)
- vue3 deep (35)
- win10 ssh (35)
- vue foreach (34)
- idea设置编码为utf8 (35)
- vue 数组添加元素 (34)
- std find (34)
- tablefield注解用途 (35)
- python str转json (34)
- java websocket客户端 (34)
- tensor.view (34)
- java jackson (34)
- vmware17pro最新密钥 (34)
- mysql单表最大数据量 (35)