JMeter负载测试中Token过期与重新生成问题的解决方案咨询
长时负载测试下Bearer Token自动刷新复用解决方案
核心思路是抛弃单次生成全局复用的逻辑,改为过期前自动刷新+全局共享的机制,兼容长时间负载测试场景。以下为具体实现方案(以你使用的JMeter工具为例):
方案1:全局属性共享+预刷新机制(推荐,无文件IO损耗)
- 新增1个单线程运行的独立刷新线程组,设置为和业务线程组同时启动、永久循环
- 刷新线程组内按顺序执行以下逻辑:
- 调用
LoginAPI获取新的Bearer Token - 调用JMeter内置函数
${__setProperty(global_bearer_token, ${接口返回的token变量名},)}将token存入全局属性,所有线程均可读取 - 添加固定定时器,设置休眠时长为29分钟(比30分钟的有效期短1分钟,确保token过期前完成刷新)
- 调用
- 业务线程组(调用API-1/2/3的线程组)的请求头中直接读取全局属性即可,请求头配置示例:
Authorization: Bearer ${__getProperty(global_bearer_token,)} - 新增兜底校验逻辑:在业务请求的后置处理器中判断返回码,如果返回401身份验证错误,立刻触发一次
LoginAPI调用更新全局token,并重发当前失败请求,避免偶发刷新延迟导致的请求失败
方案2:文件读写兼容方案(适配你现有逻辑)
- 删掉原有SetupThreadGroup的单次生成逻辑,改为独立的单线程刷新线程,每29分钟调用一次
LoginAPI - 拿到新token后用原子写入的方式覆盖原有token文件,避免业务线程读文件时读到半写入的无效内容
- 业务线程每次读取token前先判断文件最后修改时间,如果距离当前时间超过29分钟,先等待3秒再读取,确保刷新线程已经完成新token写入
注意:如果是多节点分布式负载测试,可将token存入所有节点可访问的公共缓存(如Redis),仅由单节点负责刷新,所有节点从缓存读取即可,避免多节点重复调用登录接口。
内容的提问来源于stack exchange,提问作者Kumar
相关产品推荐
相关产品推荐

