Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。
限流规则的维度
网关维度
代表网关访问该服务时的限流规则
粒度粗–全局的配置
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)
添加 Controller 获取限流规则
相关依赖
<dependency><groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-sentinel-gateway</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.csp</groupId>
<artifactId>sentinel-datasource-nacos</artifactId>
</dependency>
修改配置文件
serverport80
spring
application
name gateway-server
cloud
nacos
discovery
server-addr nacos-server 8848 # 修改本机的host 文件
gateway
discovery
locator
enabledtrue
lower-case-service-id true # admin-service ADMIN-SERVICE /admin-service/** -> 微服务(ADMIN-SERVICE)
routes
id admin-service_router
uri lb //admin-service # 转发到那个目的地
predicates
Path=/admin/**
id test_router
uri https //blog.csdn.net/manba_yqq # 转发到那个目的地
predicates
Path=/test
#通过网关来完成2中维度的限流:网关 + API分组的限流
sentinel
datasource
# ds1.file:
# file: classpath:gw-flow.json
# ruleType: gw_flow
ds1.nacos#com.alibaba.csp.sentinel.datasource.nacos.NacosDataSource 使用Nacos持久化我的sentinel 数据时,需要添加nacos-datasource的依赖
serverAddr nacos-server8848
dataId gw-flow
ruleType gw_flow
# ds2.file:
# file: classpath:api-group.json
# ruleType: gw_api_group
ds2.nacos
serverAddr nacos-server8848
dataId api-group
ruleType gw_api_group # 我们演示了sentinel-dashboard 的规则的定义,而且规则定义好了后,我们的网关能立马的感知到(生效)(nacos无法感知),但是我们下次重启,会丢失规则。--》nacos
在nacos上添加限流规则
添加 Controller 获取限流规则
public class GatewayFlowRulesController {
/**
* 获取当前系统的限流策略
*/
("/gw/flow/rules")
public Set<GatewayFlowRule> getCurrentGatewayFlowRules(){
return GatewayRuleManager.getRules();
}
/**
* 获取定义的api分组
*/
("/gw/api/groups")
public Set<ApiDefinition> getApiGroups(){
return GatewayApiDefinitionManager.getApiDefinitions();
}
}
第一次和第二次访问:
第三次访问:被限流了