Golang中用于AWS Lambda的最佳框架有哪些

Golang中用于AWS Lambda的最佳框架有哪些 处理REST请求的最佳AWS Lambda框架是什么?

它必须兼具速度和轻量级特性。如果还能支持SSE/WebSockets就更好了。

2 回复

如果你身处Java世界,可以探索原生Java Graal VM Quarkus和Micronaut,它们支持WebSocket以及所有其他Java技术。

更多关于Golang中用于AWS Lambda的最佳框架有哪些的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


对于在AWS Lambda中处理REST请求,以下框架在性能和轻量级方面表现突出:

1. AWS Lambda Go API Proxy 这是最轻量的选择,直接包装net/http,性能接近原生。它通过适配器将API Gateway请求转换为标准的http.Request对象。

示例代码:

package main

import (
    "net/http"
    
    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
    "github.com/awslabs/aws-lambda-go-api-proxy/gorillamux"
    "github.com/gorilla/mux"
)

var router *mux.Router
var adapter *gorillamux.GorillaMuxAdapter

func init() {
    router = mux.NewRouter()
    router.HandleFunc("/users/{id}", getUser).Methods("GET")
    router.HandleFunc("/users", createUser).Methods("POST")
    
    adapter = gorillamux.New(router)
}

func getUser(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    id := vars["id"]
    w.Write([]byte("User ID: " + id))
}

func createUser(w http.ResponseWriter, r *http.Request) {
    w.Write([]byte("User created"))
}

func Handler(req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    return adapter.Proxy(req)
}

func main() {
    lambda.Start(Handler)
}

2. Chi Chi是极简的HTTP路由器,内存占用小,性能优秀,支持中间件和嵌套路由。

示例代码:

package main

import (
    "net/http"
    
    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
    "github.com/awslabs/aws-lambda-go-api-proxy/chi"
    "github.com/go-chi/chi/v5"
    "github.com/go-chi/chi/v5/middleware"
)

var chiAdapter *chiadapter.ChiAdapter

func init() {
    r := chi.NewRouter()
    r.Use(middleware.Logger)
    
    r.Get("/users/{id}", func(w http.ResponseWriter, r *http.Request) {
        id := chi.URLParam(r, "id")
        w.Write([]byte("User ID: " + id))
    })
    
    r.Post("/users", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("User created"))
    })
    
    chiAdapter = chiadapter.New(r)
}

func Handler(req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    return chiAdapter.Proxy(req)
}

func main() {
    lambda.Start(Handler)
}

3. Gin Gin性能极高,但相比前两者稍重。它提供了更丰富的功能集,包括JSON验证、路由分组等。

示例代码:

package main

import (
    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
    "github.com/awslabs/aws-lambda-go-api-proxy/gin"
    "github.com/gin-gonic/gin"
)

var ginLambda *ginadapter.GinLambda

func init() {
    r := gin.Default()
    
    r.GET("/users/:id", func(c *gin.Context) {
        id := c.Param("id")
        c.String(200, "User ID: %s", id)
    })
    
    r.POST("/users", func(c *gin.Context) {
        c.String(200, "User created")
    })
    
    ginLambda = ginadapter.New(r)
}

func Handler(req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    return ginLambda.Proxy(req)
}

func main() {
    lambda.Start(Handler)
}

关于SSE/WebSockets支持: AWS Lambda本身通过API Gateway WebSocket API和HTTP API支持WebSockets。对于SSE,可以使用API Gateway HTTP API直接处理。

WebSockets示例:

package main

import (
    "context"
    
    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
)

func handler(ctx context.Context, request events.APIGatewayWebsocketProxyRequest) (events.APIGatewayProxyResponse, error) {
    switch request.RequestContext.RouteKey {
    case "$connect":
        return events.APIGatewayProxyResponse{StatusCode: 200}, nil
    case "$disconnect":
        return events.APIGatewayProxyResponse{StatusCode: 200}, nil
    case "message":
        // 处理消息
        return events.APIGatewayProxyResponse{
            StatusCode: 200,
            Body:       "Message processed",
        }, nil
    default:
        return events.APIGatewayProxyResponse{StatusCode: 404}, nil
    }
}

func main() {
    lambda.Start(handler)
}

SSE示例:

package main

import (
    "github.com/aws/aws-lambda-go/events"
    "github.com/aws/aws-lambda-go/lambda"
)

func handler(request events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
    return events.APIGatewayProxyResponse{
        StatusCode: 200,
        Headers: map[string]string{
            "Content-Type": "text/event-stream",
            "Cache-Control": "no-cache",
            "Connection": "keep-alive",
        },
        Body: "data: " + "Event data" + "\n\n",
    }, nil
}

func main() {
    lambda.Start(handler)
}

这些框架都能在AWS Lambda环境中提供优秀的性能表现,具体选择取决于项目需求。对于纯REST API,Chi或AWS Lambda Go API Proxy是最轻量的选择;如果需要更多功能,Gin是合适的选项。

回到顶部