Do not pass response body to LB lifecycle beans. (#864)

* Do not pass response body to LB lifecycle beans.

* Fix argument name.
This commit is contained in:
Olga Maciaszek-Sharma
2020-12-09 06:37:58 -06:00
committed by GitHub
parent 0f98419c47
commit dce413ae66
13 changed files with 293 additions and 189 deletions

View File

@@ -24,13 +24,10 @@ import org.apache.commons.logging.LogFactory;
import reactor.core.publisher.Flux;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.ClientRequestContext;
import org.springframework.cloud.client.loadbalancer.Request;
import org.springframework.cloud.client.loadbalancer.ServerHttpRequestContext;
import org.springframework.cloud.client.loadbalancer.RequestDataContext;
import org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerProperties;
import org.springframework.http.HttpCookie;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.web.reactive.function.client.ClientRequest;
import org.springframework.util.MultiValueMap;
/**
* A session cookie based implementation of {@link ServiceInstanceListSupplier} that gives
@@ -66,10 +63,13 @@ public class RequestBasedStickySessionServiceInstanceListSupplier extends Delega
public Flux<List<ServiceInstance>> get(Request request) {
String instanceIdCookieName = properties.getStickySession().getInstanceIdCookieName();
Object context = request.getContext();
if ((context instanceof ClientRequestContext)) {
ClientRequest originalRequest = ((ClientRequestContext) context).getClientRequest();
if ((context instanceof RequestDataContext)) {
MultiValueMap<String, String> cookies = ((RequestDataContext) context).getClientRequest().getCookies();
if (cookies == null) {
return get();
}
// We expect there to be one value in this cookie
String cookie = originalRequest.cookies().getFirst(instanceIdCookieName);
String cookie = cookies.getFirst(instanceIdCookieName);
if (cookie != null) {
return get().map(serviceInstances -> selectInstance(serviceInstances, cookie));
}
@@ -78,23 +78,8 @@ public class RequestBasedStickySessionServiceInstanceListSupplier extends Delega
}
return get();
}
if ((context instanceof ServerHttpRequestContext)) {
ServerHttpRequest originalRequest = ((ServerHttpRequestContext) context).getClientRequest();
HttpCookie cookie = originalRequest.getCookies().getFirst(instanceIdCookieName);
if (cookie != null) {
return get().map(serviceInstances -> selectInstance(serviceInstances, cookie.getValue()));
}
if (LOG.isDebugEnabled()) {
LOG.debug("Cookie not found. Returning all instances returned by delegate.");
}
return get();
}
if (LOG.isDebugEnabled()) {
LOG.debug("Searching for instances based on cookie not supported for ClientRequestContext type."
+ " Returning all instances returned by delegate.");
}
// If no cookie is available, we return all the instances provided by the
// delegate.
// If the object type is not RequestData, we return all the instances provided by
// the delegate.
return get();
}

View File

@@ -25,17 +25,14 @@ import reactor.core.publisher.Flux;
import org.springframework.cloud.client.DefaultServiceInstance;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.ClientRequestContext;
import org.springframework.cloud.client.loadbalancer.DefaultRequest;
import org.springframework.cloud.client.loadbalancer.DefaultRequestContext;
import org.springframework.cloud.client.loadbalancer.Request;
import org.springframework.cloud.client.loadbalancer.ServerHttpRequestContext;
import org.springframework.cloud.client.loadbalancer.RequestData;
import org.springframework.cloud.client.loadbalancer.RequestDataContext;
import org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerProperties;
import org.springframework.http.HttpCookie;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.reactive.function.client.ClientRequest;
import static org.assertj.core.api.Assertions.assertThat;
@@ -77,7 +74,8 @@ class RequestBasedStickySessionServiceInstanceListSupplierTests {
HttpHeaders headers = new HttpHeaders();
headers.add(properties.getStickySession().getInstanceIdCookieName(), "test-1");
when(clientRequest.cookies()).thenReturn(headers);
Request<ClientRequestContext> request = new DefaultRequest<>(new ClientRequestContext(clientRequest));
Request<RequestDataContext> request = new DefaultRequest<>(
new RequestDataContext(new RequestData(clientRequest)));
List<ServiceInstance> serviceInstances = supplier.get(request).blockFirst();
@@ -90,7 +88,8 @@ class RequestBasedStickySessionServiceInstanceListSupplierTests {
HttpHeaders headers = new HttpHeaders();
headers.add(properties.getStickySession().getInstanceIdCookieName(), "test-4");
when(clientRequest.cookies()).thenReturn(headers);
Request<ClientRequestContext> request = new DefaultRequest<>(new ClientRequestContext(clientRequest));
Request<RequestDataContext> request = new DefaultRequest<>(
new RequestDataContext(new RequestData(clientRequest)));
List<ServiceInstance> serviceInstances = supplier.get(request).blockFirst();
@@ -100,48 +99,8 @@ class RequestBasedStickySessionServiceInstanceListSupplierTests {
@Test
void shouldReturnAllInstancesFromDelegateIfClientRequestHasNoCookie() {
when(clientRequest.cookies()).thenReturn(new HttpHeaders());
Request<ClientRequestContext> request = new DefaultRequest<>(new ClientRequestContext(clientRequest));
List<ServiceInstance> serviceInstances = supplier.get(request).blockFirst();
assertThat(serviceInstances).hasSize(3);
}
@Test
void shouldReturnInstanceBasedOnCookieFromServerHttpRequest() {
MultiValueMap<String, HttpCookie> cookies = new LinkedMultiValueMap<>();
cookies.add(properties.getStickySession().getInstanceIdCookieName(),
new HttpCookie(properties.getStickySession().getInstanceIdCookieName(), "test-1"));
when(serverHttpRequest.getCookies()).thenReturn(cookies);
Request<ServerHttpRequestContext> request = new DefaultRequest<>(
new ServerHttpRequestContext(serverHttpRequest));
List<ServiceInstance> serviceInstances = supplier.get(request).blockFirst();
assertThat(serviceInstances).hasSize(1);
assertThat(serviceInstances.get(0).getInstanceId()).isEqualTo("test-1");
}
@Test
void shouldReturnAllDelegateInstancesIfInstanceBasedOnCookieFromServerHttpRequestNotFound() {
MultiValueMap<String, HttpCookie> cookies = new LinkedMultiValueMap<>();
cookies.add(properties.getStickySession().getInstanceIdCookieName(),
new HttpCookie(properties.getStickySession().getInstanceIdCookieName(), "test-4"));
when(serverHttpRequest.getCookies()).thenReturn(cookies);
Request<ServerHttpRequestContext> request = new DefaultRequest<>(
new ServerHttpRequestContext(serverHttpRequest));
List<ServiceInstance> serviceInstances = supplier.get(request).blockFirst();
assertThat(serviceInstances).hasSize(3);
}
@Test
void shouldReturnAllInstancesFromDelegateIfServerHttpRequestHasNoCookie() {
MultiValueMap<String, HttpCookie> cookies = new LinkedMultiValueMap<>();
when(serverHttpRequest.getCookies()).thenReturn(cookies);
Request<ServerHttpRequestContext> request = new DefaultRequest<>(
new ServerHttpRequestContext(serverHttpRequest));
Request<RequestDataContext> request = new DefaultRequest<>(
new RequestDataContext(new RequestData(clientRequest)));
List<ServiceInstance> serviceInstances = supplier.get(request).blockFirst();