ObjectProvider.getIfAvailable() is called too frequently, fix this performance problem.
This commit is contained in:
committed by
Spencer Gibb
parent
e960eadb32
commit
38b2168fed
@@ -19,10 +19,20 @@ public class ForwardRoutingFilter implements GlobalFilter, Ordered {
|
||||
|
||||
private static final Log log = LogFactory.getLog(ForwardRoutingFilter.class);
|
||||
|
||||
private final ObjectProvider<DispatcherHandler> dispatcherHandler;
|
||||
private final ObjectProvider<DispatcherHandler> dispatcherHandlerProvider;
|
||||
//do not use this dispatcherHandler directly, use getDispatcherHandler() instead.
|
||||
private volatile DispatcherHandler dispatcherHandler;
|
||||
|
||||
public ForwardRoutingFilter(ObjectProvider<DispatcherHandler> dispatcherHandler) {
|
||||
this.dispatcherHandler = dispatcherHandler;
|
||||
public ForwardRoutingFilter(ObjectProvider<DispatcherHandler> dispatcherHandlerProvider) {
|
||||
this.dispatcherHandlerProvider = dispatcherHandlerProvider;
|
||||
}
|
||||
|
||||
private DispatcherHandler getDispatcherHandler() {
|
||||
if (dispatcherHandler == null) {
|
||||
dispatcherHandler = dispatcherHandlerProvider.getIfAvailable();
|
||||
}
|
||||
|
||||
return dispatcherHandler;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -46,6 +56,6 @@ public class ForwardRoutingFilter implements GlobalFilter, Ordered {
|
||||
log.trace("Forwarding to URI: "+requestUrl);
|
||||
}
|
||||
|
||||
return this.dispatcherHandler.getIfAvailable().handle(exchange);
|
||||
return this.getDispatcherHandler().handle(exchange);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -61,17 +61,26 @@ import static org.springframework.cloud.gateway.support.ServerWebExchangeUtils.s
|
||||
public class NettyRoutingFilter implements GlobalFilter, Ordered {
|
||||
|
||||
private final HttpClient httpClient;
|
||||
private final ObjectProvider<List<HttpHeadersFilter>> headersFilters;
|
||||
private final ObjectProvider<List<HttpHeadersFilter>> headersFiltersProvider;
|
||||
private final HttpClientProperties properties;
|
||||
//do not use this headersFilters directly, use getHeadersFilters() instead.
|
||||
private volatile List<HttpHeadersFilter> headersFilters;
|
||||
|
||||
public NettyRoutingFilter(HttpClient httpClient,
|
||||
ObjectProvider<List<HttpHeadersFilter>> headersFilters,
|
||||
ObjectProvider<List<HttpHeadersFilter>> headersFiltersProvider,
|
||||
HttpClientProperties properties) {
|
||||
this.httpClient = httpClient;
|
||||
this.headersFilters = headersFilters;
|
||||
this.headersFiltersProvider = headersFiltersProvider;
|
||||
this.properties = properties;
|
||||
}
|
||||
|
||||
public List<HttpHeadersFilter> getHeadersFilters() {
|
||||
if (headersFilters == null) {
|
||||
headersFilters = headersFiltersProvider.getIfAvailable();
|
||||
}
|
||||
return headersFilters;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getOrder() {
|
||||
return Ordered.LOWEST_PRECEDENCE;
|
||||
@@ -92,8 +101,7 @@ public class NettyRoutingFilter implements GlobalFilter, Ordered {
|
||||
final HttpMethod method = HttpMethod.valueOf(request.getMethodValue());
|
||||
final String url = requestUrl.toString();
|
||||
|
||||
HttpHeaders filtered = filterRequest(this.headersFilters.getIfAvailable(),
|
||||
exchange);
|
||||
HttpHeaders filtered = filterRequest(getHeadersFilters(), exchange);
|
||||
|
||||
final DefaultHttpHeaders httpHeaders = new DefaultHttpHeaders();
|
||||
filtered.forEach(httpHeaders::set);
|
||||
@@ -149,7 +157,7 @@ public class NettyRoutingFilter implements GlobalFilter, Ordered {
|
||||
|
||||
// make sure headers filters run after setting status so it is available in response
|
||||
HttpHeaders filteredResponseHeaders = HttpHeadersFilter.filter(
|
||||
this.headersFilters.getIfAvailable(), headers, exchange, Type.RESPONSE);
|
||||
getHeadersFilters(), headers, exchange, Type.RESPONSE);
|
||||
|
||||
response.getHeaders().putAll(filteredResponseHeaders);
|
||||
|
||||
|
||||
@@ -38,14 +38,16 @@ public class WebsocketRoutingFilter implements GlobalFilter, Ordered {
|
||||
|
||||
private final WebSocketClient webSocketClient;
|
||||
private final WebSocketService webSocketService;
|
||||
private final ObjectProvider<List<HttpHeadersFilter>> headersFilters;
|
||||
private final ObjectProvider<List<HttpHeadersFilter>> headersFiltersProvider;
|
||||
//do not use this headersFilters directly, use getHeadersFilters() instead.
|
||||
private volatile List<HttpHeadersFilter> headersFilters;
|
||||
|
||||
public WebsocketRoutingFilter(WebSocketClient webSocketClient,
|
||||
WebSocketService webSocketService,
|
||||
ObjectProvider<List<HttpHeadersFilter>> headersFilters) {
|
||||
ObjectProvider<List<HttpHeadersFilter>> headersFiltersProvider) {
|
||||
this.webSocketClient = webSocketClient;
|
||||
this.webSocketService = webSocketService;
|
||||
this.headersFilters = headersFilters;
|
||||
this.headersFiltersProvider = headersFiltersProvider;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -68,8 +70,7 @@ public class WebsocketRoutingFilter implements GlobalFilter, Ordered {
|
||||
|
||||
|
||||
HttpHeaders headers = exchange.getRequest().getHeaders();
|
||||
HttpHeaders filtered = filterRequest(getHeadersFilters(),
|
||||
exchange);
|
||||
HttpHeaders filtered = filterRequest(getHeadersFilters(), exchange);
|
||||
|
||||
List<String> protocols = headers.get(SEC_WEBSOCKET_PROTOCOL);
|
||||
if (protocols != null) {
|
||||
@@ -85,20 +86,19 @@ public class WebsocketRoutingFilter implements GlobalFilter, Ordered {
|
||||
}
|
||||
|
||||
private List<HttpHeadersFilter> getHeadersFilters() {
|
||||
List<HttpHeadersFilter> filters = this.headersFilters.getIfAvailable();
|
||||
if (filters == null) {
|
||||
filters = new ArrayList<>();
|
||||
if (this.headersFilters == null) {
|
||||
this.headersFilters = this.headersFiltersProvider.getIfAvailable(ArrayList::new);
|
||||
|
||||
headersFilters.add((headers, exchange) -> {
|
||||
HttpHeaders filtered = new HttpHeaders();
|
||||
headers.entrySet().stream()
|
||||
.filter(entry -> !entry.getKey().toLowerCase().startsWith("sec-websocket"))
|
||||
.forEach(header -> filtered.addAll(header.getKey(), header.getValue()));
|
||||
return filtered;
|
||||
});
|
||||
}
|
||||
|
||||
filters.add((headers, exchange) -> {
|
||||
HttpHeaders filtered = new HttpHeaders();
|
||||
headers.entrySet().stream()
|
||||
.filter(entry -> !entry.getKey().toLowerCase().startsWith("sec-websocket"))
|
||||
.forEach(header -> filtered.addAll(header.getKey(), header.getValue()));
|
||||
return filtered;
|
||||
});
|
||||
|
||||
return filters;
|
||||
return this.headersFilters;
|
||||
}
|
||||
|
||||
private void changeSchemeIfIsWebSocketUpgrade(ServerWebExchange exchange) {
|
||||
|
||||
@@ -59,11 +59,21 @@ public class HystrixGatewayFilterFactory extends AbstractGatewayFilterFactory<Hy
|
||||
|
||||
public static final String FALLBACK_URI = "fallbackUri";
|
||||
|
||||
private final ObjectProvider<DispatcherHandler> dispatcherHandler;
|
||||
private final ObjectProvider<DispatcherHandler> dispatcherHandlerProvider;
|
||||
//do not use this dispatcherHandler directly, use getDispatcherHandler() instead.
|
||||
private volatile DispatcherHandler dispatcherHandler;
|
||||
|
||||
public HystrixGatewayFilterFactory(ObjectProvider<DispatcherHandler> dispatcherHandler) {
|
||||
public HystrixGatewayFilterFactory(ObjectProvider<DispatcherHandler> dispatcherHandlerProvider) {
|
||||
super(Config.class);
|
||||
this.dispatcherHandler = dispatcherHandler;
|
||||
this.dispatcherHandlerProvider = dispatcherHandlerProvider;
|
||||
}
|
||||
|
||||
private DispatcherHandler getDispatcherHandler() {
|
||||
if (dispatcherHandler == null) {
|
||||
dispatcherHandler = dispatcherHandlerProvider.getIfAvailable();
|
||||
}
|
||||
|
||||
return dispatcherHandler;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -167,8 +177,7 @@ public class HystrixGatewayFilterFactory extends AbstractGatewayFilterFactory<Hy
|
||||
|
||||
ServerHttpRequest request = this.exchange.getRequest().mutate().uri(requestUrl).build();
|
||||
ServerWebExchange mutated = exchange.mutate().request(request).build();
|
||||
DispatcherHandler dispatcherHandler = HystrixGatewayFilterFactory.this.dispatcherHandler.getIfAvailable();
|
||||
return RxReactiveStreams.toObservable(dispatcherHandler.handle(mutated));
|
||||
return RxReactiveStreams.toObservable(getDispatcherHandler().handle(mutated));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user