Spring Cloud Gateway-系统保护Sentinel集成
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.core.io.buffer.DataBufferUtils;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.web.server.ServerWebExchange;
import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.BlockRequestHandler;
import com.alibaba.csp.sentinel.adapter.gateway.sc.exception.SentinelGatewayBlockExceptionHandler;
import reactor.core.publisher.Mono;
public class SentinelGatewayBlockExceptionHandler implements GlobalFilter, Ordered {
private final BlockRequestHandler blockRequestHandler;
public SentinelGatewayBlockExceptionHandler(BlockRequestHandler blockRequestHandler) {
this.blockRequestHandler = blockRequestHandler;
}
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return chain.filter(exchange).onErrorResume(throwable -> {
if (throwable instanceof com.alibaba.csp.sentinel.slots.block.flow.FlowException) {
ServerHttpResponse response = exchange.getResponse();
response.setStatusCode(HttpStatus.TOO_MANY_REQUESTS);
String message = blockRequestHandler.handleRequest(exchange, throwable);
byte[] bytes = message.getBytes(StandardCharsets.UTF_8);
DataBuffer buffer = response.bufferFactory().wrap(bytes);
response.getHeaders().setContentType(MediaType.APPLICATION_JSON);
return response.writeWith(Mono.just(buffer));
}
return Mono.error(throwable);
});
}
@Override
public int getOrder() {
// -1 is response write filter, in Sentinel Gateway adapter, we use -2 to make response write earlier
return -2;
}
}
这段代码实现了一个自定义的SentinelGatewayBlockExceptionHandler,用于处理Sentinel中的限流异常。当Sentinel检测到流量超出设定的限制时,会抛出FlowException异常,该异常会被这个全局过滤器捕获并处理,返回自定义的响应给客户端。这样可以避免直接暴露Sentinel内部的实现细节,同时允许开发者根据需要定制响应的内容和格式
评论已关闭