当前位置 : 主页 > 编程语言 > java >

SpringCloud Gateway 集 成 Sentinel

来源:互联网 收集:自由互联 发布时间:2022-07-04
Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。 限流规则的维度 网关维度 代表网关访问该服务时的限流规则 粒度粗–全局的配置 Api 分组维度 代表网关访问该接口时

Sentinel 支持对 Spring Cloud Gateway、Zuul 等主流的 API Gateway 进行限流。
SpringCloud Gateway 集 成 Sentinel_spring cloud

限流规则的维度

SpringCloud Gateway 集 成 Sentinel_java_02

网关维度

代表网关访问该服务时的限流规则
粒度粗–全局的配置

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>

修改配置文件

server:
port: 80
spring:
application:
name: gateway-server
cloud:
nacos:
discovery:
server-addr: nacos-server:8848 # 修改本机的host 文件
gateway:
discovery:
locator:
enabled: true
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-server:8848
dataId: gw-flow
ruleType: gw_flow
# ds2.file:
# file: classpath:api-group.json
# ruleType: gw_api_group
ds2.nacos:
serverAddr: nacos-server:8848
dataId: api-group
ruleType: gw_api_group # 我们演示了sentinel-dashboard 的规则的定义,而且规则定义好了后,我们的网关能立马的感知到(生效)(nacos无法感知),但是我们下次重启,会丢失规则。--》nacos

在nacos上添加限流规则

SpringCloud Gateway 集 成 Sentinel_限流_03
SpringCloud Gateway 集 成 Sentinel_java_04

添加 Controller 获取限流规则

@RestController
public class GatewayFlowRulesController {
/**
* 获取当前系统的限流策略
*/
@GetMapping("/gw/flow/rules")
public Set<GatewayFlowRule> getCurrentGatewayFlowRules(){
return GatewayRuleManager.getRules();
}
/**
* 获取定义的api分组
*/
@GetMapping("/gw/api/groups")
public Set<ApiDefinition> getApiGroups(){
return GatewayApiDefinitionManager.getApiDefinitions();
}
}

第一次和第二次访问:
SpringCloud Gateway 集 成 Sentinel_java_05
第三次访问:被限流了
SpringCloud Gateway 集 成 Sentinel_ide_06


上一篇:手写SpringIOC容器如何实现
下一篇:没有了
网友评论