解决zuul ratelimit策略与路由匹配问题

在SpringCloud微服务架构中,使用zuul作为服务网关,并通过spring-cloud-zuul-ratelimit组件实现限流。然而,限流策略与路由配置的匹配问题导致策略无法生效,关键在于zuul自动生成的路由id与配置的serviceId不一致。本文详细解析了这一问题,并提供了解决方案。

在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

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值