笔记 20240604
记一次 Spring Cloud Gateway 的 Filter 重复执行两次的问题
背景:公司开放平台使用 Spring Cloud Gateway 搭建了的开放网关,统一所有开放资源接口路由。今天突然有客户反馈接口请求报错,错误信息是 nonce 参数重复导致的验签不通过,但客户确认使用的 uuid 最为 nonce 参数所以几乎不可能重复。
排查过程:
根据异常定位代码位置,得出是 nonce 参数重复导致的验签不通过。nonce 的作用类似于 requestId 避免重复的请求,代码中 nonce 使用 redis 缓存一小时
使用客户提供的参数在生产稳定复现问题
在测试环境 debug 发现验签的 GatewayFilter(MroGatewayFilter)重复执行了两次,导致一次请求的 nonce 重复校验两次自然不通过
经过半天的排查和 debug 最终发现问题,是由于代码中有个修改 Response 的 GlobalFilter(GatewayModifyResponseGatewayFilter)存在 Bug,在重写 ResponseBody 时又去调用了 chain.filter(exchange)。这样就会导致重复执行 Filter
代码如下
GatewayFilter(MroGatewayFilter)
GlobalFilter(GatewayModifyResponseGatewayFilter)存在 Bug
修复后的 GatewayModifyResponseGatewayFilter
总结
此次问题的出现是由于修改代码后未进行回归测试导致的线上 bug,好在影响范围较小。后续修改历史代码还需要思考再三考虑影响范围并做好回归测试。
关于过滤器重复执行的问题应当首先怀疑调用链路执行问题,检查代码是否在过滤器中的重复调用下一个过滤器。
GatewayFilter 和 GlobalFilter 是 SpringCloudGateway 的两种过滤器,局部过滤器和全局过滤器。
版权声明: 本文为 InfoQ 作者【Geek_d01095】的原创文章。
原文链接:【http://xie.infoq.cn/article/ce018f34331b1e8b1bd5354e6】。文章转载请联系作者。
评论