golang高性能API网关框架与中间件插件库lura的使用

Golang高性能API网关框架与中间件插件库Lura的使用

Lura项目框架

Lura Logo

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

1 回复

更多关于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
}

性能优化技巧

  1. 启用连接池:
{
  "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"
        }
      }
    }
  ]
}
  1. 使用缓存:
{
  "extra_config": {
    "github.com/devopsfaith/krakend-httpcache": {
      "type": "inmemory",
      "shared": true,
      "ttl": "300s"
    }
  }
}
  1. 启用压缩:
{
  "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语言的特性则保证了出色的性能表现。

回到顶部