自定义异常
在前面演示的案例中,当触发限流时,会返回 Blocked by Sentinel:ParamFlowException 这样的异常信息。
但是在实际应用中,一般都以JSON格式进行数据返回,那么怎么修改限流之后返回的数据格式呢?
触发限流后默认处理类是通过下面这段代码来实现的。
@Bean @Order(Ordered.HIGHEST_PRECEDENCE) public SentinelGatewayBlockExceptionHandler sentinelGatewayBlockExceptionHandler(){ return new SentinelGatewayBlockExceptionHandler(viewResolvers,serverCodefigurer) }
在SentinelGatewayBlockExceptionHandler 中实现了WebExceptionHandler 接口,这意味着我们可以实现该接口来自定义异常处理器以实现消息格式的转化。
先创建一个自定义限流异常处理器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); }
通过测试工具访问网关地址,如果被限流,将会获得如下异常。
{"code":999,"msg":"访问人数过多"}
网关流控控制台
Sentinel 在1.6.3版本引入了网关流控控制台,我们可以在Sentinel控制台上查看 API Gateway 实时的Route和自定义API分组的监控,可以在控制台上管理网关的流控规则和API分组配置。
如果需要接入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 提供一个定制化的界面。