Skip to content

Commit

Permalink
Fix the issue where Spring Cloud Gateway gets a null response content…
Browse files Browse the repository at this point in the history
… when trying to judge the circuit breaker
  • Loading branch information
hexiaofeng committed Oct 21, 2024
1 parent 87ee0cc commit 8ea61f7
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,14 @@
package com.jd.live.agent.plugin.router.springgateway.v3.cluster;

import com.jd.live.agent.core.util.Futures;
import com.jd.live.agent.governance.exception.ErrorPredicate;
import com.jd.live.agent.governance.exception.ServiceError;
import com.jd.live.agent.governance.invoke.cluster.ClusterInvoker;
import com.jd.live.agent.governance.policy.service.circuitbreak.DegradeConfig;
import com.jd.live.agent.governance.policy.service.cluster.ClusterPolicy;
import com.jd.live.agent.governance.policy.service.cluster.RetryPolicy;
import com.jd.live.agent.governance.policy.service.exception.CodePolicy;
import com.jd.live.agent.governance.request.Request;
import com.jd.live.agent.governance.exception.ErrorPredicate;
import com.jd.live.agent.governance.exception.ServiceError;
import com.jd.live.agent.plugin.router.springcloud.v3.cluster.AbstractClientCluster;
import com.jd.live.agent.plugin.router.springcloud.v3.instance.SpringEndpoint;
import com.jd.live.agent.plugin.router.springgateway.v3.request.GatewayClusterRequest;
Expand Down Expand Up @@ -110,11 +110,10 @@ protected boolean isRetryable() {
public CompletionStage<GatewayClusterResponse> invoke(GatewayClusterRequest request, SpringEndpoint endpoint) {
try {
Set<CodePolicy> codePolicies = request.getAttribute(Request.KEY_CODE_POLICY);
ServerWebExchange exchange = request.getExchange();
if (codePolicies != null && !codePolicies.isEmpty()) {
exchange = exchange.mutate().response(new BodyResponseDecorator(exchange, codePolicies)).build();
}
GatewayClusterResponse response = new GatewayClusterResponse(exchange.getResponse());
ServerWebExchange exchange = codePolicies != null && !codePolicies.isEmpty()
? request.getExchange().mutate().response(new BodyResponseDecorator(request.getExchange(), codePolicies)).build()
: request.getExchange();
GatewayClusterResponse response = new GatewayClusterResponse(exchange.getResponse(), () -> (String) exchange.getAttributes().get(Request.KEY_RESPONSE_BODY));
return request.getChain().filter(exchange).toFuture().thenApply(v -> response);
} catch (Throwable e) {
return Futures.future(e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,24 +15,35 @@
*/
package com.jd.live.agent.plugin.router.springgateway.v3.response;

import com.jd.live.agent.core.util.cache.LazyObject;
import com.jd.live.agent.governance.exception.ErrorPredicate;
import com.jd.live.agent.governance.exception.ServiceError;
import com.jd.live.agent.governance.response.AbstractHttpResponse.AbstractHttpOutboundResponse;
import org.springframework.http.server.reactive.ServerHttpResponse;

import java.util.function.Supplier;

/**
* GatewayClusterResponse
*
* @since 1.0.0
*/
public class GatewayClusterResponse extends AbstractHttpOutboundResponse<ServerHttpResponse> {

private final LazyObject<String> body;

public GatewayClusterResponse(ServerHttpResponse response) {
this(response, null);
}

public GatewayClusterResponse(ServerHttpResponse response, Supplier<String> supplier) {
super(response);
this.body = new LazyObject<>(supplier);
}

public GatewayClusterResponse(ServiceError error, ErrorPredicate predicate) {
super(error, predicate);
this.body = null;
}

@Override
Expand All @@ -41,4 +52,8 @@ public String getCode() {
return code == null ? null : code.toString();
}

@Override
public Object getResult() {
return body == null ? null : body.get();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -113,11 +113,10 @@ protected boolean isRetryable() {
public CompletionStage<GatewayClusterResponse> invoke(GatewayClusterRequest request, SpringEndpoint endpoint) {
try {
Set<CodePolicy> codePolicies = request.getAttribute(Request.KEY_CODE_POLICY);
ServerWebExchange exchange = request.getExchange();
if (codePolicies != null && !codePolicies.isEmpty()) {
exchange = exchange.mutate().response(new BodyResponseDecorator(exchange, codePolicies)).build();
}
GatewayClusterResponse response = new GatewayClusterResponse(exchange.getResponse());
ServerWebExchange exchange = codePolicies != null && !codePolicies.isEmpty()
? request.getExchange().mutate().response(new BodyResponseDecorator(request.getExchange(), codePolicies)).build()
: request.getExchange();
GatewayClusterResponse response = new GatewayClusterResponse(exchange.getResponse(), () -> (String) exchange.getAttributes().get(Request.KEY_RESPONSE_BODY));
return request.getChain().filter(exchange).toFuture().thenApply(v -> response);
} catch (Throwable e) {
return Futures.future(e);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,25 +15,36 @@
*/
package com.jd.live.agent.plugin.router.springgateway.v4.response;

import com.jd.live.agent.governance.response.AbstractHttpResponse.AbstractHttpOutboundResponse;
import com.jd.live.agent.core.util.cache.LazyObject;
import com.jd.live.agent.governance.exception.ErrorPredicate;
import com.jd.live.agent.governance.exception.ServiceError;
import com.jd.live.agent.governance.response.AbstractHttpResponse.AbstractHttpOutboundResponse;
import org.springframework.http.HttpStatusCode;
import org.springframework.http.server.reactive.ServerHttpResponse;

import java.util.function.Supplier;

/**
* GatewayClusterResponse
*
* @since 1.0.0
*/
public class GatewayClusterResponse extends AbstractHttpOutboundResponse<ServerHttpResponse> {

private final LazyObject<String> body;

public GatewayClusterResponse(ServerHttpResponse response) {
this(response, null);
}

public GatewayClusterResponse(ServerHttpResponse response, Supplier<String> supplier) {
super(response);
this.body = new LazyObject<>(supplier);
}

public GatewayClusterResponse(ServiceError error, ErrorPredicate predicate) {
super(error, predicate);
this.body = null;
}

@Override
Expand All @@ -42,4 +53,9 @@ public String getCode() {
return status == null ? null : String.valueOf(status.value());
}

@Override
public Object getResult() {
return body == null ? null : body.get();
}

}

0 comments on commit 8ea61f7

Please sign in to comment.