golang高性能API网关框架与中间件插件库lura的使用
Golang高性能API网关框架与中间件插件库Lura的使用
Lura项目框架
Lura是一个开源框架,用于组装具有中间件的超高性能API网关;前身为KrakenD框架,是KrakenD API网关的核心服务。
动机
REST API内容的消费者(特别是在微服务中)经常查询不是为UI实现编码的后端服务。这当然是一个好的做法,但UI消费者需要实现复杂的逻辑,并承受微服务响应大小的负担。
Lura是一个API网关构建器和代理生成器,位于客户端和所有源服务器之间,添加了一个新层,移除了客户端的复杂性,仅提供UI所需的信息。Lura充当多个源的聚合器,将它们组合成单个端点,并允许您对响应进行分组、包装、转换和压缩。此外,它还支持大量中间件和插件,允许您扩展功能,例如添加Oauth授权或安全层。
Lura不仅支持HTTP(S),而且因为它是一组通用库,您可以构建所有类型的API网关和代理,例如RPC网关。
实际示例
移动开发人员需要构建一个前端页面,该页面需要从其后端服务进行4次不同的调用,例如:
1) api.store.server/products
2) api.store.server/marketing-promos
3) api.users.server/users/{id_user}
4) api.users.server/shopping-cart/{id_user}
如果移动端可以调用单个端点会怎样?
1) lura.server/frontpage/{id_user}
Lura将合并所有数据并仅返回您需要的字段(图中大小的差异)。
库使用
Lura项目是一个Go库,您可以将其包含在自己的Go应用程序中,以构建强大的代理或API网关。以下是一个完整的示例:
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", 0, "Port of the service")
logLevel := flag.String("l", "ERROR", "Logging level")
debug := flag.Bool("d", false, "Enable the debug")
configFile := flag.String("c", "/etc/lura/configuration.json", "Path to the configuration filename")
flag.Parse()
parser := config.NewParser()
serviceConfig, err := parser.Parse(*configFile)
if err != nil {
log.Fatal("ERROR:", err.Error())
}
serviceConfig.Debug = serviceConfig.Debug || *debug
if *port != 0 {
serviceConfig.Port = *port
}
logger, _ := logging.NewLogger(*logLevel, os.Stdout, "[LURA]")
routerFactory := gin.DefaultFactory(proxy.DefaultFactory(logger), logger)
routerFactory.New().Run(serviceConfig)
}
配置示例
以下是一个简单的Lura配置示例(保存为configuration.json):
{
"version": 2,
"port": 8080,
"endpoints": [
{
"endpoint": "/frontpage/{id_user}",
"method": "GET",
"backend": [
{
"url_pattern": "/products",
"host": ["http://api.store.server"]
},
{
"url_pattern": "/marketing-promos",
"host": ["http://api.store.server"]
},
{
"url_pattern": "/users/{id_user}",
"host": ["http://api.users.server"]
},
{
"url_pattern": "/shopping-cart/{id_user}",
"host": ["http://api.users.server"]
}
]
}
]
}
中间件使用示例
Lura支持通过中间件扩展功能。以下是一个添加日志中间件的示例:
package main
import (
"github.com/luraproject/lura/config"
"github.com/luraproject/lura/logging"
"github.com/luraproject/lura/proxy"
"github.com/luraproject/lura/router/gin"
"github.com/luraproject/lura/middleware"
)
func main() {
// ... 初始化代码同上 ...
logger, _ := logging.NewLogger(*logLevel, os.Stdout, "[LURA]")
// 创建代理工厂并添加日志中间件
proxyFactory := proxy.NewDefaultFactory(proxy.DefaultBackendFactory(logger), logger)
proxyFactory = middleware.NewProxyLogger("myProxy", proxyFactory)
routerFactory := gin.DefaultFactory(proxyFactory, logger)
routerFactory.New().Run(serviceConfig)
}
插件使用示例
Lura支持通过插件扩展功能。以下是一个简单的插件注册示例:
package main
import (
"github.com/luraproject/lura/config"
"github.com/luraproject/lura/logging"
"github.com/luraproject/lura/proxy"
"github.com/luraproject/lura/router/gin"
"github.com/luraproject/lura/register"
)
// 自定义请求修改器插件
type myRequestModifier struct{}
func (m *myRequestModifier) ModifyRequest(req *proxy.Request) {
req.Headers["X-My-Header"] = []string{"my-value"}
}
func init() {
// 注册请求修改器插件
register.SetRequestModifier("my-modifier", func(_ config.ExtraConfig) proxy.RequestModifier {
return &myRequestModifier{}
})
}
func main() {
// ... 初始化代码同上 ...
// 在配置中使用自定义插件
// 需要在configuration.json中添加相应的配置
}
性能考虑
Lura设计为高性能API网关框架,具有以下特点:
- 低内存占用
- 高吞吐量
- 最小延迟
- 水平可扩展
总结
Lura是一个功能强大且灵活的Go库,用于构建高性能API网关。它提供了丰富的功能,包括:
- 请求聚合
- 响应转换
- 中间件支持
- 插件系统
- 高性能代理
通过合理配置和使用,Lura可以显著简化客户端与多个后端服务之间的交互,提高整体系统性能。
更多关于golang高性能API网关框架与中间件插件库lura的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang高性能API网关框架与中间件插件库lura的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang高性能API网关框架与中间件插件库Lura使用指南
Lura简介
Lura是一个用Go编写的高性能API网关框架,由Krakend团队开发。它具有以下特点:
- 轻量级且高性能
- 支持中间件插件机制
- 易于扩展和定制
- 支持多种协议和数据格式
- 内置负载均衡和缓存功能
安装Lura
go get -u github.com/luraproject/lura/v2
基本配置示例
创建一个简单的Lura网关配置文件config.json
:
{
"version": 2,
"name": "my-gateway",
"port": 8080,
"endpoints": [
{
"endpoint": "/users/{id}",
"method": "GET",
"backend": [
{
"url_pattern": "/users/{id}",
"method": "GET",
"host": ["http://user-service"]
}
]
}
]
}
启动Lura网关
package main
import (
"context"
"flag"
"log"
"github.com/luraproject/lura/v2/config"
"github.com/luraproject/lura/v2/logging"
"github.com/luraproject/lura/v2/proxy"
"github.com/luraproject/lura/v2/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 the debug")
configFile := flag.String("c", "config.json", "Path to the configuration filename")
flag.Parse()
parser := config.NewParser()
serviceConfig, err := parser.Parse(*configFile)
if err != nil {
log.Fatal("ERROR:", err.Error())
}
serviceConfig.Debug = serviceConfig.Debug || *debug
if *port != 0 {
serviceConfig.Port = *port
}
logger, _ := logging.NewLogger(*logLevel, os.Stdout, "[LURA]")
routerFactory := gin.DefaultFactory(proxy.DefaultFactory(logger), logger)
routerFactory.New().Run(serviceConfig)
}
中间件开发
Lura支持自定义中间件,下面是一个简单的认证中间件示例:
package auth
import (
"context"
"net/http"
"github.com/luraproject/lura/v2/proxy"
)
// NewMiddleware 创建认证中间件
func NewMiddleware(cfg *Config) proxy.Middleware {
return func(next ...proxy.Proxy) proxy.Proxy {
if len(next) > 1 {
panic("too many proxies for this proxy middleware")
}
return func(ctx context.Context, req *proxy.Request) (*proxy.Response, error) {
token := req.Headers["Authorization"][0]
if !isValidToken(token) {
return &proxy.Response{
IsComplete: true,
Metadata: proxy.Metadata{
StatusCode: http.StatusUnauthorized,
},
}, nil
}
return next[0](ctx, req)
}
}
}
func isValidToken(token string) bool {
// 实现你的认证逻辑
return token == "valid-token"
}
插件系统使用
Lura支持通过插件扩展功能,首先需要安装插件支持:
go get -u github.com/luraproject/lura/v2/plugin
然后可以注册自定义插件:
package main
import (
"github.com/luraproject/lura/v2/plugin"
"github.com/luraproject/lura/v2/proxy"
)
func init() {
plugin.Register(
"auth-plugin",
plugin.ClientPlugin,
authPluginLoader,
authPluginChecker,
)
}
func authPluginLoader(name string, cfg map[string]interface{}) (proxy.Middleware, error) {
// 从cfg中解析配置并返回中间件
return auth.NewMiddleware(cfg), nil
}
func authPluginChecker(name string, cfg map[string]interface{}) error {
// 验证配置是否有效
return nil
}
性能优化技巧
- 启用连接池:
{
"backend": [
{
"url_pattern": "/users",
"host": ["http://user-service"],
"disable_host_sanitize": false,
"extra_config": {
"github.com/devopsfaith/krakend-httpclient": {
"connection_timeout": "2000ms",
"max_idle_connections": 100,
"idle_connection_timeout": "90s"
}
}
}
]
}
- 使用缓存:
{
"extra_config": {
"github.com/devopsfaith/krakend-httpcache": {
"type": "inmemory",
"shared": true,
"ttl": "300s"
}
}
}
- 启用压缩:
{
"extra_config": {
"github.com/devopsfaith/krakend-gzip": {
"min_length": 1024
}
}
}
高级特性
负载均衡
{
"backend": [
{
"url_pattern": "/users",
"host": [
"http://user-service-1",
"http://user-service-2",
"http://user-service-3"
],
"extra_config": {
"github.com/devopsfaith/krakend-lb": {
"strategy": "round_robin"
}
}
}
]
}
请求聚合
{
"endpoint": "/user-details/{id}",
"method": "GET",
"backend": [
{
"url_pattern": "/users/{id}",
"host": ["http://user-service"]
},
{
"url_pattern": "/orders/{id}",
"host": ["http://order-service"],
"group": "orders"
}
]
}
监控与日志
import (
"github.com/luraproject/lura/v2/logging"
"github.com/luraproject/lura/v2/transport/http/client"
)
func main() {
logger, _ := logging.NewLogger("DEBUG", os.Stdout, "[LURA]")
// 注册HTTP客户端监控
client.RegisterHTTPClient("monitored", client.NewHTTPClientWithMetrics)
// 在配置中使用监控客户端
serviceConfig.ExtraConfig = map[string]interface{}{
"github.com/devopsfaith/krakend-metrics": map[string]interface{}{
"collection_time": "60s",
"proxy_disabled": false,
"router_disabled": false,
"backend_disabled": false,
},
}
}
总结
Lura是一个功能强大且高度可扩展的API网关框架,特别适合构建高性能的微服务架构。通过其灵活的中间件和插件系统,开发者可以轻松实现认证、限流、监控等各种功能。其配置驱动的设计使得部署和维护变得简单,而Go语言的特性则保证了出色的性能表现。