如何在Spring cloud gateway 中获取未填充变量的请求路径(eg: /page/{id})?

新手上路,请多包涵

问题描述

目前想在 gateway 中根据接口进行限流,即:每个接口都限制为 n 次/秒

问题出现的环境背景及自己尝试过哪些方法

刚开始的时候,想当然就是直接获取 uri,然后发现并不能处理 有 路径变量的接口,例如:/xxx/{id},对于这种接口,每传不同的 id,都会被识别为不同的接口。

Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);
ServerHttpRequest request = exchange.getRequest();
String uri = request.getURI().getPath();
Mono.just(Optional.ofNullable(route).map(Route::getId).orElse("") + "/" + uri);

想知道有没有好的办法能解决这个问题。

目前 gateway 代码:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.cloud.gateway.route.Route;
import org.springframework.cloud.gateway.support.ServerWebExchangeUtils;
import org.springframework.context.annotation.Bean;
import org.springframework.http.server.reactive.ServerHttpRequest;
import reactor.core.publisher.Mono;

import java.util.Optional;

@SpringBootApplication
@EnableDiscoveryClient
public class GatewayApplication {

    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication.class, args);
    }

    @Bean
    public KeyResolver customKeyResolver() {
        return exchange -> {
            // 获取当前路由
            Route route = exchange.getAttribute(ServerWebExchangeUtils.GATEWAY_ROUTE_ATTR);

            ServerHttpRequest request = exchange.getRequest();
            String uri = request.getURI().getPath();
            return Mono.just(Optional.ofNullable(route).map(Route::getId).orElse("") + "/" + uri);

        };
    }
}
阅读 1.8k
1 个回答

/xxx/{id}传入不同的id,实际上就是不同的接口,如果你想根据/xxx/这个路径进行限流,可以在这个方法加个注解,在限流的逻辑里获取是否有这个注解。也可以修改接口,将id 放入参数。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题