在GO中掌握中间件:提示,技巧和现实用例
#go #middleware

作为来自Java背景的开发人员,我开始使用Go时想到的第一件事是,是否有与我已经习惯的过滤器相似的概念。 幸运的是,GO具有自己的方式 处理中间件,它是一个强大的功能,可以帮助您编写更好,更可维护的代码。

中间件是GO 中的一个强大概念,可让您拦截和修改HTTP请求和响应。这是在不修改核心应用程序逻辑的情况下向HTTP服务器添加功能的一种方法。中间件本质上是一系列功能链,可以在主请求处理程序之前和之后执行。它可以执行诸如身份验证,日志记录,请求验证,响应压缩等任务。

在本文中,我们将探索GO中的中间件的基础知识,并深入研究一些现实世界中的用例。

让我们首先理解为什么我们要在Go中使用中间件?

我们应该在GO中使用中间件,因为它提供了一种模块化且可扩展的方法,可以在我们的Web应用程序中添加功能。中间件位于传入的HTTP请求和应用程序的最终响应之间,使我们能够添加诸如身份验证,请求记录和错误处理之类的功能。通过使用中间件,我们可以保持应用程序的核心逻辑清洁和专注,并减少代码重复。

如果我们不使用中间件?

,什么原理会破裂

如果我们不使用中间件,我们可能会违反单一责任原则。该原则指出,模块,类或功能只有一个理由更改。如果我们不使用中间件,我们可能会想添加诸如身份验证或请求直接登录的功能。这可能会导致难以更改的肿,难以维护的代码。

哪些场景中间件非常有用?

中间件在我们需要在传入的HTTP请求(例如身份验证,授权,请求验证和日志记录)上执行常见任务的方案非常有帮助。中间件允许我们在应用程序中始终如一地应用这些任务,减少代码重复并使维护和修改代码更容易。

我们在代码中必须拥有什么中间件?

我们在代码中需要的中间件取决于应用程序的特定要求。但是,Web应用程序中通常使用了几种中间件功能,包括:

身份验证中间件:此中间件检查用户是否已进行身份验证并授权访问请求的资源。
记录中间件:此中间件记录有关传入请求的信息,包括请求方法,URL,标头和响应状态。
错误处理中间件:此中间件捕获在请求处理过程中发生的错误并返回对客户端的适当错误响应。
请求验证中间件:此中间件验证传入请求,以确保它们符合某些条件,例如HTTP方法,标题,查询参数和请求身体内容。
缓存中间件:此中间件缓存对某些请求的响应以提高性能和减少服务器负载。
请求跟踪:此中间件用于通过Web应用程序跟踪请求的路径。它捕获有关请求的相关信息并将其记录为监视和调试目的。
接下来您可能会想到的问题是:

如何将中间件合并到GO中?

GO具有一个内置的NET/HTTP软件包,可提供基本的HTTP服务器。要与此服务器一起使用中间件,我们只需要用中间件功能包装原始处理程序。

有许多可用的第三方软件包可提供更高级的功能。 最受欢迎的是Gin,这是一个网络框架,它为构建Web应用程序提供了强大的工具。我们还用于组织杜松子网络帧。

gin 使用自定义上下文对象,而不是http.ResponseWriter和 *http.Request.Request对象。此上下文对象提供了其他功能,并允许中间件功能执行更高级的任务。

要在杜松子酒中添加中间件,我们可以使用gin.engine对象的使用()方法。这是我们如何将中间件添加到杜松子酒应用程序的示例:

package main

import (
 "fmt"
 "net/http"
 "time"

 "github.com/gin-gonic/gin"
)

func main() {
 r := gin.New()

 // Middleware 1 - Request validation
 r.Use(validateRequest)

 // Middleware 2 - Request tracing
 r.Use(traceRequest)

 // Middleware 3 - Security
 r.Use(secureRequest)

 // Middleware 4 - Authentication
 r.Use(authenticateRequest)

 // Login Endpoint
 r.POST("/login", login)

 if err := r.Run(":8080"); err != nil {
  fmt.Println("Failed to start server")
 }
}

func login(c *gin.Context) {
 // Authentication passed, do login logic
 c.JSON(http.StatusOK, gin.H{
  "message": "Logged in successfully",
 })
}

func validateRequest(c *gin.Context) {
 // Validate the request

 // Call the next middleware or endpoint handler
 c.Next()
}

func traceRequest(c *gin.Context) {
 // Do some request tracing before request is processed
 beforeRequest(c)

 // Call the next middleware or endpoint handler
 c.Next()

 // Do some request tracing after request is processed
 afterRequest(c)
}

func secureRequest(c *gin.Context) {
 // Add some security features to the request

 // Call the next middleware or endpoint handler
 c.Next()
}

func authenticateRequest(c *gin.Context) {
 // Authenticate the request

 // Call the next middleware or endpoint handler
 c.Next()
}

func beforeRequest(c *gin.Context) {
 start := time.Now()

 // Log the request start time
 fmt.Printf("Started %s %s\n", c.Request.Method, c.Request.URL.Path)

 // Add start time to the request context
 c.Set("startTime", start)
}

func afterRequest(c *gin.Context) {
 // Get the start time from the request context
 startTime, exists := c.Get("startTime")
 if !exists {
  startTime = time.Now()
 }

 // Calculate the request duration
 duration := time.Since(startTime.(time.Time))

 // Log the request completion time and duration
 fmt.Printf("Completed %s %s in %v\n", c.Request.Method, c.Request.URL.Path, duration)
}

在此示例中,我们使用使用()方法向我们的GIN应用程序添加了四个中间件功能。每个中间软件功能被定义为gin.handlerfunc,将gin.context对象作为参数。

我们使用use()方法添加中间件的顺序很重要。中间件功能按添加的顺序执行,因此以正确的顺序添加它们以确保达到所需的行为很重要。

在TracereQuest中间件中,我们添加了两个功能:beforeRequest和referQuest。我们首先调用beforeRequest函数在处理请求之前要进行一些跟踪。处理请求后,我们致电AfterRequest函数在处理请求后进行一些跟踪。

在beforrequest函数中,我们记录了请求的开始时间,然后将其添加到请求上下文中。内部inserrequest函数,我们从请求上下文中获取开始时间,计算请求持续时间,并记录完成时间和持续时间。

*序列图:
*

Image description

结论
在本文中,我们已经看到了中间件在GO中的工作方式,以及为什么在Web应用程序中使用它们很重要。我们还看到了一些常见的中间件用例,例如请求验证,请求跟踪,安全性和身份验证。通过使用中间件,我们可以编写模块化和可重复使用的代码,并在不更改核心逻辑的情况下轻松添加功能。

总而言之,如果您要在GO中构建Web应用程序,则中间件是一个重要的概念,您应该掌握改善代码的质量和安全性。

希望您发现这篇文章有助于理解中间件概念。如果您喜欢阅读本文,请喜欢这篇文章,并考虑关注我更多地进行编程教程。