← Назад к вопросам

Как используется middleware?

2.3 Middle🔥 252 комментариев
#Сетевые протоколы и API#Основы Go

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Middleware в Go: архитектура, паттерны и практическое применение

Middleware — это архитектурный паттерн, позволяющий организовать обработку HTTP-запросов через цепочку промежуточных обработчиков. В Go он особенно популярен благодаря стандартной библиотеке net/http и фреймворкам типа Gin или Echo.

Основная концепция

Middleware работает как декоратор (wrapper) для обработчиков HTTP (http.Handler). Он принимает http.Handler, возвращает новый http.Handler, который может:

  1. Выполнять логику до основного обработчика
  2. Передавать запрос основному обработчику
  3. Выполнять логику после основного обработчика
type Middleware func(http.Handler) http.Handler

Стандартный подход с net/http

func loggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        start := time.Now()
        log.Printf("Started %s %s", r.Method, r.URL.Path)
        
        next.ServeHTTP(w, r) // вызов основного обработчика
        
        log.Printf("Completed %s in %v", r.URL.Path, time.Since(start))
    })
}

func main() {
    handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte("Hello World"))
    })
    
    wrappedHandler := loggingMiddleware(handler)
    
    http.ListenAndServe(":8080", wrappedHandler)
}

Композиция middleware (цепочка)

func chainMiddleware(h http.Handler, middlewares ...Middleware) http.Handler {
    for _, m := range middlewares {
        h = m(h) // последовательное применение middleware
    }
    return h
}

func main() {
    handler := http.HandlerFunc(handleRequest)
    
    finalHandler := chainMiddleware(
        handler,
        loggingMiddleware,
        authMiddleware,
        rateLimitMiddleware,
    )
    
    http.Handle("/", finalHandler)
    http.ListenAndServe(":8080", nil)
}

Распространенные типы middleware

1. Логирование и трассировка

func tracingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        traceID := uuid.New().String()
        r.Header.Set("X-Trace-ID", traceID)
        w.Header().Set("X-Trace-ID", traceID)
        next.ServeHTTP(w, r)
    })
}

2. Аутентификация и авторизация

func authMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        token := r.Header.Get("Authorization")
        if !validateToken(token) {
            w.WriteHeader(http.StatusUnauthorized)
            return
        }
        
        // Добавляем данные пользователя в контекст
        ctx := context.WithValue