diff --git a/microservices-common/microservices-common-security/pom.xml b/microservices-common/microservices-common-security/pom.xml index f80557300..82891a18d 100644 --- a/microservices-common/microservices-common-security/pom.xml +++ b/microservices-common/microservices-common-security/pom.xml @@ -34,6 +34,12 @@ microservices-common-redis + + + com.alibaba.cloud + spring-cloud-starter-alibaba-sentinel + + diff --git a/microservices-common/microservices-common-security/src/main/java/com/microservices/common/security/handler/SentinelBlockExceptionHandler.java b/microservices-common/microservices-common-security/src/main/java/com/microservices/common/security/handler/SentinelBlockExceptionHandler.java new file mode 100644 index 000000000..843591821 --- /dev/null +++ b/microservices-common/microservices-common-security/src/main/java/com/microservices/common/security/handler/SentinelBlockExceptionHandler.java @@ -0,0 +1,47 @@ +package com.microservices.common.security.handler; + +import com.alibaba.csp.sentinel.adapter.spring.webmvc.callback.BlockExceptionHandler; +import com.alibaba.csp.sentinel.slots.block.BlockException; +import com.alibaba.csp.sentinel.slots.block.authority.AuthorityException; +import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException; +import com.alibaba.csp.sentinel.slots.block.flow.FlowException; +import com.alibaba.csp.sentinel.slots.block.flow.param.ParamFlowException; +import com.alibaba.csp.sentinel.slots.system.SystemBlockException; +import com.alibaba.fastjson2.JSONObject; +import com.microservices.common.core.domain.R; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +@Component +public class SentinelBlockExceptionHandler implements BlockExceptionHandler { + + @Override + public void handle(HttpServletRequest request, + HttpServletResponse response, + BlockException ex) throws Exception { + + R body; + if (ex instanceof FlowException) { // 限流 + body = R.fail(429, "请求过于频繁,请稍后重试"); + } else if (ex instanceof DegradeException) { // 熔断 + body = R.fail(500, "服务暂时不可用,请稍后重试"); + } else if (ex instanceof ParamFlowException) { // 热点参数限流 + body = R.fail(400, "热点参数限流"); + } else if (ex instanceof AuthorityException) { // 授权规则 + body = R.fail(403, "无权限访问该资源"); + } else if (ex instanceof SystemBlockException) { // 系统规则 + body = R.fail(500, "系统规则限制,无法访问"); + } else { // 兜底 + body = R.fail(500, "服务繁忙,请稍后重试"); + } + + response.setStatus(HttpStatus.OK.value()); + response.setContentType(MediaType.APPLICATION_JSON_VALUE); + response.setCharacterEncoding("UTF-8"); + response.getWriter().write(JSONObject.toJSONString(body)); + } +} diff --git a/microservices-common/microservices-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports b/microservices-common/microservices-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports index e870629fd..9135a781f 100644 --- a/microservices-common/microservices-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports +++ b/microservices-common/microservices-common-security/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports @@ -4,3 +4,4 @@ com.microservices.common.security.service.impl.RequestCustomServiceImpl com.microservices.common.security.aspect.PreAuthorizeAspect com.microservices.common.security.aspect.InnerAuthAspect com.microservices.common.security.handler.GlobalExceptionHandler +com.microservices.common.security.handler.SentinelBlockExceptionHandler