gateway网关集成Sentinel后,控制台默认限流是根据服务进行的,默认为资源名为ReactiveCompositeDiscoveryClient_服务名称,如下图:
所以限流都是根据整个服务进行的,那么如何像单机一样根据url分组限流呢;有两种方式:
1.通过初始化配置:
@Configuration
public class SentinelInitUrlConfig {
@PostConstruct
public void doInit() {
loadApiDefinitions();
}
public void loadApiDefinitions() {
Set<ApiDefinition> apiDefinitions = GatewayApiDefinitionManager.getApiDefinitions();
ApiDefinition api = new ApiDefinition("分组")
.setPredicateItems(new HashSet<ApiPredicateItem>() {{
add(new ApiPathPredicateItem().setPattern("/auth/*")
//参数值的匹配策略
// 精确匹配(PARAM_MATCH_STRATEGY_EXACT)
// 子串匹配(PARAM_MATCH_STRATEGY_CONTAINS)
// 正则匹配(PARAM_MATCH_STRATEGY_REGEX)
.setMatchStrategy(SentinelGatewayConstants.PARAM_MATCH_STRATEGY_EXACT));
}});
apiDefinitions.add(api);
GatewayApiDefinitionManager.loadApiDefinitions(apiDefinitions);
}
}
2.通过过滤器动态添加分组:
@Component
@Order(Integer.MIN_VALUE)
public class SentinelUrlFilter implements GlobalFilter {
private Set<String> uris = new CopyOnWriteArraySet<>();
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
Route gatewayUrl = exchange.getRequiredAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
String uri = "/" + gatewayUrl.getUri().getHost() + exchange.getRequest().getURI().getPath();
if (uris.add(uri)) {
loadApiDefinitions(uri);
}
return chain.filter(exchange);
}
public void loadApiDefinitions(String uri) {
Set<ApiDefinition> apiDefinitions = GatewayApiDefinitionManager.getApiDefinitions();
ApiDefinition api = new ApiDefinition(uri)
.setPredicateItems(new HashSet<ApiPredicateItem>() {{
add(new ApiPathPredicateItem().setPattern(uri)
.setMatchStrategy(SentinelGatewayConstants.PARAM_MATCH_STRATEGY_EXACT));
}});
apiDefinitions.add(api);
GatewayApiDefinitionManager.loadApiDefinitions(apiDefinitions);
}
}
本文由 GY 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为:
2022/02/13 09:58