Какие сетевые протоколы и стандарты используются при разработке бэкенд-сервисов?

Ответ

При разработке бэкенда используются различные протоколы и стандарты, каждый для своих задач. Важно различать транспортные протоколы и архитектурные стили/стандарты API.

Основные протоколы:

  • HTTP/HTTPS (HyperText Transfer Protocol/Secure): Основа веба. Работает по модели «запрос-ответ». Используется для большинства веб-сервисов и REST API.
    • HTTP/1.1: Классическая версия.
    • HTTP/2: Улучшенная версия с мультиплексированием запросов, что повышает производительность.
    • HTTP/3: Новейшая версия, работающая поверх протокола QUIC для еще меньших задержек.
  • WebSocket: Протокол для установления постоянного двустороннего соединения между клиентом и сервером. Идеален для real-time приложений: чатов, онлайн-игр, биржевых котировок.

Архитектурные стили и фреймворки API:

  • REST (Representational State Transfer): Архитектурный стиль, а не протокол. Обычно работает поверх HTTP. Использует стандартные HTTP-методы (GET, POST, PUT, DELETE) для работы с ресурсами.
  • gRPC (Google Remote Procedure Call): Высокопроизводительный фреймворк для удаленного вызова процедур от Google. Работает поверх HTTP/2 и использует Protocol Buffers для сериализации данных. Отлично подходит для коммуникации между микросервисами.
  • GraphQL: Язык запросов для API. Позволяет клиенту запрашивать только те данные, которые ему нужны, и получать их одним запросом. Работает поверх HTTP.

Пример простого HTTP-сервера на Go:

package main

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

// handler обрабатывает входящие HTTP-запросы.
func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, World!")
}

func main() {
    http.HandleFunc("/", handler)
    log.Println("Starting server on :8080")
    if err := http.ListenAndServe(":8080", nil); err != nil {
        log.Fatal(err)
    }
}

Ответ 18+ 🔞

Давай разберёмся, что у нас тут за протоколы понапиханы, а то иногда кажется, что это не бэкенд, а ёперный театр какой-то, где все друг на друга кричат на разных языках. Каждый для своих делишек, понимаешь?

Протоколы, блядь, транспортные:

  • HTTP/HTTPS (HyperText Transfer Protocol/Secure): Ну, это как наш фундамент, основа основ, на которой всё держится. Работает по принципу «спросил-ответили». Практически всё, что ты в браузере видишь, и большинство API на нём же и сидит.
    • HTTP/1.1: Старый добрый дед, классика жанра.
    • HTTP/2: Уже пошустрее, умный такой. Умеет несколько запросов в одну трубу пихать, чтобы быстрее было. Производительность, мать её, повышает.
    • HTTP/3: Совсем новенький, хипстер. Вообще на QUIC пересел, чтобы задержки ещё меньше были. Будущее, блядь, вот оно.
  • WebSocket: А это уже для болтовни в реальном времени. Не «спросил-ответили», а установил соединение и давай трепаться без остановки. Чисто для чатов, онлайн-игр или чтобы биржевые графики вживую показывать. Без него — никуда.

А теперь про стили API, тут вообще цирк:

  • REST (Representational State Transfer): Это не протокол даже, а такая архитектурная философия, блядь. Обычно на HTTP ездит. Всё у него — ресурсы. Хочешь получить? GET. Создать? POST. Обновить? PUT или PATCH. Удалить? Ну, DELETE, ясень пень. Всё чинно-благородно.
  • gRPC (Google Remote Procedure Call): Вот это уже тяжёлая артиллерия от Гугла. Высокопроизводительная штука для общения между сервисами, особенно когда их, этих микросервисов, овердохуища. Работает на HTTP/2, а данные сжимает в бинарный формат (Protocol Buffers). Быстрее пареной репы, но и заморочек больше.
  • GraphQL: А это вообще хитрая жопа. Язык запросов. Клиент сам решает, какие поля данных ему нужны, и получает всё одним махом, а не десятью запросами, как при REST. Удобно, но серверу под него подстраиваться надо — не каждый захочет.

Ну и куда же без примера кода, чтобы не быть голословным? Смотри, простейший сервак на Go:

package main

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

// handler обрабатывает входящие HTTP-запросы.
func handler(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Hello, World!")
}

func main() {
    http.HandleFunc("/", handler)
    log.Println("Starting server on :8080")
    if err := http.ListenAndServe(":8080", nil); err != nil {
        log.Fatal(err)
    }
}

Вот так вот, в двух словах. Главное — не путать, что для чего, а то получится каша, в рот меня чих-пых.