diff --git a/polaris-common/polaris-model/src/main/java/com/tencent/polaris/api/utils/RuleUtils.java b/polaris-common/polaris-model/src/main/java/com/tencent/polaris/api/utils/RuleUtils.java index 17abad693..501df36c5 100644 --- a/polaris-common/polaris-model/src/main/java/com/tencent/polaris/api/utils/RuleUtils.java +++ b/polaris-common/polaris-model/src/main/java/com/tencent/polaris/api/utils/RuleUtils.java @@ -169,7 +169,7 @@ public static boolean matchMetadata(Map ruleMeta, Map ruleMeta, Map destMeta, boolean isMatchSource, Map multiEnvRouterParamMap, Map variables) { + , String> variables) { return matchMetadata(ruleMeta, destMeta, null, isMatchSource, multiEnvRouterParamMap, variables, null); } @@ -346,13 +346,19 @@ public static boolean matchService(ServiceKey serviceKey, String namespace, Stri public static boolean matchMethod(String path, String protocol, String method, ModelProto.API api, Function regexToPattern, Function> trieNodeFunction) { + MatchStringType methodMatchStringType = MatchStringType.EXACT; + String apiMethod = api.getMethod(); + if (StringUtils.isNotBlank(apiMethod) && apiMethod.startsWith("!")) { + methodMatchStringType = MatchStringType.NOT_EQUALS; + apiMethod = apiMethod.substring(1); + } if (trieNodeFunction != null) { return RuleUtils.matchStringValue(MatchString.MatchStringType.EXACT, protocol, api.getProtocol()) - && RuleUtils.matchStringValue(MatchString.MatchStringType.EXACT, method, api.getMethod()) + && RuleUtils.matchStringValue(methodMatchStringType, method, apiMethod) && RuleUtils.matchStringValue(api.getPath().getType(), path, api.getPath().getValue().getValue(), regexToPattern, true, trieNodeFunction); } else { return RuleUtils.matchStringValue(MatchString.MatchStringType.EXACT, protocol, api.getProtocol()) - && RuleUtils.matchStringValue(MatchString.MatchStringType.EXACT, method, api.getMethod()) + && RuleUtils.matchStringValue(methodMatchStringType, method, apiMethod) && RuleUtils.matchStringValue(api.getPath(), path, regexToPattern); } } diff --git a/polaris-plugins/polaris-plugins-connector/connector-consul/src/main/java/com/tencent/polaris/plugins/connector/consul/service/authority/AuthorityService.java b/polaris-plugins/polaris-plugins-connector/connector-consul/src/main/java/com/tencent/polaris/plugins/connector/consul/service/authority/AuthorityService.java index 2adad08d1..660ce2c65 100644 --- a/polaris-plugins/polaris-plugins-connector/connector-consul/src/main/java/com/tencent/polaris/plugins/connector/consul/service/authority/AuthorityService.java +++ b/polaris-plugins/polaris-plugins-connector/connector-consul/src/main/java/com/tencent/polaris/plugins/connector/consul/service/authority/AuthorityService.java @@ -198,11 +198,23 @@ private List parseResponse(String decode } else if (StringUtils.equals(authTag.getTagField(), TagConstant.SYSTEM_FIELD.SOURCE_NAMESPACE_SERVICE_NAME)) { matchArgumentBuilder.setType(BlockAllowListProto.BlockAllowConfig.MatchArgument.Type.CALLER_SERVICE); matchArgumentBuilder.setKey("*"); - String[] split = authTag.getTagValue().split("/"); - if (split.length == 2) { - matchArgumentBuilder.setKey(split[0]); - authTag.setTagValue(split[1]); + String[] tagValues = authTag.getTagValue().split(","); + StringBuilder serviceNameStringBuilder = new StringBuilder(); + for (String tagValue : tagValues) { + if (StringUtils.isNotEmpty(tagValue)) { + String[] split = tagValue.split("/"); + if (split.length == 2) { + serviceNameStringBuilder.append(split[1]).append(","); + } else { + serviceNameStringBuilder.append(tagValue).append(","); + } + } } + String serviceNameString = serviceNameStringBuilder.toString(); + if (serviceNameString.endsWith(",")) { + serviceNameString = serviceNameString.substring(0, serviceNameString.length() - 1); + } + authTag.setTagValue(serviceNameString); } else if (StringUtils.equals(authTag.getTagField(), TagConstant.SYSTEM_FIELD.SOURCE_APPLICATION_ID)) { matchArgumentBuilder.setType(BlockAllowListProto.BlockAllowConfig.MatchArgument.Type.CALLER_METADATA); matchArgumentBuilder.setKey(TsfMetadataConstants.TSF_APPLICATION_ID); @@ -238,7 +250,11 @@ private List parseResponse(String decode ModelProto.API.Builder apiBuilder = ModelProto.API.newBuilder(); apiBuilder.setPath(matchStringBuilder); apiBuilder.setProtocol("*"); - apiBuilder.setMethod(authTag.getTagValue()); + String method = authTag.getTagValue(); + if (authTag.getTagOperator().equals(TagConstant.OPERATOR.NOT_EQUAL)) { + method = "!" + method; + } + apiBuilder.setMethod(method); blockAllowConfigBuilder.setApi(apiBuilder.build()); continue; } else { diff --git a/polaris-plugins/polaris-plugins-connector/connector-consul/src/main/java/com/tencent/polaris/plugins/connector/consul/service/ratelimiting/RateLimitingService.java b/polaris-plugins/polaris-plugins-connector/connector-consul/src/main/java/com/tencent/polaris/plugins/connector/consul/service/ratelimiting/RateLimitingService.java index 830fa5e44..a77045816 100644 --- a/polaris-plugins/polaris-plugins-connector/connector-consul/src/main/java/com/tencent/polaris/plugins/connector/consul/service/ratelimiting/RateLimitingService.java +++ b/polaris-plugins/polaris-plugins-connector/connector-consul/src/main/java/com/tencent/polaris/plugins/connector/consul/service/ratelimiting/RateLimitingService.java @@ -255,11 +255,23 @@ private List parseResponse(String decodedValue, String name } else if (StringUtils.equals(cond.get("tagField"), TagConstant.SYSTEM_FIELD.SOURCE_NAMESPACE_SERVICE_NAME)) { matchArgumentBuilder.setType(RateLimitProto.MatchArgument.Type.CALLER_SERVICE); matchArgumentBuilder.setKey("*"); - String[] split = cond.get("tagValue").split("/"); - if (split.length == 2) { - matchArgumentBuilder.setKey(split[0]); - cond.put("tagValue", split[1]); + String[] tagValues = cond.get("tagValue").split(","); + StringBuilder serviceNameStringBuilder = new StringBuilder(); + for (String tagValue : tagValues) { + if (StringUtils.isNotEmpty(tagValue)) { + String[] split = tagValue.split("/"); + if (split.length == 2) { + serviceNameStringBuilder.append(split[1]).append(","); + } else { + serviceNameStringBuilder.append(tagValue).append(","); + } + } } + String serviceNameString = serviceNameStringBuilder.toString(); + if (serviceNameString.endsWith(",")) { + serviceNameString = serviceNameString.substring(0, serviceNameString.length() - 1); + } + cond.put("tagValue", serviceNameString); } else if (StringUtils.equals(cond.get("tagField"), TagConstant.SYSTEM_FIELD.SOURCE_APPLICATION_ID)) { matchArgumentBuilder.setType(RateLimitProto.MatchArgument.Type.CALLER_METADATA); matchArgumentBuilder.setKey(TsfMetadataConstants.TSF_APPLICATION_ID);