Lura v2.14.1 配置参数详解
逐段解析 Lura v2.14.1(KrakenD CE 2.13.11 形态)网关配置文件的服务级字段、endpoints、backend、proxy 负载均衡、QoS 熔断限流、超时与中间件参数,全部参数经实测验证。
Lura v2.14.1 配置参数详解
目标:逐段解析 Lura v2.14.1(KrakenD CE 2.13.11 形态)网关配置的服务级字段、endpoints、backend、负载均衡、熔断限流、JWT 与中间件参数,全部取值经实测验证。已在 Ubuntu 22.04 实测通过。
一、环境信息
- 操作系统:Ubuntu 22.04,root 用户操作
- 网关版本:KrakenD CE 2.13.11(内嵌 Lura v2.14.x 引擎),另覆盖自编译 Lura v2.14.1 网关形态
- 演示上游:Python 脚本模拟的 JSON 服务——8090(产品)、8092/8093(负载均衡)、8096(熔断)、
/slow慢速接口(3 秒返回) - 端口:网关监听 8080 与 8081
- 配置文件路径:KrakenD CE
/etc/krakend/krakend.json,自编译网关由-c参数指定;JWT 密钥/etc/krakend/jwks.json
二、配置文件总体结构
Lura 网关的全部行为由一份 JSON(或 YAML)描述。KrakenD CE 2.13.11(内嵌 Lura v2.14.x 引擎)读 /etc/krakend/krakend.json,自编译 Lura 网关读 -c 参数指定的任意路径。顶层结构分四块:
{
"version": 3,
"name": "...",
"port": 8080,
"...": "服务级字段",
"endpoints": [ "端点列表" ],
"extra_config": { "中间件与扩展" }
}
配置修改后须重启网关才生效(网关只在启动时读一次配置),重启前建议先校验:
root@ubuntu22:~# krakend check -c /etc/krakend/krakend.json
Parsing configuration file: /etc/krakend/krakend.json
Syntax OK!
⚠️ 排障实录:两个高频启动失败实测原文。其一,
cache_ttl必须是字符串:2026/10/17 04:01:29 ERROR:'/tmp/lura-bad.json': json: cannot unmarshal number into Go struct field parseableServiceConfig.cache_ttl of type string, offset: 82, row: 4, col: 17其二,
version只接受 3:2026/10/17 04:01:38 ERROR:'/tmp/lura-bad2.json': unsupported version: 2 (want: 3)Lura v2.x 引擎对应的配置版本号就是 3,不要写成引擎版本 2。
2.1 服务级字段速查(实测验证)
| 字段 | 类型 | 作用 | 实测取值 |
|---|---|---|---|
version | 数字 | 配置格式版本 | 固定 3,写 2 启动失败 |
name | 字符串 | 网关名称,用于日志与统计 | "Lura Demo Gateway" |
port | 数字 | 监听端口 | 8080;-p 参数可覆盖 |
host | 数组 | 公网访问地址(仅用于生成文档/统计展示) | 可省略 |
timeout | 字符串 | 全局默认超时 | "3s" |
cache_ttl | 字符串 | 上游响应默认缓存时间 | "60s",必须是字符串 |
debug | 布尔 | 打开调试端点与 DEBUG 日志 | true/false |
plugin | 对象 | 插件加载器(见第八章) | {"folder": "...", "pattern": ".so"} |
endpoints | 数组 | 端点定义列表 | 见第三章 |
extra_config | 对象 | 中间件与扩展命名空间 | 见第八章 |
三、endpoints:对外端点
3.1 端点级字段
{
"endpoint": "/api/products/{id}",
"method": "GET",
"output_encoding": "json-collection",
"timeout": "1s",
"backend": [ "..." ]
}
| 字段 | 说明 | 实测行为 |
|---|---|---|
endpoint | 对外路径,支持 {id} 占位符与 * 通配尾段 | {id} 实际值会替换进各上游 url_pattern |
method | GET/POST/PUT/DELETE 等 | 实测 GET |
output_encoding | 响应编码:json(默认聚合)、no-op(透传)等 | no-op 端点原样返回上游字节流 |
timeout | 端点级超时,覆盖全局 timeout | 实测 "1s" 生效,见 2.2 |
backend | 上游列表,至少一项 | 多项即聚合 |
3.2 端点级超时实测
上游有一个 3 秒才返回的 /slow 接口,端点设 "timeout": "1s":
root@ubuntu22:~# time curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8080/api/slow
500
real 0m1.006s
user 0m0.004s
sys 0m0.001s
1.006 秒返回 500——超时精确生效,DEBUG 日志中可见 context deadline exceeded。
⚠️ 排障实录:超时不要配在 backend 的
extra_config里(如backend/http段)。实测给 backend 配{"backend/http": {"timeout": "1s"}}完全不生效,请求 3 秒才返回。Lura 的超时层级是服务级timeout与端点级timeout,backend 层没有独立超时字段。
四、backend:上游定义
4.1 字段全表(全部实测)
{
"host": ["http://127.0.0.1:8090"],
"url_pattern": "/products/{id}",
"encoding": "json",
"group": "product",
"mapping": {"name": "product_name"},
"allow": ["in_stock"],
"deny": ["currency"],
"target": "user",
"extra_config": {}
}
| 字段 | 作用 | 实测结果 |
|---|---|---|
host | 上游地址数组,多项即负载均衡(见第五章) | ["http://127.0.0.1:8092", "http://127.0.0.1:8093"] |
url_pattern | 上游路径,可引用端点占位符 {id} | /products/{id} → /products/1 |
encoding | 上游响应解析方式:json(默认)、no-op、string、xml 等 | no-op 用于透传与流式 |
group | 聚合时本路上游响应的名字 | 输出 {"product":{...},"stock":{...}} |
mapping | 键重命名 | name → product_name |
allow | 字段白名单 | 只剩 "in_stock": true |
deny | 字段黑名单 | currency 被剔除 |
target | 只取嵌套 JSON 的某个子对象 | user 层被抽出 |
extra_config | 挂载 backend 级扩展(熔断等) | 见第六章 |
聚合 + 加工的完整实测回显(/api/filtered 端点,第一路 deny 加 mapping,第二路 allow):
root@ubuntu22:~# curl -s http://127.0.0.1:8080/api/filtered
{"id":1,"in_stock":true,"price":9.99,"product_name":"Widget"}
💡 技术拓展:
encoding决定网关如何"读懂"上游。json会解析为对象参与聚合与字段加工;no-op完全透传(不解析、不能聚合);string把响应当字符串塞进结果。经验法则:需要聚合/加工选json,需要网关不碰内容(文件下载、流式)选no-op。
五、proxy:负载均衡与响应合并
5.1 host 多地址 = 自动负载均衡
backend 的 host 写多个地址,网关按策略把请求分摊出去。实测配置两个等价上游(8092、8093 都服务 /lb):
{
"endpoint": "/api/lb",
"method": "GET",
"backend": [
{"host": ["http://127.0.0.1:8092", "http://127.0.0.1:8093"], "url_pattern": "/lb"}
]
}
连打 6 次的实测分发:
root@ubuntu22:~# curl -s http://127.0.0.1:8080/api/lb http://127.0.0.1:8080/api/lb http://127.0.0.1:8080/api/lb http://127.0.0.1:8080/api/lb http://127.0.0.1:8080/api/lb http://127.0.0.1:8080/api/lb
{"served_by":"backend-8092"}{"served_by":"backend-8092"}{"served_by":"backend-8093"}{"served_by":"backend-8092"}{"served_by":"backend-8093"}{"served_by":"backend-8093"}
8092×3、8093×3,但顺序是 2-2-3-2-3-3——非固定轮询,而是随机选择。
💡 技术拓展:Lura 内置的负载均衡策略是 random(随机),即每次请求从健康地址里随机挑一个;没有 round-robin、least-conn 等策略开关。随机在大样本下等效于均匀分流,实现简单且无共享状态,与 Lura 无状态的设计一致。与常见方案对比:
算法 行为 适用 random(Lura 默认) 随机挑一个,无状态 实例能力均等的无状态集群 round-robin 逐个轮转 请求粒度均匀的传统场景 least-connections 挑当前连接最少 长连接、耗时差异大的后端 weighted 按权重分流 灰度发布、异构实例 需要加权/最少连接等策略时,一般在 Lura 前面再放一层具备该能力的负载均衡器(如 Nginx/HAProxy),或改写 proxy 层装配代码。
5.2 多 backend 的合并语义
一个端点多个 backend 时,网关并发请求全部上游,把 JSON 结果合成一个对象:配了 group 用组名做键,未配组名则各上游键平铺合并。聚合中任何一路失败,整个端点按错误处理(实测返回 500)。
六、qos:熔断与限流
Lura 核心仓库只含代理与路由骨架,熔断、限流由 KrakenD CE 发行版装配的 QoS 组件提供(CE 2.13.11 实测以下两节)。它们都通过 extra_config 挂载。
6.1 熔断(qos/circuit-breaker)
backend 级配置:
{
"host": ["http://127.0.0.1:8096"],
"url_pattern": "/products/1",
"extra_config": {
"qos/circuit-breaker": {
"interval": 60,
"timeout": 10,
"max_errors": 2,
"log_status_change": true
}
}
}
| 参数 | 含义 | 实测 |
|---|---|---|
max_errors | 统计窗口内连续失败阈值,达到即熔断 | 设 2 |
interval | 熔断器计数窗口(秒) | 60 |
timeout | 熔断打开后多少秒进入半开试探 | 10 |
log_status_change | 状态迁移写日志 | 开 |
实测序列:后端正常时 200;杀掉后端后连续请求,先看到真实失败(connection refused),继续打到第 3 次起直接被熔断器拒绝(不再发起网络调用),响应时间从毫秒级降到 0.4 毫秒左右:
root@ubuntu22:~# for n in 1 2 3 4 5 6; do curl -s -o /dev/null -w "%{http_code} %{time_total}s\n" http://127.0.0.1:8081/ops/breaker; done
500 0.000513s
500 0.000442s
500 0.000497s
500 0.000414s
500 0.000355s
500 0.000338s
日志里状态机迁移全程可见:
[KRAKEND] 2026/10/17 - 03:59:23.700 ▶ ERROR [ENDPOINT: /ops/breaker] circuit breaker is open
[KRAKEND] 2026/10/17 - 03:59:34.288 ▶ WARNING [CB] Circuit breaker named '' went from 'open' to 'half-open'
[KRAKEND] 2026/10/17 - 03:59:34.289 ▶ WARNING [CB] Circuit breaker named '' went from 'half-open' to 'closed'
[GIN] 2026/10/17 - 03:59:34 | 200 | 832.321µs | 127.0.0.1 | GET "/ops/breaker"
closed(正常)→ 连续 max_errors 次失败 → open(快速失败)→ timeout 秒后 → half-open(放试探请求)→ 成功则 closed。恢复实测:后端拉起后 10 秒窗口到期,第一个试探请求 200,熔断器闭合。
6.2 路由限流(qos/ratelimit/router)
端点级配置(令牌桶):
{
"endpoint": "/ops/limited",
"method": "GET",
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 2,
"capacity": 2
}
}
}
| 参数 | 含义 | 实测 |
|---|---|---|
max_rate | 每秒补充令牌数(稳态速率) | 2 |
capacity | 桶容量(允许的瞬时突发) | 2 |
瞬间连打 8 次的实测(前几个吃掉存量令牌,随后超限):
root@ubuntu22:~# curl -s -o /dev/null -w "%{http_code} " ×8 http://127.0.0.1:8081/ops/limited
200 200 200 200 200 503 503 503
超限请求返回 503(非 429),毫秒级返回:
[GIN] 2026/10/17 - 03:16:18 | 503 | 12.951µs | 127.0.0.1 | GET "/ops/limited"
[GIN] 2026/10/17 - 03:16:18 | 503 | 1.412µs | 127.0.0.1 | GET "/ops/limited"
💡 技术拓展:KrakenD CE 2.x 的限流分三层,键名各不相同——
qos/ratelimit/router(网关对外的端点限流,保护自己)、qos/ratelimit/proxy(网关调上游的租户限流,保护后端)、router/rate(服务级全局 rps 上限)。对 API 提供方,通常两者都配:对外防刷、对内防压垮。
七、auth/jose:JWT 校验
端点级挂载 validator(CE 2.13.11 实测,注意命名空间是完整旧式域名):
{
"endpoint": "/ops/jwt",
"method": "GET",
"extra_config": {
"github.com/devopsfaith/krakend-jose/validator": {
"alg": "HS256",
"jwk_local_path": "/etc/krakend/jwks.json",
"disable_jwk_security": true,
"audience": ["lura-demo"],
"issuer": "lura-issuer"
}
}
}
| 参数 | 说明 | 实测 |
|---|---|---|
alg | 期望签名算法 | HS256(对称密钥) |
jwk_local_path | 本地 JWK 密钥文件(对称密钥以 oct JWK 提供) | base64 编码的密钥 q1w2e3r4 |
disable_jwk_security | 允许本地/非 https 密钥源 | 对称密钥本地文件场景必须为 true |
audience / issuer | 要求 token 中的 aud/iss 匹配 | 数组与字符串 |
本地 JWK 文件 /etc/krakend/jwks.json(k 是密钥 q1w2e3r4 的 base64 编码):
{
"keys": [
{"kty": "oct", "kid": "lura-demo-key", "k": "cTF3MmUzcjQ", "alg": "HS256", "use": "sig"}
]
}
实测三种请求:
root@ubuntu22:~# curl -s -o /dev/null -w "%{http_code}\n" http://127.0.0.1:8081/ops/jwt
401
root@ubuntu22:~# curl -s -o /dev/null -w "%{http_code}\n" -H "Authorization: Bearer wrong.token.here" http://127.0.0.1:8081/ops/jwt
401
root@ubuntu22:~# curl -s -w " | %{http_code}\n" -H "Authorization: Bearer eyJhbGciOiAiSFMyNTYiLCAidHlwIjogIkpXVCIsICJraWQiOiAibHVyYS1kZW1vLWtleSJ9.eyJhdWQiOiBbImx1cmEtZGVtbyJdLCAiaXNzIjogImx1cmEtaXNzdWVyIiwgInN1YiI6ICJ1c2VyMSIsICJleHAiOiAxNzkyMjEzMTgyfQ.NuS0QML5NOWDtxdil2TxLU51PPBs2aoOVpYsUAdM6lQ" http://127.0.0.1:8081/ops/jwt
{"currency":"USD","id":2,"name":"Gadget","price":24.5} | 200
无 token 401、伪造 token 401、合法 token 200。
⚠️ 排障实录:两处容易踩的坑。其一,validator 配置键必须写全
github.com/devopsfaith/krakend-jose/validator,简写auth/jose会被静默忽略,端点变成无校验透传。其二,jwk_url指向http://(非 https)地址或本地路径时,不设"disable_jwk_security": true会在日志报ErrInsecureJWKSource且所有请求 401。其三,JWK 里的kid要与 token header 的kid一致,否则密钥匹配失败。
八、中间件与扩展(extra_config 与顶层键)
8.1 日志 telemetry/logging
{
"extra_config": {
"telemetry/logging": {
"level": "INFO",
"prefix": "[KRAKEND]",
"syslog": false,
"stdout": true
}
}
}
level 取值 DEBUG/INFO/ERROR;stdout: true 输出到标准输出(systemd 场景进 journal,编排场景进日志收集器)。GIN 访问日志格式([GIN] 日期 | 状态码 | 耗时 | 客户端 | 请求行)随 DEBUG 级别输出。
8.2 插件加载
插件机制分两步:顶层 plugin 键负责加载,服务级 extra_config 负责启用:
{
"plugin": {"pattern": ".so", "folder": "/etc/krakend/plugins/"},
"extra_config": {
"github_com/devopsfaith/krakend/transport/http/server/handler": {
"name": ["krakend-server-example"]
}
}
}
加载成功的日志:
[KRAKEND] 2026/10/17 - 03:34:31.156 ▶ INFO [PLUGIN: Server] Injecting plugin krakend-server-example
插件的编译、校验(krakend test-plugin)与运行时细节见《Lura v2.14.1 进阶实战与运维》。
8.3 其他常用命名空间
| 键 | 用途 |
|---|---|
telemetry/goprometheus | 暴露 Prometheus 指标端点 |
router/rate | 服务级全局速率上限 |
modifier/http-client / modifier/http-server | 请求/响应修改器插件挂载 |
qos/circuit-breaker、qos/ratelimit/* | 见第六章 |
九、配置管理建议
- 每次修改先
krakend check再重启,避免语法错误打断服务; - 用版本库管理
krakend.json,改配置如改代码; - 端点数量大时按业务域拆分注释块,或用 YAML 形态(
krakend.yaml)获得注释能力; - 敏感参数(JWT 密钥、上游凭证)用环境变量占位符
{{ env "VAR_NAME" }},配合 systemd 的Environment=注入,避免密钥进配置文件。