Как в Go создать HTTP-сервер и каковы его основные компоненты?

Ответ

В Go создание HTTP-сервера осуществляется с помощью встроенного пакета net/http. Это одна из самых сильных сторон стандартной библиотеки языка.

Основные компоненты:

  1. Обработчик (Handler): Функция или структура, которая обрабатывает HTTP-запросы. Она принимает два аргумента:

    • http.ResponseWriter: интерфейс для записи ответа клиенту (заголовки, статус-код, тело ответа).
    • *http.Request: структура, содержащая всю информацию о входящем запросе (метод, URL, заголовки, тело запроса).

  2. Мультиплексор (ServeMux): Роутер, который сопоставляет URL входящего запроса с соответствующим обработчиком.



  3. Сервер (Server): Структура, которая слушает TCP-соединения и передает их мультиплексору.


Пример простого сервера:

package main

import (
    "fmt"
    "log"
    "net/http"
)

// handler - наша функция-обработчик для пути "/"
func handler(w http.ResponseWriter, r *http.Request) {
    // Записываем тело ответа
    fmt.Fprintf(w, "Hello, World! You've requested: %sn", r.URL.Path)
}

func main() {
    // Регистрируем наш обработчик для всех запросов к пути "/"
    // на стандартном мультиплексоре (DefaultServeMux).
    http.HandleFunc("/", handler)

    // Запускаем сервер на порту 8080.
    // Второй аргумент 'nil' означает, что используется DefaultServeMux.
    log.Println("Starting server on :8080")
    err := http.ListenAndServe(":8080", nil)
    if err != nil {
        log.Fatal("ListenAndServe: ", err)
    }
}

Ключевые моменты и лучшие практики:

  • http.ListenAndServe: Простая функция для запуска сервера. Для production-окружения рекомендуется создавать экземпляр http.Server вручную, чтобы настроить таймауты (ReadTimeout, WriteTimeout, IdleTimeout) для защиты от атак типа Slowloris.
  • Роутинг: Для сложных приложений стандартного ServeMux может быть недостаточно. Часто используются сторонние роутеры, такие как chi, gin или gorilla/mux, которые предоставляют больше возможностей (параметры в URL, middleware, группы роутов).
  • Middleware: Это функции-обертки, которые выполняют сквозную логику (логирование, аутентификация, сжатие) до или после основного обработчика.
  • HTTP/2: Сервер Go автоматически использует HTTP/2, если клиент его поддерживает и соединение защищено с помощью TLS.