From e3810f1586c26ed1cdd45e62cda66aa7ec6684af Mon Sep 17 00:00:00 2001 From: Olga Maciaszek-Sharma Date: Wed, 9 Dec 2020 15:22:10 +0100 Subject: [PATCH] Adjust to changes in commons. --- .../FeignBlockingLoadBalancerClient.java | 16 +++++------ .../loadbalancer/LoadBalancerUtils.java | 27 +++++++++++++++++-- ...ryableFeignBlockingLoadBalancerClient.java | 12 ++++----- .../FeignBlockingLoadBalancerClientTests.java | 8 ++++-- ...eFeignBlockingLoadBalancerClientTests.java | 8 ++++-- 5 files changed, 51 insertions(+), 20 deletions(-) diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/FeignBlockingLoadBalancerClient.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/FeignBlockingLoadBalancerClient.java index f84dc509..067436db 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/FeignBlockingLoadBalancerClient.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/FeignBlockingLoadBalancerClient.java @@ -30,18 +30,18 @@ import org.apache.commons.logging.LogFactory; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.CompletionContext; import org.springframework.cloud.client.loadbalancer.DefaultRequest; -import org.springframework.cloud.client.loadbalancer.DefaultRequestContext; import org.springframework.cloud.client.loadbalancer.DefaultResponse; -import org.springframework.cloud.client.loadbalancer.HttpRequestContext; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.cloud.client.loadbalancer.LoadBalancerLifecycle; import org.springframework.cloud.client.loadbalancer.LoadBalancerLifecycleValidator; +import org.springframework.cloud.client.loadbalancer.RequestDataContext; +import org.springframework.cloud.client.loadbalancer.ResponseData; import org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerProperties; import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; import org.springframework.http.HttpStatus; -import org.springframework.http.client.ClientHttpResponse; import org.springframework.util.Assert; +import static org.springframework.cloud.openfeign.loadbalancer.LoadBalancerUtils.buildRequestData; import static org.springframework.cloud.openfeign.loadbalancer.LoadBalancerUtils.executeWithLoadBalancerLifecycleProcessing; /** @@ -78,12 +78,12 @@ public class FeignBlockingLoadBalancerClient implements Client { String serviceId = originalUri.getHost(); Assert.state(serviceId != null, "Request URI does not contain a valid hostname: " + originalUri); String hint = getHint(serviceId); - DefaultRequest lbRequest = new DefaultRequest<>( - new DefaultRequestContext(request, hint)); + DefaultRequest lbRequest = new DefaultRequest<>( + new RequestDataContext(buildRequestData(request), hint)); Set supportedLifecycleProcessors = LoadBalancerLifecycleValidator .getSupportedLifecycleProcessors( loadBalancerClientFactory.getInstances(serviceId, LoadBalancerLifecycle.class), - HttpRequestContext.class, ClientHttpResponse.class, ServiceInstance.class); + RequestDataContext.class, ResponseData.class, ServiceInstance.class); supportedLifecycleProcessors.forEach(lifecycle -> lifecycle.onStart(lbRequest)); ServiceInstance instance = loadBalancerClient.choose(serviceId, lbRequest); org.springframework.cloud.client.loadbalancer.Response lbResponse = new DefaultResponse( @@ -93,8 +93,8 @@ public class FeignBlockingLoadBalancerClient implements Client { if (LOG.isWarnEnabled()) { LOG.warn(message); } - supportedLifecycleProcessors.forEach( - lifecycle -> lifecycle.onComplete(new CompletionContext( + supportedLifecycleProcessors + .forEach(lifecycle -> lifecycle.onComplete(new CompletionContext( CompletionContext.Status.DISCARD, lbResponse))); return Response.builder().request(request).status(HttpStatus.SERVICE_UNAVAILABLE.value()) .body(message, StandardCharsets.UTF_8).build(); diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/LoadBalancerUtils.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/LoadBalancerUtils.java index 1cc273ce..61dd138a 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/LoadBalancerUtils.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/LoadBalancerUtils.java @@ -17,6 +17,9 @@ package org.springframework.cloud.openfeign.loadbalancer; import java.io.IOException; +import java.net.URI; +import java.util.ArrayList; +import java.util.HashMap; import java.util.Set; import feign.Client; @@ -26,6 +29,11 @@ import feign.Response; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.CompletionContext; import org.springframework.cloud.client.loadbalancer.LoadBalancerLifecycle; +import org.springframework.cloud.client.loadbalancer.RequestData; +import org.springframework.cloud.client.loadbalancer.ResponseData; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpMethod; +import org.springframework.http.HttpStatus; /** * @author Olga Maciaszek-Sharma @@ -45,8 +53,9 @@ final class LoadBalancerUtils { try { Response response = feignClient.execute(feignRequest, options); if (loadBalanced) { - supportedLifecycleProcessors.forEach(lifecycle -> lifecycle - .onComplete(new CompletionContext<>(CompletionContext.Status.SUCCESS, lbResponse, response))); + supportedLifecycleProcessors.forEach( + lifecycle -> lifecycle.onComplete(new CompletionContext<>(CompletionContext.Status.SUCCESS, + lbResponse, buildResponseData(response)))); } return response; } @@ -59,6 +68,20 @@ final class LoadBalancerUtils { } } + static ResponseData buildResponseData(Response response) { + HttpHeaders responseHeaders = new HttpHeaders(); + response.headers().forEach((key, value) -> responseHeaders.put(key, new ArrayList<>(value))); + return new ResponseData(HttpStatus.resolve(response.status()), responseHeaders, null, + buildRequestData(response.request())); + } + + static RequestData buildRequestData(Request request) { + HttpHeaders requestHeaders = new HttpHeaders(); + request.headers().forEach((key, value) -> requestHeaders.put(key, new ArrayList<>(value))); + return new RequestData(HttpMethod.resolve(request.httpMethod().name()), URI.create(request.url()), + requestHeaders, null, new HashMap<>()); + } + static Response executeWithLoadBalancerLifecycleProcessing(Client feignClient, Request.Options options, Request feignRequest, org.springframework.cloud.client.loadbalancer.Response lbResponse, Set supportedLifecycleProcessors) throws IOException { diff --git a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/RetryableFeignBlockingLoadBalancerClient.java b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/RetryableFeignBlockingLoadBalancerClient.java index 97ea9b90..542d2c44 100644 --- a/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/RetryableFeignBlockingLoadBalancerClient.java +++ b/spring-cloud-openfeign-core/src/main/java/org/springframework/cloud/openfeign/loadbalancer/RetryableFeignBlockingLoadBalancerClient.java @@ -35,7 +35,6 @@ import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.CompletionContext; import org.springframework.cloud.client.loadbalancer.DefaultRequest; import org.springframework.cloud.client.loadbalancer.DefaultResponse; -import org.springframework.cloud.client.loadbalancer.HttpRequestContext; import org.springframework.cloud.client.loadbalancer.InterceptorRetryPolicy; import org.springframework.cloud.client.loadbalancer.LoadBalancedRecoveryCallback; import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryContext; @@ -44,6 +43,8 @@ import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryPolicy; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.cloud.client.loadbalancer.LoadBalancerLifecycle; import org.springframework.cloud.client.loadbalancer.LoadBalancerLifecycleValidator; +import org.springframework.cloud.client.loadbalancer.RequestData; +import org.springframework.cloud.client.loadbalancer.ResponseData; import org.springframework.cloud.client.loadbalancer.RetryableRequestContext; import org.springframework.cloud.client.loadbalancer.RetryableStatusCodeException; import org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerProperties; @@ -51,7 +52,6 @@ import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpMethod; import org.springframework.http.HttpRequest; -import org.springframework.http.client.ClientHttpResponse; import org.springframework.retry.RetryListener; import org.springframework.retry.backoff.BackOffPolicy; import org.springframework.retry.backoff.NoBackOffPolicy; @@ -107,7 +107,7 @@ public class RetryableFeignBlockingLoadBalancerClient implements Client { Set supportedLifecycleProcessors = LoadBalancerLifecycleValidator .getSupportedLifecycleProcessors( loadBalancerClientFactory.getInstances(serviceId, LoadBalancerLifecycle.class), - HttpRequestContext.class, ClientHttpResponse.class, ServiceInstance.class); + RetryableRequestContext.class, RequestData.class, ServiceInstance.class); // On retries the policy will choose the server and set it in the context // and extract the server and update the request being made if (context instanceof LoadBalancedRetryContext) { @@ -136,9 +136,9 @@ public class RetryableFeignBlockingLoadBalancerClient implements Client { } org.springframework.cloud.client.loadbalancer.Response lbResponse = new DefaultResponse( retrievedServiceInstance); - supportedLifecycleProcessors.forEach(lifecycle -> lifecycle.onComplete( - new CompletionContext(CompletionContext.Status.DISCARD, - lbResponse))); + supportedLifecycleProcessors.forEach( + lifecycle -> lifecycle.onComplete(new CompletionContext( + CompletionContext.Status.DISCARD, lbResponse))); feignRequest = request; } else { diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/loadbalancer/FeignBlockingLoadBalancerClientTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/loadbalancer/FeignBlockingLoadBalancerClientTests.java index 89b686bb..43610f8d 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/loadbalancer/FeignBlockingLoadBalancerClientTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/loadbalancer/FeignBlockingLoadBalancerClientTests.java @@ -39,6 +39,7 @@ import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.CompletionContext; import org.springframework.cloud.client.loadbalancer.DefaultRequestContext; import org.springframework.cloud.client.loadbalancer.LoadBalancerLifecycle; +import org.springframework.cloud.client.loadbalancer.ResponseData; import org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerProperties; import org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient; import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; @@ -134,6 +135,7 @@ class FeignBlockingLoadBalancerClientTests { @Test void shouldExecuteLoadBalancerLifecycleCallbacks() throws IOException { Request request = testRequest(); + when(delegate.execute(any(), any())).thenReturn(Response.builder().status(200).request(request).build()); Request.Options options = new Request.Options(); String url = "http://127.0.0.1/path"; ServiceInstance serviceInstance = new DefaultServiceInstance("test-1", "test", "test-host", 8888, false); @@ -148,7 +150,7 @@ class FeignBlockingLoadBalancerClientTests { when(loadBalancerClientFactory.getInstances("test", LoadBalancerLifecycle.class)) .thenReturn(loadBalancerLifecycleBeans); - Object actualResult = feignBlockingLoadBalancerClient.execute(request, options); + feignBlockingLoadBalancerClient.execute(request, options); Collection> lifecycleLogRequests = ((TestLoadBalancerLifecycle) loadBalancerLifecycleBeans .get("loadBalancerLifecycle")).getStartLog().values(); @@ -157,7 +159,9 @@ class FeignBlockingLoadBalancerClientTests { assertThat(lifecycleLogRequests) .extracting(lbRequest -> ((DefaultRequestContext) lbRequest.getContext()).getHint()) .contains(callbackTestHint); - assertThat(anotherLifecycleLogRequests).extracting(CompletionContext::getClientResponse).contains(actualResult); + assertThat(anotherLifecycleLogRequests) + .extracting(completionContext -> ((ResponseData) completionContext.getClientResponse()).getHttpStatus()) + .contains(HttpStatus.OK); } private Request testRequest() { diff --git a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/loadbalancer/RetryableFeignBlockingLoadBalancerClientTests.java b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/loadbalancer/RetryableFeignBlockingLoadBalancerClientTests.java index 8376a2d8..6dbe1ec6 100644 --- a/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/loadbalancer/RetryableFeignBlockingLoadBalancerClientTests.java +++ b/spring-cloud-openfeign-core/src/test/java/org/springframework/cloud/openfeign/loadbalancer/RetryableFeignBlockingLoadBalancerClientTests.java @@ -41,11 +41,13 @@ import org.springframework.cloud.client.loadbalancer.CompletionContext; import org.springframework.cloud.client.loadbalancer.DefaultRequestContext; import org.springframework.cloud.client.loadbalancer.LoadBalancedRetryFactory; import org.springframework.cloud.client.loadbalancer.LoadBalancerLifecycle; +import org.springframework.cloud.client.loadbalancer.ResponseData; import org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerProperties; import org.springframework.cloud.loadbalancer.blocking.client.BlockingLoadBalancerClient; import org.springframework.cloud.loadbalancer.blocking.retry.BlockingLoadBalancedRetryPolicy; import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import static org.assertj.core.api.Assertions.assertThat; @@ -192,7 +194,7 @@ class RetryableFeignBlockingLoadBalancerClientTests { when(loadBalancerClientFactory.getInstances("test", LoadBalancerLifecycle.class)) .thenReturn(loadBalancerLifecycleBeans); - Object actualResult = feignBlockingLoadBalancerClient.execute(request, options); + feignBlockingLoadBalancerClient.execute(request, options); Collection> lifecycleLogRequests = ((TestLoadBalancerLifecycle) loadBalancerLifecycleBeans .get("loadBalancerLifecycle")).getStartLog().values(); @@ -201,7 +203,9 @@ class RetryableFeignBlockingLoadBalancerClientTests { assertThat(lifecycleLogRequests) .extracting(lbRequest -> ((DefaultRequestContext) lbRequest.getContext()).getHint()) .contains(callbackTestHint); - assertThat(anotherLifecycleLogRequests).extracting(CompletionContext::getClientResponse).contains(actualResult); + assertThat(anotherLifecycleLogRequests) + .extracting(completionContext -> ((ResponseData) completionContext.getClientResponse()).getHttpStatus()) + .contains(HttpStatus.OK); } private Request testRequest() {