Spring Cloud Gateway 集成 Sentinel 网关限流(2)

自定义异常java

      在前面演示的案例中,当触发限流时,会返回 Blocked by Sentinel:ParamFlowException 这样的异常信息。spring

      可是在实际应用中,通常都以JSON格式进行数据返回,那么怎么修改限流以后返回的数据格式呢?json

       触发限流后默认处理类是经过下面这段代码来实现的。app

@Bean
@Order(Ordered.HIGHEST_PRECEDENCE)
public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler(){
return new SentinelGatewayBlockExceptionHandler(viewResolvers,serverCodefigurer)
}

  在SentinelGatewayBlockExceptionHandler 中实现了WebExceptionHandler 接口,这意味着咱们能够实现该接口来自定义异常处理器以实现消息格式的转化。ide

        先建立一个自定义限流异常处理器GpSentinelGatewayBlockExceptionHandler, 全部代码均可以直接从SentinelGatewayBlockExceptionHandler 中复制过来,咱们只须要修改writeResponse方法,该方法的做用是限流的异常信息写回客户端。工具

public class GpSentinelGatewayBlockExceptionHandler implements WebExceptionhandler{
  private List<ViewResolver> viewResolvers;
   
  private List<HttpMessageWriter<?>> messageWriters;


  public GpSentinelGatewayBlockExceptionHandler (List<ViewResolver> viewResolvers, ServerCodecConfigurer serverCodecConfigurer){
       this.viewResolvers = viewResolvers;
       this.messageWriters = serverCodecConfigurer.getWriters();
  }

  //省略无关代码
 private Mono<Void> writeResponse(ServerResponse response, ServerWebExchange exchange){

     ServerHttpResponse serverHttpResponse = exchange.getResponse();
     serverHttpResponses.getHeaders().add("Content-Type","application/json; charset=UTF-8");
    byte[] datas ="{\"code\":999,\"msg\":\"访问人数过多\"}".getBytes(StandardCharset.UTF_8);
    DataBuffer buffer = serverHttpResponse.bufferFactory().wrap(datas);
    return serverHttpResponse.writWith(Mono.just(buffer));
}

}

  在配置类中注入自定义限流异常处理器。测试

@Bean
@Order(Ordered.HIGHST_PRECEDENCE)

public GpSentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler(){
     return new GpSentinelGatewayBlockExceptionHandler(viewResolvers, serverCodecConfigurer);
}

  经过测试工具访问网关地址,若是被限流,将会得到以下异常。this

{"code":999,"msg":"访问人数过多"}

 网关流控控制台code

   Sentinel 在1.6.3版本引入了网关流控控制台,咱们能够在Sentinel控制台上查看 API Gateway 实时的Route和自定义API分组的监控,能够在控制台上管理网关的流控规则和API分组配置。server

    若是须要接入Sentinel Dashboard,则能够按照以下步骤来操做。

  •   添加Jar包依赖
  <dependency>
            <groupId>com.alibaba.csp</groupId>
            <artifactId>sentinel-transport-simple-http</artifactId>
            <version>1.7.1</version>
  </dependency>
  • 在启动配置中添加VM参数。
-Dcsp.sentinel.dashboard.server=192.168.216.128:8081
-Dproject.name=spring-cloud-nacos-gateway-consumer 
-Dcsp.sentinel.app.type=1

    其中-Dcsp.sentinel.app.type=1 是在 Spring Cloud Gateway 接入 Sentinel 的时候才须要配置的,配置好之后Sentinel Dashboard 会针对Gateway 提供一个定制化的界面。

相关文章
相关标签/搜索