Расскажите о вашем опыте разработки на Go. В каких проектах вы участвовали?

Ответ

Мой опыт на Go включает разработку backend-систем различного типа. Вот несколько примеров проектов и использованных технологий:

  1. Разработка микросервисов:

    • Проект: Создание и поддержка набора микросервисов для e-commerce платформы (управление заказами, пользователями, платежами).
    • Технологии:
      • HTTP/API: Gin для создания RESTful API из-за его производительности и минималистичности.
      • Базы данных: PostgreSQL как основное хранилище, GORM для быстрого прототипирования и работы с БД.
      • Кэширование: Redis для кэширования сессий и часто запрашиваемых данных.
      • Взаимодействие: gRPC для эффективного межсервисного взаимодействия и RabbitMQ для асинхронных задач (отправка уведомлений, обработка отложенных операций).
  2. CLI-утилиты для автоматизации:

    • Проект: Разработка утилит командной строки для внутренних нужд: парсер логов, инструмент для миграции данных, генератор конфигурационных файлов.
    • Технологии: Cobra для построения мощного и удобного CLI-интерфейса, пакеты os, io для работы с файловой системой.
  3. Высоконагруженные real-time системы:

    • Проект: Участие в разработке WebSocket-сервера для обработки данных с IoT-устройств в режиме реального времени.
    • Технологии: gorilla/websocket для управления WebSocket-соединениями, каналы и горутины для параллельной обработки тысяч одновременных подключений.

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

package main

import (
    "net/http"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    r.GET("/ping", func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{"message": "pong"})
    })

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

Весь код разворачивался в Docker-контейнерах и управлялся через Kubernetes.

Ответ 18+ 🔞

Да ты посмотри, на что люди время тратят! Сидят, пишут резюме, как будто сводки с фронта: "разрабатывал микросервисы, использовал такие-то технологии". Ну, ладно, раз уж спросили, расскажу, как я с этим Гоу подружился, а то и повоевал местами, блядь.

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

Чем орудовал:

  • Для API — взял Gin. Ну, а че, шустрый, не грузный, прямо как хороший скальпель, а не тупой тесак. Написал r.GET("/ping") — и уже пинг-понг играет, красота.
  • Для базыPostgreSQL, куда ж без неё. А чтобы не писать эти INSERT INTO до посинения, взял GORM. Он, конечно, иногда такую магию выкидывает, что потом полдня дебажишь, но для скорости — то, что надо.
  • Чтобы не грузить всё подрядRedis. Сессии туда, какие-то горячие данные — всё летает, ебать его в сраку, как ошпаренный.
  • А самое весёлое — это чтобы сервисы между собой болтали. Для быстрого и строгого — gRPC. Ну, а когда нужно было что-то бросить в очередь и забыть (типа "эй, отправь потом письмо этому челу"), то RabbitMQ. Отправил задание — и свободен, пусть другие горутины разгребают.

Потом были разные CLI-шные утилитки. Ну, знаешь, такие консольные поделки, чтобы какую-то рутину автоматизировать. Тут без Cobra — вообще никуда. Сделал команду, флаги к ней — и уже почти профессиональная софтинка, хоть в продакшен выкладывай, блядь.

А один раз вляпался в real-time систему для этих ваших умных устройств, IoT, блядь. Тысячи подключений через WebSocket, данные сыпятся потоком. Тут уже gorilla/websocket в руки, горутинами размахиваешь, как Терминатор, чтобы всё успевать обрабатывать. Адреналин, конечно, но зато весело, ёпта.

И весь этот цирк, естественно, в Docker-контейнерах, а потом ещё и в Kubernetes засунули. Чтобы масштабировалось это всё красиво и падало тоже красиво, а не как попало.

Вот, к примеру, самый простой сервачок, с которого всё часто начинается. Смотри, ничего лишнего:

package main

import (
    "net/http"
    "github.com/gin-gonic/gin"
)

func main() {
    r := gin.Default()

    r.GET("/ping", func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{"message": "pong"})
    })

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

Написал, запустил — и он уже живой, сука! И ведь с этой простоты такие монстры потом вырастают, что диву даёшься. Вот так вот и кодишь, бывает, сидишь, и думаешь: "Ни хуя себе, а ведь работает".