欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

gateway集成阿里Sentinel后,控制台如何根据url动态限流

时间:2023-06-17

gateway网关集成Sentinel后,控制台默认限流是根据服务进行的,默认为资源名为ReactiveCompositeDiscoveryClient_服务名称,如下图:

所以限流都是根据整个服务进行的,那么如何像单机一样根据url分组限流呢;有两种方式:

1.通过初始化配置:

@Configurationpublic class SentinelInitUrlConfig { @PostConstruct public void doInit() { loadApiDefinitions(); } public void loadApiDefinitions() { Set apiDefinitions = GatewayApiDefinitionManager.getApiDefinitions(); ApiDefinition api = new ApiDefinition("分组") .setPredicateItems(new HashSet() {{ 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 uris = new CopyOnWriteArraySet<>(); @Override public Mono 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 apiDefinitions = GatewayApiDefinitionManager.getApiDefinitions(); ApiDefinition api = new ApiDefinition(uri) .setPredicateItems(new HashSet() {{ add(new ApiPathPredicateItem().setPattern(uri) .setMatchStrategy(SentinelGatewayConstants.PARAM_MATCH_STRATEGY_EXACT)); }}); apiDefinitions.add(api); GatewayApiDefinitionManager.loadApiDefinitions(apiDefinitions); }}

更多关注 GaoY's Day

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。