Spring Cloud Gateway针对指定接口做响应超时时间限制
在Spring Cloud Gateway中,可以通过定义过滤器来实现对指定接口的响应超时控制。以下是一个使用GatewayFilter
和GatewayFilterFactory
定义超时过滤器的例子:
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.http.HttpStatus;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.concurrent.TimeUnit;
public class TimeoutGatewayFilterFactory implements GlobalFilter {
private int timeout;
public TimeoutGatewayFilterFactory(int timeout) {
this.timeout = timeout;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
ServerHttpResponse response = exchange.getResponse();
// 超时处理逻辑
return chain.filter(exchange)
.timeout(timeout, TimeUnit.SECONDS)
.doOnCancel(() -> {
response.setStatusCode(HttpStatus.GATEWAY_TIMEOUT);
// 清空响应数据
DataBufferUtils.write(response.bufferFactory().wrap("{\"message\":\"Request timeout\"}".getBytes()), response.getBody());
})
.onErrorResume(e -> {
// 发生错误时设置状态码并返回错误信息
response.setStatusCode(HttpStatus.GATEWAY_TIMEOUT);
return Mono.empty();
});
}
}
然后在配置文件中注册这个过滤器工厂,并指定路由的predicate和过滤器:
spring:
cloud:
gateway:
routes:
- id: my_route
uri: https://example.com
predicates:
- Path=/my-service/**
filters:
- name: TimeoutGatewayFilterFactory
args:
timeout: 10 # 超时时间设置为10秒
在这个配置中,所有路径为/my-service/**
的请求都会被应用这个超时过滤器,并且超时时间设置为10秒。如果请求在指定时间内没有响应,则会返回状态码504 GATEWAY_TIMEOUT
。
评论已关闭