缓存body过滤器问题

来源:7-14 验证网关微服务功能可用性

慕先生1519990

2021-11-20

老师你好:
请问在GlobalCacheRequestBodyFilter我这个webflux的相关代码都是直接复制的老师,然后我debug运行

    // DataBufferUtils.join 拿到请求中的数据 --> DataBuffer
    return DataBufferUtils.join(exchange.getRequest().getBody()).flatMap(dataBuffer -> {

        // 确保数据缓冲区不被释放, 必须要 DataBufferUtils.retain
        DataBufferUtils.retain(dataBuffer);
        // defer、just 都是去创建数据源, 得到当前数据的副本
        Flux<DataBuffer> cachedFlux = Flux.defer(() ->
                Flux.just(dataBuffer.slice(0, dataBuffer.readableByteCount())));
        // 重新包装 ServerHttpRequest, 重写 getBody 方法, 能够返回请求数据
        ServerHttpRequest mutatedRequest =
                new ServerHttpRequestDecorator(exchange.getRequest()) {
                    @Override
                    public Flux<DataBuffer> getBody() {
                        return cachedFlux;
                    }
                };
        // 将包装之后的 ServerHttpRequest 向下继续传递
        return chain.filter(exchange.mutate().request(mutatedRequest).build());
    });

在这里打断点,但是进去就跳到了FilteringWebHandler,不能进入下一个过滤器

        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
            return this.delegate.filter(exchange, chain);
        }
        

写回答

1回答

张勤一

2021-11-22

同学你好:

    断点调试的话,需要你自己去研究下了,这没办法去描述怎么做。

0
0

Spring Cloud / Alibaba 微服务架构实战

从架构设计到开发实践,手把手实现

1218 学习 · 674 问题

查看课程