← Назад к вопросам
Как используется 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, который может:
- Выполнять логику до основного обработчика
- Передавать запрос основному обработчику
- Выполнять логику после основного обработчика
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