Lura(原名 KrakenD Framework)是一个 超高性能的 API 网关框架,由 Go 语言编写,核心目标是:聚合多个后端服务、裁剪响应数据、添加中间件(如认证、限流、日志等),并以单一、轻量、快速的接口暴露给前端或客户端。
注意:
- Lura 是底层框架(library),用于构建自定义网关。
- KrakenD CE(Community Edition) 是基于 Lura 构建的 开箱即用的二进制网关程序。
如果你只是想“用”一个 API 网关,推荐直接使用 KrakenD;如果你要深度定制(如嵌入到自己的 Go 应用中),才需要直接使用 Lura。
一、Lura 的核心能力
- 请求聚合:1 个前端请求 → 并行调用 N 个后端服务
- 响应裁剪:只返回前端需要的字段(减少带宽 & 解析开销)
- 中间件支持:JWT 验证、速率限制、CORS、日志、指标(Prometheus)、OpenTelemetry 等
- 协议灵活:HTTP(S)、gRPC(通过插件)、WebSocket(有限支持)
- 超高性能:基于 Go,单核可处理数千 QPS(官方基准测试 >10k RPS)
二、快速入门:使用 Lura 构建自定义网关
步骤 1:创建 Go 项目
mkdir my-lura-gateway && cd my-lura-gateway
go mod init my-lura-gateway
步骤 2:安装 Lura 依赖
go get github.com/luraproject/lura/config
go get github.com/luraproject/lura/proxy
go get github.com/luraproject/lura/router/gin
go get github.com/luraproject/lura/logging
步骤 3:编写主程序 main.go
package main
import (
"flag"
"log"
"os"
"github.com/luraproject/lura/config"
"github.com/luraproject/lura/logging"
"github.com/luraproject/lura/proxy"
"github.com/luraproject/lura/router/gin"
)
func main() {
// 命令行参数
port := flag.Int("p", 8080, "Port of the service")
logLevel := flag.String("l", "ERROR", "Logging level")
debug := flag.Bool("d", false, "Enable debug mode")
configFile := flag.String("c", "krakend.json", "Path to config file")
flag.Parse()
// 加载配置
parser := config.NewParser()
serviceConfig, err := parser.Parse(*configFile)
if err != nil {
log.Fatal("ERROR loading config:", err)
}
serviceConfig.Debug = *debug
if *port != 0 {
serviceConfig.Port = *port
}
// 初始化日志
logger, _ := logging.NewLogger(*logLevel, os.Stdout, "[LURA]")
// 创建 Gin 路由器(基于 Lura 的 proxy 和 logger)
routerFactory := gin.DefaultFactory(proxy.DefaultFactory(logger), logger)
routerFactory.New().Run(serviceConfig)
}
步骤 4:创建配置文件 krakend.json
这是一个典型的 聚合 + 裁剪 示例:
{
"version": 3,
"port": 8080,
"endpoints": [
{
"endpoint": "/frontpage/{user_id}",
"method": "GET",
"backend": [
{
"url_pattern": "/products",
"host": ["http://api.store.server:8000"],
"target": "products"
},
{
"url_pattern": "/marketing-promos",
"host": ["http://api.store.server:8000"],
"target": "promos"
},
{
"url_pattern": "/users/{user_id}",
"host": ["http://api.users.server:8001"],
"target": "user"
},
{
"url_pattern": "/shopping-cart/{user_id}",
"host": ["http://api.users.server:8001"],
"target": "cart"
}
],
"output_encoding": "json"
}
]
}
效果:
请求GET /frontpage/123→ 并行调用 4 个后端 → 合并响应为:{ "products": [...], "promos": [...], "user": {...}, "cart": {...} }
步骤 5:运行你的网关
go run main.go -c krakend.json -p 8080 -l DEBUG
现在访问 http://localhost:8080/frontpage/123 即可看到聚合结果!
三、高级功能配置(在 JSON 中启用)
1. 响应裁剪(仅保留所需字段)
{
"backend": [{
"url_pattern": "/users/{user_id}",
"host": ["http://api.users.server:8001"],
"target": "user",
"allow": ["name", "email"] // 只保留 name 和 email
}]
}
2. 添加 JWT 认证中间件
需先启用插件或使用内置组件(Lura 支持通过 extra_config 集成):
{
"endpoint": "/secure",
"extra_config": {
"auth/validator": {
"alg": "HS256",
"jwk_url": "http://my-auth-server/.well-known/jwks.json"
}
}
}
注意:部分中间件需额外导入包或使用 KrakenD 官方插件。
3. 速率限制(Rate Limiting)
{
"extra_config": {
"qos/ratelimit/router": {
"max_rate": 100,
"capacity": 100
}
}
}
4. 日志与指标
- 日志:通过
logging包输出到 stdout/file - 指标:集成 Prometheus(需添加中间件)
四、Lura vs KrakenD CE
| 特性 | Lura(框架) | KrakenD CE(二进制) |
|---|---|---|
| 使用方式 | 需写 Go 代码编译 | 直接下载二进制 + JSON 配置 |
| 定制能力 | 极高(可修改路由、代理逻辑) | 通过插件扩展(Go/Python/Lua) |
| 上手难度 | 高(需 Go 开发经验) | 低(只需写 JSON) |
| 适用场景 | 嵌入自有系统、特殊需求 | 标准 API 网关部署 |
建议:
- 90% 用户应使用 KrakenD CE(官网下载)
- 仅当你需要 将网关逻辑嵌入现有 Go 服务 或 深度修改 Lura 行为 时,才直接使用 Lura
五、生产部署建议
- 配置管理:将
krakend.json存入 Git,配合 CI/CD 更新 - 健康检查:Lura 自动提供
/__health端点 - 监控:集成 Prometheus + Grafana(使用
telemetry/metrics插件) - 安全:启用 TLS、CORS、IP 白名单
- 性能调优:调整
timeout,max_idle_conns,keepalive等
📚 官方资源
- GitHub: https://github.com/luraproject/lura
- 官方网站: https://www.luraproject.org/
- 文档(含配置详解): https://www.krakend.io/docs/ (KrakenD 文档完全适用于 Lura 配置)
- 示例配置库: https://github.com/krakend/krakend-examples
总结
- Lura 是一个 Go 库,用于构建高性能、可定制的 API 网关。
- 你需要 编写少量 Go 代码 + JSON 配置 来定义路由和聚合逻辑。
- 对于大多数用户,直接使用 KrakenD CE 更简单高效。
- 若你已有 Go 服务并希望内嵌网关能力,Lura 是理想选择。