Gateway整合Sentinel限流

96 阅读1分钟

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 image.png

然后在接口测试中,快速点击请求接口会出现如下错误信息

image.png

三、自定义流控错误信息

如果想针对限流进行定制化信息响应,可以在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;
    }
  }
}

image.png

参考来源: