WebClient的ExchangeFilterFunction的doOnNext为何按逆序调用
问题原因说明
这个现象是Reactive过滤器链的正常执行逻辑,和Spring issue#20216修复的内容并不冲突,你混淆了过滤器请求阶段执行顺序和响应回调执行顺序两个完全独立的逻辑:
- issue#20216修复的是过滤器请求处理阶段的执行顺序,修复后过滤器会严格按照添加顺序执行请求侧的逻辑,你看到的
Filter1 invoked先于Filter2 invoked输出,就是修复后的正确表现,完全符合预期。 - 而
doOnNext是挂载在响应流上的回调,属于响应阶段的处理逻辑,天然就是逆序执行的,这是Reactive责任链的固有设计,不属于异常问题。
执行流程拆解
你可以把WebClient的过滤器链理解成嵌套的洋葱结构,整个调用流程如下:
- 请求发起后首先进入先添加的filter1,输出
Filter1 invoked,之后filter1调用exchangeFunction.exchange将请求传递给下一个节点 - 请求进入后添加的filter2,输出
Filter2 invoked,之后filter2调用exchangeFunction.exchange将请求传递给实际的后端调用节点 - 后端返回响应后,响应流会先触发离它最近的回调,也就是filter2挂载的
doOnNext,输出doOnNext for filter2 - 响应继续向上游传递,触发filter1挂载的
doOnNext,输出doOnNext for filter1 - 最终响应回到业务调用层,输出接口返回的消息内容
如果业务需要让响应回调也按过滤器的添加顺序执行,只要调整过滤器的添加顺序即可,不需要修改其他逻辑。
内容的提问来源于stack exchange,提问作者Hexy
相关产品推荐
相关产品推荐

