Gateway默认提供了一种限流方法:RequestRateLimiterGatewayFilterFactory,但是生产基本不采用这种方式限流,因为其并不能随着持久化数据的改变而动态改变限流参数,不能做到实时根据流量来改变流量阈值。
一、Gateway网关集成sentinel
引入maven依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-sentinel</artifactId>
</dependency>
在项目配置文件中加上sentinel配置
spring:
cloud:
sentinel:
transport:
port: 8719 #sentinel通信接口
dashboard: 192.168.161.3:8774 #sentinel控制台服务地址
二、配置流控规则
配置接口流控规则,我们这里QPS设置为1
然后在接口测试中,快速点击请求接口会出现如下错误信息
三、自定义流控错误信息
如果想针对限流进行定制化信息响应,可以在WebFluxCallbackManager中注册回调自定义的BlockHandler
public class MySentinelBlockHandler implements BlockRequestHandler {
@Override
public Mono<ServerResponse> handleRequest(ServerWebExchange exchange, Throwable t) {
ErrorResult errorResult = new MySentinelBlockHandler.ErrorResult(
HttpStatus.TOO_MANY_REQUESTS.value(),
"系统繁忙,请稍后再试!");
// JSON result by default.
return ServerResponse.status(HttpStatus.TOO_MANY_REQUESTS)
.contentType(MediaType.APPLICATION_JSON_UTF8)
.body(fromObject(errorResult));
}
private static class ErrorResult {
private final int code;
private final String message;
ErrorResult(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
}
}
参考来源: