k6脚本如何实现VU/HTTP请求/迭代维度的代理轮换
原因说明
k6的全局HTTP代理配置在进程启动阶段就完成初始化加载,运行过程中修改__ENV.HTTP_PROXY不会触发底层HTTP传输层的配置重载,所以脚本内打印环境变量值已变更,但实际请求仍然走启动时传入的初始代理。
可行实现方案
k6原生支持在单个HTTP请求的参数中直接指定代理,不需要依赖全局环境变量,完全可以实现按VU、单请求、单次迭代维度动态切换代理。
方案1:单请求/单迭代粒度动态切换(灵活性最高)
直接在发起http.get/http.post等请求时,传入proxy配置项指定当前请求使用的代理地址,优先级高于全局环境变量配置。
修改测试脚本逻辑如下:
import http from 'k6/http'; import { check } from 'k6'; import { SharedArray } from 'k6/data'; // 读取代理列表(保持原有SharedArray逻辑即可,避免多VU重复占用内存) export const proxies = new SharedArray('proxies', function() { return JSON.parse(open('./proxies.json')); }); // 生成指定范围随机数 function RandomRange(min, max) { return Math.floor((Math.random() * (max - min + 1)) + min); } export default function () { // 单次迭代开始时随机选代理,也可以在每个请求发起前单独选择 const currentProxy = proxies[RandomRange(0, proxies.length - 1)].proxy; console.log(`当前迭代使用代理: ${currentProxy}`); // 请求参数中指定代理,注意要补全协议前缀 const res = http.get('http://some-random-server.com/index.php', { proxy: `http://${currentProxy}` }); check(res, { 'Status is 200': (r) => r.status === 200, 'Resp includes': (r) => r.body.includes('success'), }); }
配置说明:
- 代理地址必须带协议前缀:HTTP代理用
http://,SOCKS5代理用socks5:// - 带账号密码的代理格式和环境变量写法一致:
http://user:pass@代理IP:端口 - 可以自由控制代理选择逻辑:单请求切换就在每个请求传参前选代理,单迭代切换就在迭代开头选一次即可。
方案2:按VU固定绑定代理
如果需要每个虚拟用户全程使用固定代理,不需要每次迭代/请求更换,可以在VU初始化阶段提前分配代理,减少重复计算:
import http from 'k6/http'; import { check } from 'k6'; import { SharedArray } from 'k6/data'; export const proxies = new SharedArray('proxies', function() { return JSON.parse(open('./proxies.json')); }); function RandomRange(min, max) { return Math.floor((Math.random() * (max - min + 1)) + min); } // VU初始化阶段执行一次,给当前VU分配固定代理 const vuProxy = `http://${proxies[RandomRange(0, proxies.length - 1)].proxy}`; console.log(`VU ${__VU} 绑定固定代理: ${vuProxy}`); export default function () { // 当前VU所有请求都传入预先分配的固定代理即可 const res = http.get('http://some-random-server.com/index.php', { proxy: vuProxy }); check(res, { 'Status is 200': (r) => r.status === 200, 'Resp includes': (r) => r.body.includes('success'), }); }
注意事项
- 不要尝试通过运行时修改
__ENV.HTTP_PROXY变更全局代理,该操作不会触发底层配置重载,完全不生效 - 大数量代理列表继续使用
SharedArray存储即可,不会因为多VU复制导致内存占用过高 - 代理选择逻辑可根据需求自定义:顺序轮询、权重随机、地域匹配等规则都可以,只要最终将选中的代理地址传入请求参数的
proxy字段即可生效。
内容的提问来源于stack exchange,提问作者0_o
相关产品推荐
相关产品推荐

