答案
Whistle 提供了强大的 Values 功能,可以存储和管理各种配置数据,在规则中灵活使用。
Values 基础
1. 什么是 Values
Values 是 whistle 提供的一种数据存储机制,可以存储:
- 配置数据
- 模拟数据
- 常量值
- 环境变量
2. Values 文件格式
Values 文件支持多种格式:
- JSON 格式:
values.json - Properties 格式:
values.properties - INI 格式:
values.ini - YAML 格式:
values.yaml
创建和使用 Values
1. 创建 JSON 格式的 Values
创建文件:values.json
json{ "local-host": "127.0.0.1", "local-port": "3000", "test-host": "test.example.com", "test-port": "8080", "api-base": "https://api.example.com", "timeout": "5000", "retry-count": "3" }
在规则中使用:
shellwww.example.com host {{local-host}}:{{local-port}} api.example.com forward {{api-base}}
2. 创建 Properties 格式的 Values
创建文件:values.properties
shelllocal.host=127.0.0.1 local.port=3000 test.host=test.example.com test.port=8080 api.base=https://api.example.com timeout=5000 retry.count=3
在规则中使用:
shellwww.example.com host {{local.host}}:{{local.port}} api.example.com forward {{api.base}}
3. 创建 INI 格式的 Values
创建文件:values.ini
ini[local] host=127.0.0.1 port=3000 [test] host=test.example.com port=8080 [api] base=https://api.example.com timeout=5000 retry=3
在规则中使用:
shellwww.example.com host {{local.host}}:{{local.port}} api.example.com forward {{api.base}}
Values 高级用法
1. 嵌套对象
创建嵌套的 Values:
json{ "servers": { "local": { "host": "127.0.0.1", "port": "3000" }, "test": { "host": "test.example.com", "port": "8080" } }, "api": { "base": "https://api.example.com", "version": "v1" } }
在规则中使用:
shellwww.example.com host {{servers.local.host}}:{{servers.local.port}} api.example.com forward {{api.base}}/{{api.version}}
2. 数组数据
创建包含数组的 Values:
json{ "allowed-origins": [ "https://www.example.com", "https://test.example.com", "https://localhost:3000" ], "api-endpoints": [ "/api/user", "/api/list", "/api/detail" ] }
在规则中使用:
shell# 使用数组的第一个元素 www.example.com resHeaders://{cors-{{allowed-origins.0}}.json}
3. 环境变量
创建环境变量 Values:
json{ "env": "development", "api-url": "https://dev-api.example.com", "debug": true }
在规则中使用:
shell# 根据环境变量配置 www.example.com forward {{api-url}} www.example.com reqHeaders://{debug-{{debug}}.json}
Values 在脚本中的使用
1. 在 reqScript 中使用
创建脚本:use-values.js
javascriptconst values = require('./values.json'); module.exports = function(req, res) { // 使用 Values 中的数据 const timeout = values.timeout || 5000; const retryCount = values['retry-count'] || 3; req.headers['X-Timeout'] = timeout; req.headers['X-Retry-Count'] = retryCount; };
配置规则:
shellwww.example.com reqScript://{use-values.js}
2. 在 resScript 中使用
创建脚本:use-values-res.js
javascriptconst values = require('./values.json'); module.exports = function(req, res) { const originalEnd = res.end; res.end = function(chunk, encoding) { if (chunk) { const body = chunk.toString(); const jsonData = JSON.parse(body); // 使用 Values 中的数据 jsonData.apiVersion = values.api.version; jsonData.environment = values.env; originalEnd.call(res, JSON.stringify(jsonData), encoding); } else { originalEnd.call(res, chunk, encoding); } }; };
配置规则:
shellwww.example.com resScript://{use-values-res.js}
3. 在插件中使用
创建插件:values-plugin.js
javascriptconst fs = require('fs'); const path = require('path'); module.exports = function(server, options) { // 读取 Values 文件 const valuesPath = path.join(__dirname, 'values.json'); const values = JSON.parse(fs.readFileSync(valuesPath, 'utf8')); server.on('request', function(req, res) { // 使用 Values 中的数据 req.values = values; // 根据环境变量处理请求 if (values.env === 'development') { req.headers['X-Debug'] = 'true'; } }); };
Values 管理技巧
1. 多环境 Values
创建不同环境的 Values 文件:
values-dev.json:
json{ "env": "development", "api-url": "https://dev-api.example.com", "debug": true }
values-test.json:
json{ "env": "testing", "api-url": "https://test-api.example.com", "debug": true }
values-prod.json:
json{ "env": "production", "api-url": "https://api.example.com", "debug": false }
切换环境:
bash# 使用开发环境 cp values-dev.json values.json # 使用测试环境 cp values-test.json values.json # 使用生产环境 cp values-prod.json values.json
2. Values 文件组织
按功能模块组织:
api-values.json:
json{ "api-base": "https://api.example.com", "api-version": "v1", "timeout": "5000" }
cors-values.json:
json{ "allowed-origins": [ "https://www.example.com", "https://test.example.com" ], "allowed-methods": [ "GET", "POST", "PUT", "DELETE" ] }
在规则中使用:
shellapi.example.com forward {{api-values.api-base}}/{{api-values.api-version}} www.example.com resHeaders://{cors-values.json}
3. Values 版本控制
使用 Git 管理 Values 文件:
bash# 初始化 Git 仓库 git init # 添加 Values 文件 git add values.json # 提交 git commit -m "Add values configuration" # 推送到远程仓库 git push origin main
Values 最佳实践
1. 命名规范
- 使用小写字母和连字符:
local-host - 使用有意义的名称:
api-base-url - 避免使用特殊字符
2. 数据类型
- 字符串:用引号包裹
- 数字:直接使用
- 布尔值:使用
true或false - 数组:使用方括号
- 对象:使用花括号
3. 注释说明
在 Values 文件中添加注释:
json{ "local-host": "127.0.0.1", "local-port": "3000", "api-base": "https://api.example.com", "timeout": "5000" }
创建配套的 README 文件:
markdown# Values 配置说明 ## 配置项说明 - `local-host`: 本地服务器地址 - `local-port`: 本地服务器端口 - `api-base`: API 基础地址 - `timeout`: 请求超时时间(毫秒) ## 使用方法 在 whistle 规则中使用 `{{key}}` 引用配置项。
4. 安全考虑
- 不要在 Values 中存储敏感信息
- 使用环境变量管理敏感数据
- 定期更新 Values 文件
Values 实战示例
1. 动态配置代理
创建 Values:
json{ "proxy": { "enabled": true, "host": "127.0.0.1", "port": "8080" } }
配置规则:
shell{{#if proxy.enabled}} www.example.com host {{proxy.host}}:{{proxy.port}} {{/if}}
2. 多域名配置
创建 Values:
json{ "domains": { "www": "www.example.com", "api": "api.example.com", "static": "static.example.com" }, "servers": { "local": "127.0.0.1:3000", "test": "test.example.com:8080" } }
配置规则:
shell{{domains.www}} host {{servers.local}} {{domains.api}} forward https://{{servers.test}} {{domains.static}} host {{servers.local}}
3. 条件配置
创建 Values:
json{ "features": { "new-feature": true, "beta-feature": false } }
配置规则:
shell{{#if features.new-feature}} www.example.com/new-feature resBody://{new-feature.json} {{/if}} {{#if features.beta-feature}} www.example.com/beta resBody://{beta-feature.json} {{/if}}