自定義異常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,則能夠按照以下步驟來操做。
<dependency> <groupId>com.alibaba.csp</groupId> <artifactId>sentinel-transport-simple-http</artifactId> <version>1.7.1</version> </dependency>
-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 提供一個定製化的界面。