日升时奋斗,日落时自省
目录
先前Sentinel针对是业务微服务,没有整合Sentinel到Spring Cloud Gateway
Spring Cloud Gateway 默认是有限流功能的,但限流功能比较简单,所以咱们今天要实现的是 Spring Cloud Gateway 整合 Spring Cloud AlibabaSentinel 实现限流和熔断功能,这种方式也是目前生成环境主流的限流和熔断的实现方法。
1、实现整合
Gateway整合Sentinel总共分为以下4步:
(1)添加框架依赖
(2)设置配置文件
(3)配置拦截规则
(4)验证效果
接下来,我们一步一步来实现
1.1、添加框架依赖
需要框架依赖有3个:gateway、sentinel和sentinel-gateway(Sentinel对接Gateway的适配框架,Sentinel1.6新增模块),如下配置所示:
<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>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
1.2、设置配置文件
在application中设置sentinel控制台的地址,以及限流之后的响应信息:
spring:
cloud:
gateway:
routes:
- id: userservice
uri: http://localhost:9090
predicates:
- Path=/user/**
sentinel:
transport:
dashboard: localhost:18086
scg:
fallback:
mode: response
response-status: 200
response-body: '{"code":429,"message":"被限流了!"}'
application:
name: gateway-service
server:
port: 10086
scg(Spring Cloud Gateway):配置网关专用
fallback:降级处理配置
mode:response 指定降级处理的模式为返回响应
response-status:表示响应状态
response-body:就是响应信息
限制规则中的重定位配置如下:
scg:
fallback:
mode: redirect
response-status: 200
response-body: '{"code":429,"message":"被限流了!"}'
redirect: https://blog.csdn.net/c_study__c?spm=1011.2124.3001.5343 #跳转地址
1.3、设置限流和熔断规则
进入sentinel控制台,内容有变
限流或熔断配置就在“请求链路”中配置
1.3.1、限流配置
限流可以配置两种 API 类型: Route ID 和 API 分组
- Route ID 是和 Gateway 中的 Routes (每个路由)一一对应的API 分组是自定义
- API 规则 (开发人员可以自定义)
Route ID限流配置
限流配置参数:
resourceMode: 规则是针对API Gateway 的 Route ID (RESOURCE MODE_ROUTE ID),还是用户在Sentinel 中定义的 API分组 (RESOURCE MODE CUSTOM API NAME) ,默认是 Route ID.
resource: 资源名称,可以是网关中的 Route ID 名称或者用户自定义的 API 分组名称
grade: 阈值类型,QPS 或线程数。
count: 具体值intervalSec: 统计时间窗口,单位是秒,默认是 1 秒
controlBehavior: 流量整形的控制效果,目前支持快速失败和匀速排队两种模式,默认是快速失败。
controlBehavior: 流量整形的控制效果,目前支持快速失败和匀速排队两种模式,默认是快速失败
Burst size: 应对突发请求时额外允许的请求数目。
maxQueueingTimeoutMs: 匀速排队模式下的最长排队时间,单位是毫秒,仅在匀速排队模式下生效
paramItem: 参数限流配置。若不提供,则代表不针对参数进行限流,该网关规则将会被转换成普通流控规8则;否则会转换成热点规则,它包含的字段:
- parseStrategy:从请求中提取参数的策略,目前支持提取来源 IPa.(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: 参数值的匹配策略,目前支持精确匹配 (PARAM MATCH STRATEGY_EXACT)、子串匹 (PARAM MATCH STRATEGY CONTAINS) 和E则匹 (PARAM MATCH STRATEGY REGEX)。
API限流配置
先到API管理
这是API组名: 并且添加匹配规则
匹配规则顾名思义:
- 精确:访问那个写那个(写全)
- 前缀:凡是这个前缀的都受到限制
- 正则:就是类似正则表达匹配方式
新增好以后,回到请求链路
此时API名称会有内容供友友们选择
注:操控其实差不多,更加灵活了
1.3.2、熔断配置
降级配置也就是熔断配置,在程序运行期间出现了某种异常就会触发的机制。它是在"请求链路“中点击“降级”按钮就能看到:
熔断策略: 使用哪种策略来进行熔断操作。
慢调用比例: 在统计时长内的所有请求,如果请求时间超过 xx 秒则为慢请求,且慢请求的超过一定的比例,且请求数大于最小请求数将触发熔断操作,也就是一段时间内 (熔断时长参数设置) 的请求会快速失败。
异常比例: 在统计时长内的所有请求,如果异常的比例大于闯值,且请求数大于最小请求数,将触发熔断,也就是一段时间内 (熔断时长参数设置)的请求会快速失败。
异常数:在统计时长内的所有请求,如果异常数大于闯值,且请求数大于最小请求数,将触发熔断,也就是一段时间内 (熔断时长参数设置)的请求会快速失败。
2、实现原理
外部请求进入 API Gateway 时会经过 Sentinel 实现的 filter,其中会依次进行 路由/API 分组匹配、请求属性解析和参数组装。Sentinel 会根据配置的网关流控规则来解析请求属性,并依照参数索引顺序组装参数数组,最终传入 SphU.entry(res, args)
中。Sentinel API Gateway Adapter Common 模块向 Slot Chain 中添加了一个 GatewayFlowSlot
,专门用来做网关规则的检查。GatewayFlowSlot
会从 GatewayRuleManager
中提取生成的热点参数规则,根据传入的参数依次进行规则检查。若某条规则不针对请求属性,则会在参数最后一个位置置入预设的常量,达到普通流控的效果。