[BUG] Spring cloud gateway中集成sentinel 1.7.1版本,限流规则不生效
- Dominant language
- Java
- Stars
- 23.1k
- Forks
- 8.1k
- PR merge metrics
- No merged PRs in 30d
Description
# 架构描述
feign客户端 -> nginx -> 多个spring cloud gateway实例,集成nacos实现服务自动发现 -> feign服务端,集成nacos实现服务注册。
# spring cloud gateway的pom.xml

最终打包得到的lib目录下有这些jar包:
nacos-api-1.2.1.jar
nacos-client-1.2.1.jar
nacos-common-1.2.1.jar
nacos-spring-context-0.3.3.jar
sentinel-annotation-aspectj-1.7.1.jar
sentinel-api-gateway-adapter-common-1.7.1.jar
sentinel-cluster-client-default-1.7.1.jar
sentinel-cluster-common-default-1.7.1.jar
sentinel-cluster-server-default-1.7.1.jar
sentinel-core-1.7.1.jar
sentinel-datasource-extension-1.7.1.jar
sentinel-datasource-nacos-1.7.1.jar
sentinel-parameter-flow-control-1.7.1.jar
sentinel-reactor-adapter-1.7.1.jar
sentinel-spring-cloud-gateway-adapter-1.7.1.jar
sentinel-spring-webflux-adapter-1.7.1.jar
sentinel-spring-webmvc-adapter-1.7.1.jar
sentinel-transport-common-1.7.1.jar
sentinel-transport-simple-http-1.7.1.jar
spring-aop-5.2.10.RELEASE.jar
spring-beans-5.2.10.RELEASE.jar
spring-boot-2.2.11.RELEASE.jar
spring-boot-actuator-2.2.11.RELEASE.jar
spring-boot-actuator-autoconfigure-2.2.11.RELEASE.jar
spring-boot-autoconfigure-2.2.11.RELEASE.jar
spring-boot-starter-2.2.11.RELEASE.jar
spring-boot-starter-actuator-2.2.11.RELEASE.jar
spring-boot-starter-aop-2.2.11.RELEASE.jar
spring-boot-starter-cache-2.2.11.RELEASE.jar
spring-boot-starter-json-2.2.11.RELEASE.jar
spring-boot-starter-logging-2.2.11.RELEASE.jar
spring-boot-starter-reactor-netty-2.2.11.RELEASE.jar
spring-boot-starter-validation-2.2.11.RELEASE.jar
spring-boot-starter-webflux-2.2.11.RELEASE.jar
spring-cloud-alibaba-sentinel-datasource-2.2.1.RELEASE.jar
spring-cloud-circuitbreaker-sentinel-2.2.1.RELEASE.jar
spring-cloud-commons-2.2.2.RELEASE.jar
spring-cloud-context-2.2.2.RELEASE.jar
spring-cloud-gateway-core-2.2.2.RELEASE.jar
spring-cloud-netflix-archaius-2.2.2.RELEASE.jar
spring-cloud-netflix-ribbon-2.2.2.RELEASE.jar
spring-cloud-openfeign-core-2.2.2.RELEASE.jar
spring-cloud-starter-2.2.2.RELEASE.jar
spring-cloud-starter-alibaba-nacos-config-2.2.1.RELEASE.jar
spring-cloud-starter-alibaba-nacos-discovery-2.2.1.RELEASE.jar
spring-cloud-starter-alibaba-sentinel-2.2.1.RELEASE.jar
spring-cloud-starter-gateway-2.2.2.RELEASE.jar
spring-cloud-starter-netflix-archaius-2.2.2.RELEASE.jar
spring-cloud-starter-netflix-ribbon-2.2.2.RELEASE.jar
spring-cloud-starter-openfeign-2.2.2.RELEASE.jar
spring-context-5.2.10.RELEASE.jar
spring-context-support-1.0.6.jar
spring-context-support-4.3.18.RELEASE.jar
spring-core-5.2.10.RELEASE.jar
spring-expression-5.2.10.RELEASE.jar
spring-jcl-5.2.10.RELEASE.jar
spring-security-crypto-5.2.7.RELEASE.jar
spring-security-rsa-1.0.9.RELEASE.jar
spring-web-5.2.10.RELEASE.jar
spring-webflux-5.2.10.RELEASE.jar
我部署了sentinel-dashboard的1.7.1版本,然后在gateway中有如下代码:
@Slf4j
@Configuration
public class SentinelConfig {
private final List viewResolvers;
private final ServerCodecConfigurer serverCodecConfigurer;
public SentinelConfig(ObjectProvider> viewResolversProvider, ServerCodecConfigurer serverCodecConfigurer) {
this.viewResolvers = viewResolversProvider.getIfAvailable(Collections::emptyList);
this.serverCodecConfigurer = serverCodecConfigurer;
}
@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler() {
// Register the block exception handler for Spring Cloud Gateway.
return new SentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
}
@Bean
@Order(-10)
public GlobalFilter sentinelGatewayFilter() {
return new SentinelGatewayFilter();
}
@Bean(name = "sentinel-json-gw-api-group-converter")
public Converter> apiGroupConverter() {
return source -> {
Set definitions = JSON.parseObject(
source, new TypeReference>() {
}
);
log.info("api definition converter source = {} def = {}", source, definitions);
return definitions;
};
}
@Bean(name = "sentinel-json-gw-flow-converter")
public Converter> flowRuleConverter() {
return source -> {
// 1. 解析原始规则
Set rules = JSON.parseObject(
source, new TypeReference>() {
}
);
// 2. 修复规则字段(关键步骤)
if (rules != null) {
rules.forEach(rule -> {
// 强制设为路由ID模式
rule.setResourceMode(0);
// 清除参数配置(防止被误判为ParamFlowRule)
rule.setParamItem(null);
});
}
log.info("gateway flow rule converter source = {} rule = {}", source, rules);
return rules;
};
}
}
gateway中配置文件如下:
# Sentinel 基础配置
# spring.cloud.sentinel.transport.dashboard=10.66.224.143:8080
# spring.cloud.sentinel.transport.port=8719
spring.cloud.sentinel.filter.enabled=false
spring.cloud.sentinel.eager=true
# Nacos 数据源配置
spring.cloud.sentinel.datasource.api1.nacos.namespace=3236ba29-ba16-44f1-8558-a9154768f506
spring.cloud.sentinel.datasource.api1.nacos.server-addr=http://developertest.com/
spring.cloud.sentinel.datasource.api1.nacos.data-id=bc-gateway-sentinel-api.json
spring.cloud.sentinel.datasource.api1.nacos.group-id=com.bc.gateway
spring.cloud.sentinel.datasource.api1.nacos.data-type=json
spring.cloud.sentinel.datasource.api1.nacos.rule-type=gw_api_group
spring.cloud.sentinel.datasource.flow1.nacos.namespace=3236ba29-ba16-44f1-8558-a9154768f506
spring.cloud.sentinel.datasource.flow1.nacos.server-addr=http://developertest.com/
spring.cloud.sentinel.datasource.flow1.nacos.data-id=bc-gateway-sentinel-flow.json
spring.cloud.sentinel.datasource.flow1.nacos.group-id=com.bc.gateway
spring.cloud.sentinel.datasource.flow1.nacos.data-type=json
spring.cloud.sentinel.datasource.flow1.nacos.rule-type=gw_flow
# Gateway 降级配置
spring.cloud.sentinel.scg.route-id-forward-enabled=true
spring.cloud.sentinel.scg.fallback.mode=response
spring.cloud.sentinel.scg.fallback.response-status=429
spring.cloud.sentinel.scg.fallback.response-body={"code":429,"message":"Too many requests"}
nacos中定义的api分组、限流规则:
[{
"apiName": "media-center-api-group",
"predicateItems": [{ "pattern": "/user-center/**" }]
}]
[
{
"resource": "user-center",
"resourceMode": 0,
"grade": 1,
"count": 10,
"controlBehavior": 0,
"intervalSec": 10
},{
"resource": "media-center-api-group",
"resourceMode": 1,
"grade": 1,
"count": 10,
"controlBehavior": 0,
"intervalSec": 10
}
]
nacos中定义的路由转发规则:
[{
"id":"user-center",
"uri":"lb://user-center",
"order":-1,
"filters":[
{
"name":"RespBodyExpress"
}
],
"predicates":[
{
"args":{
"pattern":"/user-center/**"
},
"name":"Path"
}
]
}]
启动参数:
-Dcsp.sentinel.api.port=8719 -Dcsp.sentinel.dashboard.server=10.66.224.143:8080 -Dcsp.sentinel.app.type=1 -Dproject.name=bc-gateway
gateway启动日志:
2025-07-02 08:04:58.989 INFO App name resolved: bc-gateway
2025-07-02 08:04:58.989 INFO [SentinelConfig] Application type resolved: 1
2025-07-02 08:04:58.990 INFO [InitExecutor] Found init func: com.alibaba.csp.sentinel.transport.init.CommandCenterInitFunc
2025-07-02 08:04:58.992 INFO [InitExecutor] Found init func: com.alibaba.csp.sentinel.transport.init.HeartbeatSenderInitFunc
2025-07-02 08:04:58.993 INFO [InitExecutor] Found init func: com.alibaba.csp.sentinel.metric.extension.MetricCallbackInit
2025-07-02 08:04:58.994 INFO [InitExecutor] Found init func: com.alibaba.csp.sentinel.init.ParamFlowStatisticSlotCallbackInit
2025-07-02 08:04:58.995 INFO [InitExecutor] Found init func: com.alibaba.csp.sentinel.cluster.server.init.DefaultClusterServerInitFunc
2025-07-02 08:04:58.996 INFO [InitExecutor] Found init func: com.alibaba.csp.sentinel.cluster.client.init.DefaultClusterClientInitFunc
2025-07-02 08:04:58.999 INFO [SpiLoader] Found CommandCenter SPI: com.alibaba.csp.sentinel.transport.command.SimpleHttpCommandCenter with order 2147483647
2025-07-02 08:04:58.999 INFO [CommandCenterProvider] CommandCenter resolved: com.alibaba.csp.sentinel.transport.command.SimpleHttpCommandCenter
2025-07-02 08:04:59.016 INFO [CommandCenterInit] Starting command center: com.alibaba.csp.sentinel.transport.command.SimpleHttpCommandCenter
2025-07-02 08:04:59.016 INFO [InitExecutor] Executing com.alibaba.csp.sentinel.transport.init.CommandCenterInitFunc with order -1
2025-07-02 08:04:59.019 INFO [SimpleHttpHeartbeatSender] Default console address list retrieved: [/10.66.224.143:8080]
2025-07-02 08:04:59.019 INFO [SpiLoader] Found HeartbeatSender SPI: com.alibaba.csp.sentinel.transport.heartbeat.SimpleHttpHeartbeatSender with order 2147483647
2025-07-02 08:04:59.019 INFO [HeartbeatSenderProvider] HeartbeatSender activated: com.alibaba.csp.sentinel.transport.heartbeat.SimpleHttpHeartbeatSender
2025-07-02 08:04:59.019 INFO [HeartbeatSenderInit] Heartbeat interval not configured in config property or invalid, using sender default: 10000
2025-07-02 08:04:59.020 INFO [HeartbeatSenderInit] HeartbeatSender started: com.alibaba.csp.sentinel.transport.heartbeat.SimpleHttpHeartbeatSender
2025-07-02 08:04:59.020 INFO [InitExecutor] Executing com.alibaba.csp.sentinel.transport.init.HeartbeatSenderInitFunc with order -1
2025-07-02 08:04:59.022 INFO [InitExecutor] Executing com.alibaba.csp.sentinel.cluster.client.init.DefaultClusterClientInitFunc with order 0
2025-07-02 08:04:59.024 INFO [InitExecutor] Executing com.alibaba.csp.sentinel.metric.extension.MetricCallbackInit with order 2147483647
2025-07-02 08:04:59.024 INFO [InitExecutor] Executing com.alibaba.csp.sentinel.init.ParamFlowStatisticSlotCallbackInit with order 2147483647
2025-07-02 08:04:59.030 INFO [TokenServiceProvider] Global token service resolved: com.alibaba.csp.sentinel.cluster.flow.DefaultTokenService
2025-07-02 08:04:59.030 INFO [DefaultClusterServerInitFunc] Default entity codec and processors registered
2025-07-02 08:04:59.030 INFO [InitExecutor] Executing com.alibaba.csp.sentinel.cluster.server.init.DefaultClusterServerInitFunc with order 2147483647
2025-07-02 08:05:00.741 INFO [DynamicSentinelProperty] Config will be updated to: [ApiDefinition{apiName='media-center-api-group', predicateItems=[{}]}]
2025-07-02 08:05:00.743 INFO [GatewayApiDefinitionManager] Api definition loaded: {}
2025-07-02 08:05:00.744 INFO [GatewayApiDefinitionManager] ApiDefinitionChangeObserver added: com.alibaba.csp.sentinel.adapter.gateway.sc.api.SpringCloudGatewayApiDefinitionChangeObserver
2025-07-02 08:05:00.745 INFO [GatewayApiDefinitionManager] Registering new property to gateway API definition manager
2025-07-02 08:05:00.746 INFO [GatewayApiDefinitionManager] Api definition loaded: {media-center-api-group=ApiDefinition{apiName='media-center-api-group', predicateItems=[{}]}}
2025-07-02 08:05:00.758 INFO [DynamicSentinelProperty] Config will be updated to: [GatewayFlowRule{resource='media-center-api-group', resourceMode=1, grade=1, count=10.0, intervalSec=10, controlBehavior=0, burst=0, maxQueueingTimeoutMs=500, paramItem=null}, GatewayFlowRule{resource='user-center', resourceMode=0, grade=1, count=10.0, intervalSec=10, controlBehavior=0, burst=0, maxQueueingTimeoutMs=500, paramItem=null}]
2025-07-02 08:05:00.761 INFO [GatewayRuleManager] No gateway rules, clearing parameter metrics of previous rules
2025-07-02 08:05:00.761 INFO [GatewayRuleManager] Gateway flow rules loaded: {}
2025-07-02 08:05:00.761 INFO [GatewayRuleManager] Registering new property to gateway flow rule manager
2025-07-02 08:05:00.762 INFO [GatewayRuleManager] Converted internal param rules: {media-center-api-group=[ParamFlowRule{grade=1, paramIdx=0, count=10.0, controlBehavior=0, maxQueueingTimeMs=500, burstCount=0, durationInSec=10, paramFlowItemList=[], clusterMode=false, clusterConfig=null}], user-center=[ParamFlowRule{grade=1, paramIdx=0, count=10.0, controlBehavior=0, maxQueueingTimeMs=500, burstCount=0, durationInSec=10, paramFlowItemList=[], clusterMode=false, clusterConfig=null}]}
2025-07-02 08:05:00.762 INFO [GatewayRuleManager] Gateway flow rules loaded: {media-center-api-group=[GatewayFlowRule{resource='media-center-api-group', resourceMode=1, grade=1, count=10.0, intervalSec=10, controlBehavior=0, burst=0, maxQueueingTimeoutMs=500, paramItem=null}], user-center=[GatewayFlowRule{resource='user-center', resourceMode=0, grade=1, count=10.0, intervalSec=10, controlBehavior=0, burst=0, maxQueueingTimeoutMs=500, paramItem=null}]}
2025-07-02 08:05:04.147 INFO [SystemRuleManager] Current system check status: false, highestSystemLoad: 1.797693e+308, highestCpuUsage: 1.797693e+308, maxRt: 9223372036854775807, maxThread: 9223372036854775807, maxQps: 1.797693e+308
2025-07-02 08:05:05.265 INFO Add child to node
2025-07-02 08:05:05.265 INFO Add child to node
2025-07-02 08:05:05.271 INFO [SlotChainProvider] Global slot chain builder resolved: com.alibaba.csp.sentinel.slots.HotParamSlotChainBuilder
2025-07-02 08:05:05.274 INFO Add child to node
2025-07-02 08:05:05.276 INFO [ParamFlowRuleManager] No parameter flow rules, clearing all parameter metrics
2025-07-02 08:05:05.276 INFO [ParamFlowRuleManager] Parameter flow rules received: {}
2025-07-02 08:05:05.277 INFO [AuthorityRuleManager] Load authority rules: {}
2025-07-02 08:05:05.278 INFO [FlowRuleManager] Flow rules loaded: {}
2025-07-02 08:05:05.279 INFO [MetricWriter] Creating new MetricWriter, singleFileSize=52428800, totalFileCount=6
2025-07-02 08:05:05.281 INFO [DegradeRuleManager] Degrade rules loaded: {}
2025-07-02 08:05:05.282 INFO [MetricExtensionProvider] MetricExtension resolved, size=0
现在的问题是:我在nacos中定义的api分组和限流规则,已经同步到sentinel dashboard,但是我重复调用接口并未被限流。
Contributor guide
Assessment
This issue has not been assessed yet.