Какие технологии использовал в работе

Ответ

В своей работе я активно использовал и имею опыт с широким спектром технологий, ориентированных на бэкенд-разработку, преимущественно на Golang:

  • Языки программирования:

    • Golang: Основной язык для разработки высокопроизводительных микросервисов и API.
    • Python: Использовался для написания вспомогательных скриптов, автоматизации задач и иногда для прототипирования.
  • Фреймворки и библиотеки (Go):

    • Веб-фреймворки: Gin, Echo (для построения RESTful API).
    • Микросервисы: gRPC (для высокопроизводительного межсервисного взаимодействия).
    • Работа с БД: pgx (для PostgreSQL), go-redis (для Redis), mongo-go-driver (для MongoDB).
  • Базы данных:

    • Реляционные: PostgreSQL (основная, для транзакционных данных).
    • NoSQL: Redis (для кеширования, очередей, сессий), MongoDB (для документ-ориентированных данных).
  • Очереди сообщений:

    • Kafka (sarama): Для высокопроизводительной обработки потоков данных и асинхронных операций.
    • RabbitMQ (streadway/amqp): Для надежной доставки сообщений и реализации паттернов типа Worker Queue.
  • Тестирование:

    • Юнит-тесты: Стандартный пакет testing.
    • Мокирование: gomock для создания моков интерфейсов.
    • Интеграционные тесты: testcontainers для запуска изолированных тестовых сред (например, БД в Docker-контейнерах).
  • Деплоймент и CI/CD:

    • Контейнеризация: Docker (для упаковки приложений).
    • Оркестрация: Kubernetes (развертывание и управление микросервисами, написание Helm-чартов).
    • CI/CD: GitLab CI (для автоматизации сборки, тестирования и деплоя).
  • Мониторинг и логирование:

    • Метрики: Prometheus (сбор и хранение метрик).
    • Визуализация: Grafana (построение дашбордов на основе метрик).
    • Трейсинг: OpenTelemetry (для распределенного трейсинга запросов между микросервисами).
    • Логирование: Структурированное логирование (например, с zap или logrus) с отправкой в централизованные системы (ELK Stack, Loki).

Пример кода (Gin + PostgreSQL):

package main

import (
    "database/sql"
    "log"
    "net/http"

    "github.com/gin-gonic/gin"
    _ "github.com/lib/pq" // Драйвер PostgreSQL
)

// User представляет модель пользователя
type User struct {
    ID    int    `json:"id"`
    Name  string `json:"name"`
    Email string `json:"email"`
}

// initDB инициализирует подключение к базе данных
func initDB() *sql.DB {
    connStr := "user=postgres password=postgres dbname=mydb sslmode=disable"
    db, err := sql.Open("postgres", connStr)
    if err != nil {
        log.Fatalf("Error opening database: %v", err)
    }
    if err = db.Ping(); err != nil {
        log.Fatalf("Error connecting to database: %v", err)
    }
    log.Println("Successfully connected to database!")
    return db
}

func main() {
    r := gin.Default()
    db := initDB()
    defer db.Close()

    r.GET("/users/:id", func(c *gin.Context) {
        var user User
        id := c.Param("id")

        // Пример запроса к БД
        err := db.QueryRow("SELECT id, name, email FROM users WHERE id=$1", id).Scan(&user.ID, &user.Name, &user.Email)
        if err == sql.ErrNoRows {
            c.JSON(http.StatusNotFound, gin.H{"error": "User not found"})
            return
        }
        if err != nil {
            c.JSON(http.StatusInternalServerError, gin.H{"error": err.Error()})
            return
        }
        c.JSON(http.StatusOK, user)
    })

    log.Fatal(r.Run(":8080")) // Запуск сервера на порту 8080
}