in dubbo-filter-extensions/dubbo-filter-polaris-dubbo2/dubbo-filter-polaris-ratelimit-dubbo2/src/main/java/org/apache/dubbo/filter/dubbo2/RateLimitFilter.java [77:120]
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
String service = invoker.getInterface().getName();
PolarisOperator polarisOperator = getPolarisOperator();
if (null == polarisOperator) {
return invoker.invoke(invocation);
}
ServiceRule serviceRule = polarisOperator.getServiceRule(service, EventType.RATE_LIMITING);
Object ruleObject = serviceRule.getRule();
if (null == ruleObject) {
return invoker.invoke(invocation);
}
RateLimitProto.RateLimit rateLimit = (RateLimitProto.RateLimit) ruleObject;
Set<RateLimitProto.MatchArgument> ratelimitLabels = ruleHandler.getRatelimitLabels(rateLimit);
String method = invocation.getMethodName();
Set<Argument> arguments = new HashSet<>();
for (RateLimitProto.MatchArgument matchArgument : ratelimitLabels) {
switch (matchArgument.getType()) {
case HEADER:
String attachmentValue = RpcContext.getContext().getAttachment(matchArgument.getKey());
if (!StringUtils.isBlank(attachmentValue)) {
arguments.add(Argument.buildHeader(matchArgument.getKey(), attachmentValue));
}
break;
case QUERY:
Optional<String> queryValue = parser.parse(matchArgument.getKey(), invocation.getArguments());
queryValue.ifPresent(value -> arguments.add(Argument.buildQuery(matchArgument.getKey(), value)));
break;
default:
break;
}
}
QuotaResponse quotaResponse = null;
try {
quotaResponse = polarisOperator.getQuota(service, method, arguments);
} catch (PolarisException e) {
LOGGER.error("[POLARIS] get quota fail, {}", e);
}
if (null != quotaResponse && quotaResponse.getCode() == QuotaResultCode.QuotaResultLimited) {
// throw block exception when ratelimit occurs
return callback.handle(invoker, invocation, new PolarisBlockException(
String.format("url=%s, info=%s", invoker.getUrl(), quotaResponse.getInfo())));
}
return invoker.invoke(invocation);
}