如何在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);

};

}

}


回答:

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

以上是 如何在Spring cloud gateway 中获取未填充变量的请求路径(eg: /page/{id})? 的全部内容, 来源链接: utcz.com/p/944634.html

回到顶部