From 04cf3b98c5746a6089674694c167aa7b0239c981 Mon Sep 17 00:00:00 2001 From: Haotian Zhang <928016560@qq.com> Date: Sun, 30 Mar 2025 12:11:06 +0800 Subject: [PATCH 1/2] feat:support zuul circuit breaker fallback response. --- CHANGELOG.md | 1 + .../zuul/PolarisRibbonRoutingFilter.java | 29 ++++++++++++++++++- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 80df27c4a..b537903e9 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -23,3 +23,4 @@ - [fix:fix zuul delay circuit breaker.](https://github.com/Tencent/spring-cloud-tencent/pull/1519) - [fix:fix watch tsf config, fix bean refresh with RefreshScope and ConfigurationProperties.](https://github.com/Tencent/spring-cloud-tencent/pull/1520) - [docs:update circuit breaker examples.](https://github.com/Tencent/spring-cloud-tencent/pull/1521) +- [feat:support zuul circuit breaker fallback response.](https://github.com/Tencent/spring-cloud-tencent/pull/1522) diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilter.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilter.java index a36c48b7c..5ec17b486 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilter.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilter.java @@ -23,6 +23,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Optional; import java.util.Set; import javax.servlet.http.HttpServletRequest; @@ -38,6 +39,7 @@ import com.tencent.cloud.polaris.router.RouterRuleLabelResolver; import com.tencent.cloud.polaris.router.spi.ServletRouterLabelResolver; import com.tencent.cloud.rpc.enhancement.zuul.EnhancedZuulPluginRunner; +import com.tencent.polaris.circuitbreak.client.exception.CallAbortedException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -50,6 +52,7 @@ import org.springframework.cloud.netflix.zuul.filters.route.RibbonCommandFactory; import org.springframework.cloud.netflix.zuul.filters.route.RibbonRoutingFilter; import org.springframework.core.Ordered; +import org.springframework.http.HttpStatus; import org.springframework.lang.NonNull; import org.springframework.util.CollectionUtils; import org.springframework.util.MultiValueMap; @@ -196,7 +199,31 @@ private void init() { @Override public Object run() { - enhancedZuulPluginRunner.run(); + // Run pre enhanced plugins. + try { + enhancedZuulPluginRunner.run(); + } + catch (CallAbortedException e) { + if (e.getFallbackInfo() == null) { + throw e; + } + // circuit breaker fallback, not need to run post/exception enhanced plugins. + RequestContext context = RequestContext.getCurrentContext(); + // s + context.setSendZuulResponse(false); + // set response status code + HttpStatus httpStatus = HttpStatus.resolve(e.getFallbackInfo().getCode()); + context.setResponseStatusCode(httpStatus != null ? httpStatus.value() : HttpStatus.INTERNAL_SERVER_ERROR.value()); + // set response body + String body = Optional.of(e.getFallbackInfo().getBody()).orElse(""); + context.setResponseBody(body); + // set response content type + context.getResponse().setContentType("text/plain;charset=UTF-8"); + // set response headers + if (com.tencent.polaris.api.utils.CollectionUtils.isNotEmpty(e.getFallbackInfo().getHeaders())) { + e.getFallbackInfo().getHeaders().forEach(context.getResponse()::addHeader); + } + } return super.run(); } } From 9b1b8d5235722fa59f9a7420b46b99b4ae0f3beb Mon Sep 17 00:00:00 2001 From: Haotian Zhang <928016560@qq.com> Date: Sun, 30 Mar 2025 12:28:07 +0800 Subject: [PATCH 2/2] feat:support zuul circuit breaker fallback response. --- .../polaris/router/zuul/PolarisRibbonRoutingFilter.java | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilter.java b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilter.java index 5ec17b486..c8a788e83 100644 --- a/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilter.java +++ b/spring-cloud-starter-tencent-polaris-router/src/main/java/com/tencent/cloud/polaris/router/zuul/PolarisRibbonRoutingFilter.java @@ -199,6 +199,7 @@ private void init() { @Override public Object run() { + RequestContext context = RequestContext.getCurrentContext(); // Run pre enhanced plugins. try { enhancedZuulPluginRunner.run(); @@ -208,8 +209,7 @@ public Object run() { throw e; } // circuit breaker fallback, not need to run post/exception enhanced plugins. - RequestContext context = RequestContext.getCurrentContext(); - // s + // set sendZuulResponse to false context.setSendZuulResponse(false); // set response status code HttpStatus httpStatus = HttpStatus.resolve(e.getFallbackInfo().getCode()); @@ -224,6 +224,9 @@ public Object run() { e.getFallbackInfo().getHeaders().forEach(context.getResponse()::addHeader); } } - return super.run(); + if (context.sendZuulResponse()) { + return super.run(); + } + return null; } }