SentinelFallbackHandler.java 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. package com.ruoyi.gateway.handler;
  2. import java.nio.charset.StandardCharsets;
  3. import com.alibaba.csp.sentinel.adapter.gateway.sc.callback.GatewayCallbackManager;
  4. import com.alibaba.csp.sentinel.slots.block.BlockException;
  5. import org.springframework.core.io.buffer.DataBuffer;
  6. import org.springframework.http.server.reactive.ServerHttpResponse;
  7. import org.springframework.web.reactive.function.server.ServerResponse;
  8. import org.springframework.web.server.ServerWebExchange;
  9. import org.springframework.web.server.WebExceptionHandler;
  10. import reactor.core.publisher.Mono;
  11. /**
  12. * 自定义限流异常处理
  13. *
  14. * @author ruoyi
  15. */
  16. public class SentinelFallbackHandler implements WebExceptionHandler
  17. {
  18. private Mono<Void> writeResponse(ServerResponse response, ServerWebExchange exchange)
  19. {
  20. ServerHttpResponse serverHttpResponse = exchange.getResponse();
  21. serverHttpResponse.getHeaders().add("Content-Type", "application/json;charset=UTF-8");
  22. byte[] datas = "{\"status\":429,\"message\":\"请求超过最大数,请稍后再试\"}".getBytes(StandardCharsets.UTF_8);
  23. DataBuffer buffer = serverHttpResponse.bufferFactory().wrap(datas);
  24. return serverHttpResponse.writeWith(Mono.just(buffer));
  25. }
  26. @Override
  27. public Mono<Void> handle(ServerWebExchange exchange, Throwable ex)
  28. {
  29. if (exchange.getResponse().isCommitted())
  30. {
  31. return Mono.error(ex);
  32. }
  33. if (!BlockException.isBlockException(ex))
  34. {
  35. return Mono.error(ex);
  36. }
  37. return handleBlockedRequest(exchange, ex).flatMap(response -> writeResponse(response, exchange));
  38. }
  39. private Mono<ServerResponse> handleBlockedRequest(ServerWebExchange exchange, Throwable throwable)
  40. {
  41. return GatewayCallbackManager.getBlockHandler().handleRequest(exchange, throwable);
  42. }
  43. }