在Spring Cloud微服务架构中,一般使用zuul来做服务网关,用spring-cloud-zuul-ratelimit这个组件来做限流,那么要使限流策略生效有前提就是要与路由配置匹配上。假设有如下配置:
zuul.routes.hms-cloud-infrastructure = /infrastructure/**
zuul.ratelimit.enabled = true
zuul.ratelimit.repository = IN_MEMORY
zuul.ratelimit.policies.hms-cloud-infrastructure.limit = 2
zuul.ratelimit.policies.hms-cloud-infrastructure.quota = 1
zuul.ratelimit.policies.hms-cloud-infrastructure.refresh-interval = 3
其中,hms-cloud-infrastructure是路由serviceId。
这样配置后限流策略与路由配置是无法匹配上的,原因是spring-cloud-zuul-ratelimit在做匹配的时候用的是路由id而不是serviceId,去看一下源码:
@RequiredArgsConstructor
public abstract class AbstractRateLimitFilter extends ZuulFilter {
// 省略一些代码...
private final RateLimitProperties properties;
private final RouteLocator routeLocator;
private final UrlPathHelper urlPathHelper;
// 判断是否需要进行过滤
@Override
public boolean shouldFilter() {
return properties.isEnabled() && !policy(route()).isEmpty();
}
Route route() {
String requestURI = urlPathHelper.getPathWithinApplication(RequestContext.getCurrentContext().getRequest());
return routeLocator.getMatchingRoute(requestURI);
}
protected List<Policy> policy(final Route route) {
if (route != null) {
// 根据路由id来进行匹配
return properties.getPolicies(route.getId());
}
return properties.getDefaultPolicyList();
}
}
RateLimitProperties.policies是一个HashMap,其key为serviceId,在上例中即为hms-cloud-infrastructure,但zuul自动生成的路由id为infrastructure,所以是匹配不上的。如果要使限流策略生效,则需要将路由id配置为与serviceId一致。如:
zuul.routes.hms-cloud-infrastructure.id = hms-cloud-infrastructure
在SpringCloud微服务架构中,使用zuul作为服务网关,并通过spring-cloud-zuul-ratelimit组件实现限流。然而,限流策略与路由配置的匹配问题导致策略无法生效,关键在于zuul自动生成的路由id与配置的serviceId不一致。本文详细解析了这一问题,并提供了解决方案。
168万+





