Ответ
Мой основной стек для backend-разработки строится вокруг языка Go и его экосистемы. Я группирую технологии по их назначению:
- Язык: Golang — за его производительность, простоту, строгую типизацию и отличную поддержку конкурентности.
- Базы данных:
- PostgreSQL: Как основная реляционная СУБД для хранения структурированных данных. Работал через стандартный
database/sqlи драйверlib/pqилиpgx. - Redis: Как in-memory хранилище для кэширования, очередей и управления сессиями.
- PostgreSQL: Как основная реляционная СУБД для хранения структурированных данных. Работал через стандартный
- API и сетевое взаимодействие:
- REST API: Проектирование и реализация с использованием фреймворка Gin или стандартной библиотеки
net/http. - gRPC: Для высокопроизводительного межсервисного взаимодействия в микросервисной архитектуре.
- REST API: Проектирование и реализация с использованием фреймворка Gin или стандартной библиотеки
- Инфраструктура и DevOps:
- Docker: Для контейнеризации приложений, что обеспечивает консистентность окружения.
- Kubernetes: Для оркестрации контейнеров, автоматического масштабирования и управления развертыванием.
- Библиотеки и ORM:
- GORM: Для упрощения работы с PostgreSQL, хотя в высоконагруженных системах предпочитаю
sqlxили чистыйdatabase/sqlдля большего контроля. - Viper: Для управления конфигурацией приложения.
- GORM: Для упрощения работы с PostgreSQL, хотя в высоконагруженных системах предпочитаю
Пример кода на Golang для работы с PostgreSQL (с pgx):
package main
import (
"context"
"fmt"
"os"
"github.com/jackc/pgx/v4"
)
func main() {
// Подключение к базе данных
connStr := "user=postgres dbname=test sslmode=disable"
conn, err := pgx.Connect(context.Background(), connStr)
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to connect to database: %vn", err)
os.Exit(1)
}
// Важно закрыть соединение
defer conn.Close(context.Background())
// Выполнение запроса с параметрами для защиты от SQL-инъекций
name := "Alice"
email := "alice@example.com"
_, err = conn.Exec(context.Background(), "INSERT INTO users (name, email) VALUES ($1, $2)", name, email)
if err != nil {
fmt.Fprintf(os.Stderr, "Exec failed: %vn", err)
os.Exit(1)
}
fmt.Println("Запись успешно добавлена!")
} Ответ 18+ 🔞
А, ну вот, смотри, я тебе сейчас свой стек разложу по полочкам, как в хорошем баре — что для чего и почему. Ты только не падай в обморок, там всё логично, хоть и звучит, как инвентарь сумасшедшего инженера.
Основной мой инструмент, на котором всё держится — это Golang. Ну, Go, короче. Почему? Да потому что он, блядь, быстрый как удар током, простой как три копейки, и с его конкурентностью можно такие штуки вытворять, что глаза на лоб лезут. И типизация строгая — не похулиганить.
Теперь, базы данных, без них нихуя.
- PostgreSQL — это мой тяжёлый артиллерийский калибр. Всё, что должно лежать ровно, структурировано и не сдохнуть — оно туда. Работаю либо через родной
database/sql, либо черезpgx, который вообще огонь. - Redis — это моя шустрая обезьянка в оперативке. Кэш, очереди, сессии — всё, что нужно сделать быстро-быстро, пока никто не видит. Мартышлюшка незаменимая.
Дальше, общение с внешним миром.
- REST API — тут либо на чистом
net/http, либо, если хочется чуть больше сахара, беру Gin. Чтобы всё по феншую, с роутингом и middleware. - gRPC — а это когда сервисы между собой на повышенных тонах общаться начинают. Микросервисы, высокая нагрузка — тут он царь и бог.
Инфраструктура, где всё это безобразие живёт.
- Docker — чтобы приложение, как преступник в изоляторе, сидело в своём контейнере и ни на что не влияло. Консистентность, ёпта!
- Kubernetes — а это уже начальник над этими самыми изоляторами. Чтобы они сами масштабировались, перезапускались и вообще вели себя прилично. Без него сейчас — как без штанов.
Библиотеки, без которых жить скучно.
- GORM — для быстрого прототипирования с PostgreSQL. Хотя, честно, на продакшене часто отказываюсь в пользу
sqlxили даже голого SQL. Контроль, блядь, важнее магии. - Viper — чтобы конфиги не раскидывались по всему проекту, как тараканы. Всё в одном месте, красиво и удобно.
А вот, смотри, кусочек кода, как я с Постгресом через pgx общаюсь. Никакой магии, всё честно.
package main
import (
"context"
"fmt"
"os"
"github.com/jackc/pgx/v4"
)
func main() {
// Подключение к базе данных
connStr := "user=postgres dbname=test sslmode=disable"
conn, err := pgx.Connect(context.Background(), connStr)
if err != nil {
fmt.Fprintf(os.Stderr, "Unable to connect to database: %vn", err)
os.Exit(1)
}
// Важно закрыть соединение
defer conn.Close(context.Background())
// Выполнение запроса с параметрами для защиты от SQL-инъекций
name := "Alice"
email := "alice@example.com"
_, err = conn.Exec(context.Background(), "INSERT INTO users (name, email) VALUES ($1, $2)", name, email)
if err != nil {
fmt.Fprintf(os.Stderr, "Exec failed: %vn", err)
os.Exit(1)
}
fmt.Println("Запись успешно добавлена!")
}
Вот примерно так, вся моя кухня. Ничего лишнего, но и голым не останешься. Главное — понимать, зачем каждый инструмент, а не просто тыкать в них, как обезьяна палкой.