gpt4 book ai didi

spring-cloud-gateway - 使用 Spring Cloud Gateway 返回 GZipped 响应卡住了

转载 作者:行者123 更新时间:2023-12-04 15:49:22 24 4
gpt4 key购买 nike

我正在使用 Spring Cloud Gateway 将请求转发到后端服务。由于我们的一些后端服务以 gzip 格式发送结果,因此定义一个全局过滤器以在处理路由之前解压缩并在将其发送给客户端之前再次 gzip 似乎是个好主意。这样就不需要为每条路线都这样做。使用 Stack Overflow 上的各种想法导致了以下定义,以 gzip 处理步骤的结果。

@Component
public class GlobalGZipFilter implements GlobalFilter, Ordered {

private static final Logger log = LoggerFactory.getLogger(GlobalGZipFilter.class);

@Override
public int getOrder() {
return -2;
}



@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {

ServerHttpResponse originalResponse = exchange.getResponse();

DataBufferFactory bufferFactory = originalResponse.bufferFactory();
ServerHttpResponseDecorator decoratedResponse = new ServerHttpResponseDecorator(originalResponse) {

@Override
public Mono<Void> writeWith(Publisher<? extends DataBuffer> body) {
log.info("Content should be GZipped: {}", isGZipped(originalResponse));
if (isGZipped(originalResponse) && body instanceof Flux) {
Flux<? extends DataBuffer> flux = (Flux<? extends DataBuffer>) body;

return super.writeWith(flux.buffer().map(dataBuffers -> {
ByteOutputStream outputStream = new ByteOutputStream();
for (DataBuffer i : dataBuffers) {
byte[] array = new byte[i.readableByteCount()];
i.read(array);
outputStream.write(array);
}

String resultResponse = new String(outputStream.getBytes());

return bufferFactory.wrap(zipString(resultResponse));
}));
}

return super.writeWith(body); // if body is not a flux. never got there.
}
};

return chain
.filter(exchange
.mutate()
.response(decoratedResponse)
.build()); // replace response with decorator
}

流程是收集包含结果的缓冲区,将其转换为一个完整的 byte[] 并使用 gzip 压缩此 byte[]

结果似乎得到了正确处理,但只有在应用程序停止后,结果才会显示在客户端中。交易以某种方式在关闭之前没有结束。是否需要确认结果或当前选择的流程不正确?

最佳答案

问题不在于流量或数据的处理。我忘记考虑的是,在对要返回的内容进行gzip压缩时,回复的长度会有所不同。在 gzipped 内容的基础上添加内容长度就可以了:

  String resultResponse = new String(outputStream.getBytes());
byte[] zippedResponse = zipString(resultResponse);

originalResponse.getHeaders().setContentLength(zippedResponse.length);

return bufferFactory.wrap(zippedResponse);

关于spring-cloud-gateway - 使用 Spring Cloud Gateway 返回 GZipped 响应卡住了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54538204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com